
/*
 * Copyright (C) 2015-2026 Valve Corporation
 * Copyright (C) 2015-2026 LunarG, Inc.
 * Copyright (C) 2023-2024 RasterGrid Kft.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * Authors:
 * - Ziga Markus <ziga@lunarg.com>
 * - Christophe Riccio <christophe@lunarg.com>
 * - Mark Lobodzinski <mark@lunarg.com>
 * - Mike Weiblen
 * - Arda Coskunses
 * - Jeremy Kniager

 * This file is ***GENERATED***.  Do Not Edit.
 * See scripts/gen_profiles_layer.py for modifications.
 */

/*
 * layer/profiles.cpp - The VK_LAYER_KHRONOS_profiles layer.
 * This Profiles layer simulates a device by loading a JSON configuration file to override values that would normally be returned
 * from a Vulkan implementation.  Configuration files must validate with the Profiles schema; this layer does not redundantly
 * check for configuration errors that would be caught by schema validation.
 *
 * References (several documents are also included in the LunarG Vulkan SDK, see [SDK]):
 * [SPEC]   https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html
 * [SDK]    https://vulkan.lunarg.com/sdk/home
 * [LALI]   https://github.com/KhronosGroup/Vulkan-Loader/blob/main/loader/LoaderAndLayerInterface.md
 *
 * Misc notes:
 * This code generally follows the spirit of the Google C++ styleguide, while accommodating conventions of the Vulkan styleguide.
 * https://google.github.io/styleguide/cppguide.html
 * https://www.khronos.org/registry/vulkan/specs/1.1/styleguide.html
 */

#include "profiles.h"
#include "profiles_util.h"
#include "profiles_json.h"
#include "profiles_settings.h"
#include <algorithm>
#include <filesystem>
#include <functional>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <optional>

namespace fs = std::filesystem;

SimulateCapabilityFlags GetSimulateCapabilityFlags(const std::vector<std::string> &values) {
    SimulateCapabilityFlags result = 0;

    for (std::size_t i = 0, n = values.size(); i < n; ++i) {
        if (values[i] == "SIMULATE_API_VERSION_BIT") {
            result |= SIMULATE_API_VERSION_BIT;
        } else if (values[i] == "SIMULATE_FEATURES_BIT") {
            result |= SIMULATE_FEATURES_BIT;
        } else if (values[i] == "SIMULATE_PROPERTIES_BIT") {
            result |= SIMULATE_PROPERTIES_BIT;
        } else if (values[i] == "SIMULATE_EXTENSIONS_BIT") {
            result |= SIMULATE_EXTENSIONS_BIT;
        } else if (values[i] == "SIMULATE_FORMATS_BIT") {
            result |= SIMULATE_FORMATS_BIT;
        } else if (values[i] == "SIMULATE_QUEUE_FAMILY_PROPERTIES_BIT") {
            result |= SIMULATE_QUEUE_FAMILY_PROPERTIES_BIT;
        } else if (values[i] == "SIMULATE_VIDEO_CAPABILITIES_BIT") {
            result |= SIMULATE_VIDEO_CAPABILITIES_BIT;
        } else if (values[i] == "SIMULATE_VIDEO_FORMATS_BIT") {
            result |= SIMULATE_VIDEO_FORMATS_BIT;
        } else if (values[i] == "SIMULATE_MAX_ENUM") {
            result |= SIMULATE_MAX_ENUM;
        }
    }

    return result;
}

std::string GetSimulateCapabilitiesLog(SimulateCapabilityFlags flags) {
    std::string result = {};

    if (flags & SIMULATE_API_VERSION_BIT) {
        result += "SIMULATE_API_VERSION_BIT";
    }
    if (flags & SIMULATE_FEATURES_BIT) {
        if (!result.empty()) result += ", ";
        result += "SIMULATE_FEATURES_BIT";
    }
    if (flags & SIMULATE_PROPERTIES_BIT) {
        if (!result.empty()) result += ", ";
        result += "SIMULATE_PROPERTIES_BIT";
    }
    if (flags & SIMULATE_EXTENSIONS_BIT) {
        if (!result.empty()) result += ", ";
        result += "SIMULATE_EXTENSIONS_BIT";
    }
    if (flags & SIMULATE_FORMATS_BIT) {
        if (!result.empty()) result += ", ";
        result += "SIMULATE_FORMATS_BIT";
    }
    if (flags & SIMULATE_QUEUE_FAMILY_PROPERTIES_BIT) {
        if (!result.empty()) result += ", ";
        result += "SIMULATE_QUEUE_FAMILY_PROPERTIES_BIT";
    }
    if (flags & SIMULATE_VIDEO_CAPABILITIES_BIT) {
        if (!result.empty()) result += ", ";
        result += "SIMULATE_VIDEO_CAPABILITIES_BIT";
    }
    if (flags & SIMULATE_VIDEO_FORMATS_BIT) {
        if (!result.empty()) result += ", ";
        result += "SIMULATE_VIDEO_FORMATS_BIT";
    }

    return result;
}

std::string GetDebugReportsLog(DebugActionFlags flags) {
    std::string result = {};

    if (flags & DEBUG_REPORT_NOTIFICATION_BIT) {
        result += "DEBUG_REPORT_NOTIFICATION_BIT";
    }
    if (flags & DEBUG_REPORT_WARNING_BIT) {
        if (!result.empty()) result += ", ";
        result += "DEBUG_REPORT_WARNING_BIT";
    }
    if (flags & DEBUG_REPORT_ERROR_BIT) {
        if (!result.empty()) result += ", ";
        result += "DEBUG_REPORT_ERROR_BIT";
    }
    if (flags & DEBUG_REPORT_DEBUG_BIT) {
        if (!result.empty()) result += ", ";
        result += "DEBUG_REPORT_DEBUG_BIT";
    }

    return result;
}

std::string GetFormatFeatureString(VkFormatFeatureFlags flags) {
    std::string result = {};

    if (flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
        result += "VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_BLIT_SRC_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_BLIT_DST_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_TRANSFER_SRC_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_TRANSFER_DST_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_DISJOINT_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_DISJOINT_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_VIDEO_DECODE_OUTPUT_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_VIDEO_DECODE_OUTPUT_BIT_KHR";
    }
    if (flags & VK_FORMAT_FEATURE_VIDEO_DECODE_DPB_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_VIDEO_DECODE_DPB_BIT_KHR";
    }
    if (flags & VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR";
    }
    if (flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT";
    }
    if (flags & VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT";
    }
    if (flags & VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR";
    }
    if (flags & VK_FORMAT_FEATURE_VIDEO_ENCODE_INPUT_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_VIDEO_ENCODE_INPUT_BIT_KHR";
    }
    if (flags & VK_FORMAT_FEATURE_VIDEO_ENCODE_DPB_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_VIDEO_ENCODE_DPB_BIT_KHR";
    }

    return result;
}

std::string GetFormatFeature2String(VkFormatFeatureFlags2 flags) {
    std::string result = {};

    if (flags & VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT) {
        result += "VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_ATOMIC_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_BLIT_SRC_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_BLIT_SRC_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_BLIT_DST_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_BLIT_DST_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_MIDPOINT_CHROMA_SAMPLES_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_MIDPOINT_CHROMA_SAMPLES_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_DISJOINT_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_DISJOINT_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_COSITED_CHROMA_SAMPLES_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_COSITED_CHROMA_SAMPLES_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_CUBIC_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_CUBIC_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT";
    }
    if (flags & VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR";
    }
    if (flags & VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR";
    }
    if (flags & VK_FORMAT_FEATURE_2_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR";
    }
    if (flags & VK_FORMAT_FEATURE_2_FRAGMENT_DENSITY_MAP_BIT_EXT) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_FRAGMENT_DENSITY_MAP_BIT_EXT";
    }
    if (flags & VK_FORMAT_FEATURE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR";
    }
    if (flags & VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR";
    }
    if (flags & VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR";
    }
    if (flags & VK_FORMAT_FEATURE_2_BLOCK_MATCHING_SXD_BIT_QCOM) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_BLOCK_MATCHING_SXD_BIT_QCOM";
    }
    if (flags & VK_FORMAT_FEATURE_2_ACCELERATION_STRUCTURE_RADIUS_BUFFER_BIT_NV) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_ACCELERATION_STRUCTURE_RADIUS_BUFFER_BIT_NV";
    }
    if (flags & VK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV";
    }
    if (flags & VK_FORMAT_FEATURE_2_WEIGHT_IMAGE_BIT_QCOM) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_WEIGHT_IMAGE_BIT_QCOM";
    }
    if (flags & VK_FORMAT_FEATURE_2_WEIGHT_SAMPLED_IMAGE_BIT_QCOM) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_WEIGHT_SAMPLED_IMAGE_BIT_QCOM";
    }
    if (flags & VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM";
    }
    if (flags & VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM";
    }
    if (flags & VK_FORMAT_FEATURE_2_TENSOR_SHADER_BIT_ARM) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_TENSOR_SHADER_BIT_ARM";
    }
    if (flags & VK_FORMAT_FEATURE_2_TENSOR_IMAGE_ALIASING_BIT_ARM) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_TENSOR_IMAGE_ALIASING_BIT_ARM";
    }
    if (flags & VK_FORMAT_FEATURE_2_OPTICAL_FLOW_IMAGE_BIT_NV) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_OPTICAL_FLOW_IMAGE_BIT_NV";
    }
    if (flags & VK_FORMAT_FEATURE_2_OPTICAL_FLOW_VECTOR_BIT_NV) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_OPTICAL_FLOW_VECTOR_BIT_NV";
    }
    if (flags & VK_FORMAT_FEATURE_2_OPTICAL_FLOW_COST_BIT_NV) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_OPTICAL_FLOW_COST_BIT_NV";
    }
    if (flags & VK_FORMAT_FEATURE_2_TENSOR_DATA_GRAPH_BIT_ARM) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_TENSOR_DATA_GRAPH_BIT_ARM";
    }
    if (flags & VK_FORMAT_FEATURE_2_COPY_IMAGE_INDIRECT_DST_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_COPY_IMAGE_INDIRECT_DST_BIT_KHR";
    }
    if (flags & VK_FORMAT_FEATURE_2_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR";
    }
    if (flags & VK_FORMAT_FEATURE_2_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR";
    }
    if (flags & VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_2D_BIT_IMG) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_2D_BIT_IMG";
    }
    if (flags & VK_FORMAT_FEATURE_2_DEPTH_COPY_ON_COMPUTE_QUEUE_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_DEPTH_COPY_ON_COMPUTE_QUEUE_BIT_KHR";
    }
    if (flags & VK_FORMAT_FEATURE_2_DEPTH_COPY_ON_TRANSFER_QUEUE_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_DEPTH_COPY_ON_TRANSFER_QUEUE_BIT_KHR";
    }
    if (flags & VK_FORMAT_FEATURE_2_STENCIL_COPY_ON_COMPUTE_QUEUE_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_STENCIL_COPY_ON_COMPUTE_QUEUE_BIT_KHR";
    }
    if (flags & VK_FORMAT_FEATURE_2_STENCIL_COPY_ON_TRANSFER_QUEUE_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_STENCIL_COPY_ON_TRANSFER_QUEUE_BIT_KHR";
    }
    if (flags & VK_FORMAT_FEATURE_2_DATA_GRAPH_OPTICAL_FLOW_IMAGE_BIT_ARM) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_DATA_GRAPH_OPTICAL_FLOW_IMAGE_BIT_ARM";
    }
    if (flags & VK_FORMAT_FEATURE_2_DATA_GRAPH_OPTICAL_FLOW_VECTOR_BIT_ARM) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_DATA_GRAPH_OPTICAL_FLOW_VECTOR_BIT_ARM";
    }
    if (flags & VK_FORMAT_FEATURE_2_DATA_GRAPH_OPTICAL_FLOW_COST_BIT_ARM) {
        if (!result.empty()) result += ", ";
        result += "VK_FORMAT_FEATURE_2_DATA_GRAPH_OPTICAL_FLOW_COST_BIT_ARM";
    }

    return result;
}

std::string GetQueueFlagsToString(VkQueueFlags flags) {
    std::string result = {};

    if (flags & VK_QUEUE_GRAPHICS_BIT) {
        result += "VK_QUEUE_GRAPHICS_BIT";
    }
    if (flags & VK_QUEUE_COMPUTE_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_QUEUE_COMPUTE_BIT";
    }
    if (flags & VK_QUEUE_TRANSFER_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_QUEUE_TRANSFER_BIT";
    }
    if (flags & VK_QUEUE_SPARSE_BINDING_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_QUEUE_SPARSE_BINDING_BIT";
    }
    if (flags & VK_QUEUE_PROTECTED_BIT) {
        if (!result.empty()) result += ", ";
        result += "VK_QUEUE_PROTECTED_BIT";
    }
    if (flags & VK_QUEUE_VIDEO_DECODE_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_QUEUE_VIDEO_DECODE_BIT_KHR";
    }
    if (flags & VK_QUEUE_VIDEO_ENCODE_BIT_KHR) {
        if (!result.empty()) result += ", ";
        result += "VK_QUEUE_VIDEO_ENCODE_BIT_KHR";
    }
    if (flags & VK_QUEUE_OPTICAL_FLOW_BIT_NV) {
        if (!result.empty()) result += ", ";
        result += "VK_QUEUE_OPTICAL_FLOW_BIT_NV";
    }
    if (flags & VK_QUEUE_DATA_GRAPH_BIT_ARM) {
        if (!result.empty()) result += ", ";
        result += "VK_QUEUE_DATA_GRAPH_BIT_ARM";
    }

    return result;
}

std::string vkFormatToString(VkFormat fmt) {
    switch (fmt) {
        case VK_FORMAT_UNDEFINED:
            return "VK_FORMAT_UNDEFINED";
        case VK_FORMAT_R4G4_UNORM_PACK8:
            return "VK_FORMAT_R4G4_UNORM_PACK8";
        case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
            return "VK_FORMAT_R4G4B4A4_UNORM_PACK16";
        case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
            return "VK_FORMAT_B4G4R4A4_UNORM_PACK16";
        case VK_FORMAT_R5G6B5_UNORM_PACK16:
            return "VK_FORMAT_R5G6B5_UNORM_PACK16";
        case VK_FORMAT_B5G6R5_UNORM_PACK16:
            return "VK_FORMAT_B5G6R5_UNORM_PACK16";
        case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
            return "VK_FORMAT_R5G5B5A1_UNORM_PACK16";
        case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
            return "VK_FORMAT_B5G5R5A1_UNORM_PACK16";
        case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
            return "VK_FORMAT_A1R5G5B5_UNORM_PACK16";
        case VK_FORMAT_R8_UNORM:
            return "VK_FORMAT_R8_UNORM";
        case VK_FORMAT_R8_SNORM:
            return "VK_FORMAT_R8_SNORM";
        case VK_FORMAT_R8_USCALED:
            return "VK_FORMAT_R8_USCALED";
        case VK_FORMAT_R8_SSCALED:
            return "VK_FORMAT_R8_SSCALED";
        case VK_FORMAT_R8_UINT:
            return "VK_FORMAT_R8_UINT";
        case VK_FORMAT_R8_SINT:
            return "VK_FORMAT_R8_SINT";
        case VK_FORMAT_R8_SRGB:
            return "VK_FORMAT_R8_SRGB";
        case VK_FORMAT_R8G8_UNORM:
            return "VK_FORMAT_R8G8_UNORM";
        case VK_FORMAT_R8G8_SNORM:
            return "VK_FORMAT_R8G8_SNORM";
        case VK_FORMAT_R8G8_USCALED:
            return "VK_FORMAT_R8G8_USCALED";
        case VK_FORMAT_R8G8_SSCALED:
            return "VK_FORMAT_R8G8_SSCALED";
        case VK_FORMAT_R8G8_UINT:
            return "VK_FORMAT_R8G8_UINT";
        case VK_FORMAT_R8G8_SINT:
            return "VK_FORMAT_R8G8_SINT";
        case VK_FORMAT_R8G8_SRGB:
            return "VK_FORMAT_R8G8_SRGB";
        case VK_FORMAT_R8G8B8_UNORM:
            return "VK_FORMAT_R8G8B8_UNORM";
        case VK_FORMAT_R8G8B8_SNORM:
            return "VK_FORMAT_R8G8B8_SNORM";
        case VK_FORMAT_R8G8B8_USCALED:
            return "VK_FORMAT_R8G8B8_USCALED";
        case VK_FORMAT_R8G8B8_SSCALED:
            return "VK_FORMAT_R8G8B8_SSCALED";
        case VK_FORMAT_R8G8B8_UINT:
            return "VK_FORMAT_R8G8B8_UINT";
        case VK_FORMAT_R8G8B8_SINT:
            return "VK_FORMAT_R8G8B8_SINT";
        case VK_FORMAT_R8G8B8_SRGB:
            return "VK_FORMAT_R8G8B8_SRGB";
        case VK_FORMAT_B8G8R8_UNORM:
            return "VK_FORMAT_B8G8R8_UNORM";
        case VK_FORMAT_B8G8R8_SNORM:
            return "VK_FORMAT_B8G8R8_SNORM";
        case VK_FORMAT_B8G8R8_USCALED:
            return "VK_FORMAT_B8G8R8_USCALED";
        case VK_FORMAT_B8G8R8_SSCALED:
            return "VK_FORMAT_B8G8R8_SSCALED";
        case VK_FORMAT_B8G8R8_UINT:
            return "VK_FORMAT_B8G8R8_UINT";
        case VK_FORMAT_B8G8R8_SINT:
            return "VK_FORMAT_B8G8R8_SINT";
        case VK_FORMAT_B8G8R8_SRGB:
            return "VK_FORMAT_B8G8R8_SRGB";
        case VK_FORMAT_R8G8B8A8_UNORM:
            return "VK_FORMAT_R8G8B8A8_UNORM";
        case VK_FORMAT_R8G8B8A8_SNORM:
            return "VK_FORMAT_R8G8B8A8_SNORM";
        case VK_FORMAT_R8G8B8A8_USCALED:
            return "VK_FORMAT_R8G8B8A8_USCALED";
        case VK_FORMAT_R8G8B8A8_SSCALED:
            return "VK_FORMAT_R8G8B8A8_SSCALED";
        case VK_FORMAT_R8G8B8A8_UINT:
            return "VK_FORMAT_R8G8B8A8_UINT";
        case VK_FORMAT_R8G8B8A8_SINT:
            return "VK_FORMAT_R8G8B8A8_SINT";
        case VK_FORMAT_R8G8B8A8_SRGB:
            return "VK_FORMAT_R8G8B8A8_SRGB";
        case VK_FORMAT_B8G8R8A8_UNORM:
            return "VK_FORMAT_B8G8R8A8_UNORM";
        case VK_FORMAT_B8G8R8A8_SNORM:
            return "VK_FORMAT_B8G8R8A8_SNORM";
        case VK_FORMAT_B8G8R8A8_USCALED:
            return "VK_FORMAT_B8G8R8A8_USCALED";
        case VK_FORMAT_B8G8R8A8_SSCALED:
            return "VK_FORMAT_B8G8R8A8_SSCALED";
        case VK_FORMAT_B8G8R8A8_UINT:
            return "VK_FORMAT_B8G8R8A8_UINT";
        case VK_FORMAT_B8G8R8A8_SINT:
            return "VK_FORMAT_B8G8R8A8_SINT";
        case VK_FORMAT_B8G8R8A8_SRGB:
            return "VK_FORMAT_B8G8R8A8_SRGB";
        case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
            return "VK_FORMAT_A8B8G8R8_UNORM_PACK32";
        case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
            return "VK_FORMAT_A8B8G8R8_SNORM_PACK32";
        case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
            return "VK_FORMAT_A8B8G8R8_USCALED_PACK32";
        case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
            return "VK_FORMAT_A8B8G8R8_SSCALED_PACK32";
        case VK_FORMAT_A8B8G8R8_UINT_PACK32:
            return "VK_FORMAT_A8B8G8R8_UINT_PACK32";
        case VK_FORMAT_A8B8G8R8_SINT_PACK32:
            return "VK_FORMAT_A8B8G8R8_SINT_PACK32";
        case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
            return "VK_FORMAT_A8B8G8R8_SRGB_PACK32";
        case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
            return "VK_FORMAT_A2R10G10B10_UNORM_PACK32";
        case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
            return "VK_FORMAT_A2R10G10B10_SNORM_PACK32";
        case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
            return "VK_FORMAT_A2R10G10B10_USCALED_PACK32";
        case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
            return "VK_FORMAT_A2R10G10B10_SSCALED_PACK32";
        case VK_FORMAT_A2R10G10B10_UINT_PACK32:
            return "VK_FORMAT_A2R10G10B10_UINT_PACK32";
        case VK_FORMAT_A2R10G10B10_SINT_PACK32:
            return "VK_FORMAT_A2R10G10B10_SINT_PACK32";
        case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
            return "VK_FORMAT_A2B10G10R10_UNORM_PACK32";
        case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
            return "VK_FORMAT_A2B10G10R10_SNORM_PACK32";
        case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
            return "VK_FORMAT_A2B10G10R10_USCALED_PACK32";
        case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
            return "VK_FORMAT_A2B10G10R10_SSCALED_PACK32";
        case VK_FORMAT_A2B10G10R10_UINT_PACK32:
            return "VK_FORMAT_A2B10G10R10_UINT_PACK32";
        case VK_FORMAT_A2B10G10R10_SINT_PACK32:
            return "VK_FORMAT_A2B10G10R10_SINT_PACK32";
        case VK_FORMAT_R16_UNORM:
            return "VK_FORMAT_R16_UNORM";
        case VK_FORMAT_R16_SNORM:
            return "VK_FORMAT_R16_SNORM";
        case VK_FORMAT_R16_USCALED:
            return "VK_FORMAT_R16_USCALED";
        case VK_FORMAT_R16_SSCALED:
            return "VK_FORMAT_R16_SSCALED";
        case VK_FORMAT_R16_UINT:
            return "VK_FORMAT_R16_UINT";
        case VK_FORMAT_R16_SINT:
            return "VK_FORMAT_R16_SINT";
        case VK_FORMAT_R16_SFLOAT:
            return "VK_FORMAT_R16_SFLOAT";
        case VK_FORMAT_R16G16_UNORM:
            return "VK_FORMAT_R16G16_UNORM";
        case VK_FORMAT_R16G16_SNORM:
            return "VK_FORMAT_R16G16_SNORM";
        case VK_FORMAT_R16G16_USCALED:
            return "VK_FORMAT_R16G16_USCALED";
        case VK_FORMAT_R16G16_SSCALED:
            return "VK_FORMAT_R16G16_SSCALED";
        case VK_FORMAT_R16G16_UINT:
            return "VK_FORMAT_R16G16_UINT";
        case VK_FORMAT_R16G16_SINT:
            return "VK_FORMAT_R16G16_SINT";
        case VK_FORMAT_R16G16_SFLOAT:
            return "VK_FORMAT_R16G16_SFLOAT";
        case VK_FORMAT_R16G16B16_UNORM:
            return "VK_FORMAT_R16G16B16_UNORM";
        case VK_FORMAT_R16G16B16_SNORM:
            return "VK_FORMAT_R16G16B16_SNORM";
        case VK_FORMAT_R16G16B16_USCALED:
            return "VK_FORMAT_R16G16B16_USCALED";
        case VK_FORMAT_R16G16B16_SSCALED:
            return "VK_FORMAT_R16G16B16_SSCALED";
        case VK_FORMAT_R16G16B16_UINT:
            return "VK_FORMAT_R16G16B16_UINT";
        case VK_FORMAT_R16G16B16_SINT:
            return "VK_FORMAT_R16G16B16_SINT";
        case VK_FORMAT_R16G16B16_SFLOAT:
            return "VK_FORMAT_R16G16B16_SFLOAT";
        case VK_FORMAT_R16G16B16A16_UNORM:
            return "VK_FORMAT_R16G16B16A16_UNORM";
        case VK_FORMAT_R16G16B16A16_SNORM:
            return "VK_FORMAT_R16G16B16A16_SNORM";
        case VK_FORMAT_R16G16B16A16_USCALED:
            return "VK_FORMAT_R16G16B16A16_USCALED";
        case VK_FORMAT_R16G16B16A16_SSCALED:
            return "VK_FORMAT_R16G16B16A16_SSCALED";
        case VK_FORMAT_R16G16B16A16_UINT:
            return "VK_FORMAT_R16G16B16A16_UINT";
        case VK_FORMAT_R16G16B16A16_SINT:
            return "VK_FORMAT_R16G16B16A16_SINT";
        case VK_FORMAT_R16G16B16A16_SFLOAT:
            return "VK_FORMAT_R16G16B16A16_SFLOAT";
        case VK_FORMAT_R32_UINT:
            return "VK_FORMAT_R32_UINT";
        case VK_FORMAT_R32_SINT:
            return "VK_FORMAT_R32_SINT";
        case VK_FORMAT_R32_SFLOAT:
            return "VK_FORMAT_R32_SFLOAT";
        case VK_FORMAT_R32G32_UINT:
            return "VK_FORMAT_R32G32_UINT";
        case VK_FORMAT_R32G32_SINT:
            return "VK_FORMAT_R32G32_SINT";
        case VK_FORMAT_R32G32_SFLOAT:
            return "VK_FORMAT_R32G32_SFLOAT";
        case VK_FORMAT_R32G32B32_UINT:
            return "VK_FORMAT_R32G32B32_UINT";
        case VK_FORMAT_R32G32B32_SINT:
            return "VK_FORMAT_R32G32B32_SINT";
        case VK_FORMAT_R32G32B32_SFLOAT:
            return "VK_FORMAT_R32G32B32_SFLOAT";
        case VK_FORMAT_R32G32B32A32_UINT:
            return "VK_FORMAT_R32G32B32A32_UINT";
        case VK_FORMAT_R32G32B32A32_SINT:
            return "VK_FORMAT_R32G32B32A32_SINT";
        case VK_FORMAT_R32G32B32A32_SFLOAT:
            return "VK_FORMAT_R32G32B32A32_SFLOAT";
        case VK_FORMAT_R64_UINT:
            return "VK_FORMAT_R64_UINT";
        case VK_FORMAT_R64_SINT:
            return "VK_FORMAT_R64_SINT";
        case VK_FORMAT_R64_SFLOAT:
            return "VK_FORMAT_R64_SFLOAT";
        case VK_FORMAT_R64G64_UINT:
            return "VK_FORMAT_R64G64_UINT";
        case VK_FORMAT_R64G64_SINT:
            return "VK_FORMAT_R64G64_SINT";
        case VK_FORMAT_R64G64_SFLOAT:
            return "VK_FORMAT_R64G64_SFLOAT";
        case VK_FORMAT_R64G64B64_UINT:
            return "VK_FORMAT_R64G64B64_UINT";
        case VK_FORMAT_R64G64B64_SINT:
            return "VK_FORMAT_R64G64B64_SINT";
        case VK_FORMAT_R64G64B64_SFLOAT:
            return "VK_FORMAT_R64G64B64_SFLOAT";
        case VK_FORMAT_R64G64B64A64_UINT:
            return "VK_FORMAT_R64G64B64A64_UINT";
        case VK_FORMAT_R64G64B64A64_SINT:
            return "VK_FORMAT_R64G64B64A64_SINT";
        case VK_FORMAT_R64G64B64A64_SFLOAT:
            return "VK_FORMAT_R64G64B64A64_SFLOAT";
        case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
            return "VK_FORMAT_B10G11R11_UFLOAT_PACK32";
        case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
            return "VK_FORMAT_E5B9G9R9_UFLOAT_PACK32";
        case VK_FORMAT_D16_UNORM:
            return "VK_FORMAT_D16_UNORM";
        case VK_FORMAT_X8_D24_UNORM_PACK32:
            return "VK_FORMAT_X8_D24_UNORM_PACK32";
        case VK_FORMAT_D32_SFLOAT:
            return "VK_FORMAT_D32_SFLOAT";
        case VK_FORMAT_S8_UINT:
            return "VK_FORMAT_S8_UINT";
        case VK_FORMAT_D16_UNORM_S8_UINT:
            return "VK_FORMAT_D16_UNORM_S8_UINT";
        case VK_FORMAT_D24_UNORM_S8_UINT:
            return "VK_FORMAT_D24_UNORM_S8_UINT";
        case VK_FORMAT_D32_SFLOAT_S8_UINT:
            return "VK_FORMAT_D32_SFLOAT_S8_UINT";
        case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
            return "VK_FORMAT_BC1_RGB_UNORM_BLOCK";
        case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
            return "VK_FORMAT_BC1_RGB_SRGB_BLOCK";
        case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
            return "VK_FORMAT_BC1_RGBA_UNORM_BLOCK";
        case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
            return "VK_FORMAT_BC1_RGBA_SRGB_BLOCK";
        case VK_FORMAT_BC2_UNORM_BLOCK:
            return "VK_FORMAT_BC2_UNORM_BLOCK";
        case VK_FORMAT_BC2_SRGB_BLOCK:
            return "VK_FORMAT_BC2_SRGB_BLOCK";
        case VK_FORMAT_BC3_UNORM_BLOCK:
            return "VK_FORMAT_BC3_UNORM_BLOCK";
        case VK_FORMAT_BC3_SRGB_BLOCK:
            return "VK_FORMAT_BC3_SRGB_BLOCK";
        case VK_FORMAT_BC4_UNORM_BLOCK:
            return "VK_FORMAT_BC4_UNORM_BLOCK";
        case VK_FORMAT_BC4_SNORM_BLOCK:
            return "VK_FORMAT_BC4_SNORM_BLOCK";
        case VK_FORMAT_BC5_UNORM_BLOCK:
            return "VK_FORMAT_BC5_UNORM_BLOCK";
        case VK_FORMAT_BC5_SNORM_BLOCK:
            return "VK_FORMAT_BC5_SNORM_BLOCK";
        case VK_FORMAT_BC6H_UFLOAT_BLOCK:
            return "VK_FORMAT_BC6H_UFLOAT_BLOCK";
        case VK_FORMAT_BC6H_SFLOAT_BLOCK:
            return "VK_FORMAT_BC6H_SFLOAT_BLOCK";
        case VK_FORMAT_BC7_UNORM_BLOCK:
            return "VK_FORMAT_BC7_UNORM_BLOCK";
        case VK_FORMAT_BC7_SRGB_BLOCK:
            return "VK_FORMAT_BC7_SRGB_BLOCK";
        case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
            return "VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK";
        case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
            return "VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK";
        case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
            return "VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK";
        case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
            return "VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK";
        case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
            return "VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK";
        case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
            return "VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK";
        case VK_FORMAT_EAC_R11_UNORM_BLOCK:
            return "VK_FORMAT_EAC_R11_UNORM_BLOCK";
        case VK_FORMAT_EAC_R11_SNORM_BLOCK:
            return "VK_FORMAT_EAC_R11_SNORM_BLOCK";
        case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
            return "VK_FORMAT_EAC_R11G11_UNORM_BLOCK";
        case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
            return "VK_FORMAT_EAC_R11G11_SNORM_BLOCK";
        case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
            return "VK_FORMAT_ASTC_4x4_UNORM_BLOCK";
        case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
            return "VK_FORMAT_ASTC_4x4_SRGB_BLOCK";
        case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
            return "VK_FORMAT_ASTC_5x4_UNORM_BLOCK";
        case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
            return "VK_FORMAT_ASTC_5x4_SRGB_BLOCK";
        case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
            return "VK_FORMAT_ASTC_5x5_UNORM_BLOCK";
        case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
            return "VK_FORMAT_ASTC_5x5_SRGB_BLOCK";
        case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
            return "VK_FORMAT_ASTC_6x5_UNORM_BLOCK";
        case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
            return "VK_FORMAT_ASTC_6x5_SRGB_BLOCK";
        case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
            return "VK_FORMAT_ASTC_6x6_UNORM_BLOCK";
        case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
            return "VK_FORMAT_ASTC_6x6_SRGB_BLOCK";
        case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
            return "VK_FORMAT_ASTC_8x5_UNORM_BLOCK";
        case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
            return "VK_FORMAT_ASTC_8x5_SRGB_BLOCK";
        case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
            return "VK_FORMAT_ASTC_8x6_UNORM_BLOCK";
        case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
            return "VK_FORMAT_ASTC_8x6_SRGB_BLOCK";
        case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
            return "VK_FORMAT_ASTC_8x8_UNORM_BLOCK";
        case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
            return "VK_FORMAT_ASTC_8x8_SRGB_BLOCK";
        case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
            return "VK_FORMAT_ASTC_10x5_UNORM_BLOCK";
        case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
            return "VK_FORMAT_ASTC_10x5_SRGB_BLOCK";
        case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
            return "VK_FORMAT_ASTC_10x6_UNORM_BLOCK";
        case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
            return "VK_FORMAT_ASTC_10x6_SRGB_BLOCK";
        case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
            return "VK_FORMAT_ASTC_10x8_UNORM_BLOCK";
        case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
            return "VK_FORMAT_ASTC_10x8_SRGB_BLOCK";
        case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
            return "VK_FORMAT_ASTC_10x10_UNORM_BLOCK";
        case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
            return "VK_FORMAT_ASTC_10x10_SRGB_BLOCK";
        case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
            return "VK_FORMAT_ASTC_12x10_UNORM_BLOCK";
        case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
            return "VK_FORMAT_ASTC_12x10_SRGB_BLOCK";
        case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
            return "VK_FORMAT_ASTC_12x12_UNORM_BLOCK";
        case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
            return "VK_FORMAT_ASTC_12x12_SRGB_BLOCK";
        case VK_FORMAT_G8B8G8R8_422_UNORM:
            return "VK_FORMAT_G8B8G8R8_422_UNORM";
        case VK_FORMAT_B8G8R8G8_422_UNORM:
            return "VK_FORMAT_B8G8R8G8_422_UNORM";
        case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
            return "VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM";
        case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
            return "VK_FORMAT_G8_B8R8_2PLANE_420_UNORM";
        case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM:
            return "VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM";
        case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM:
            return "VK_FORMAT_G8_B8R8_2PLANE_422_UNORM";
        case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM:
            return "VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM";
        case VK_FORMAT_R10X6_UNORM_PACK16:
            return "VK_FORMAT_R10X6_UNORM_PACK16";
        case VK_FORMAT_R10X6G10X6_UNORM_2PACK16:
            return "VK_FORMAT_R10X6G10X6_UNORM_2PACK16";
        case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16:
            return "VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16";
        case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16:
            return "VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16";
        case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16:
            return "VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16";
        case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16:
            return "VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16";
        case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
            return "VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16";
        case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16:
            return "VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16";
        case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16:
            return "VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16";
        case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16:
            return "VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16";
        case VK_FORMAT_R12X4_UNORM_PACK16:
            return "VK_FORMAT_R12X4_UNORM_PACK16";
        case VK_FORMAT_R12X4G12X4_UNORM_2PACK16:
            return "VK_FORMAT_R12X4G12X4_UNORM_2PACK16";
        case VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16:
            return "VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16";
        case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16:
            return "VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16";
        case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16:
            return "VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16";
        case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16:
            return "VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16";
        case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16:
            return "VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16";
        case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16:
            return "VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16";
        case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16:
            return "VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16";
        case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16:
            return "VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16";
        case VK_FORMAT_G16B16G16R16_422_UNORM:
            return "VK_FORMAT_G16B16G16R16_422_UNORM";
        case VK_FORMAT_B16G16R16G16_422_UNORM:
            return "VK_FORMAT_B16G16R16G16_422_UNORM";
        case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM:
            return "VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM";
        case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM:
            return "VK_FORMAT_G16_B16R16_2PLANE_420_UNORM";
        case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM:
            return "VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM";
        case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM:
            return "VK_FORMAT_G16_B16R16_2PLANE_422_UNORM";
        case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM:
            return "VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM";
        case VK_FORMAT_G8_B8R8_2PLANE_444_UNORM:
            return "VK_FORMAT_G8_B8R8_2PLANE_444_UNORM";
        case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16:
            return "VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16";
        case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16:
            return "VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16";
        case VK_FORMAT_G16_B16R16_2PLANE_444_UNORM:
            return "VK_FORMAT_G16_B16R16_2PLANE_444_UNORM";
        case VK_FORMAT_A4R4G4B4_UNORM_PACK16:
            return "VK_FORMAT_A4R4G4B4_UNORM_PACK16";
        case VK_FORMAT_A4B4G4R4_UNORM_PACK16:
            return "VK_FORMAT_A4B4G4R4_UNORM_PACK16";
        case VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK:
            return "VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK";
        case VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK:
            return "VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK";
        case VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK:
            return "VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK";
        case VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK:
            return "VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK";
        case VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK:
            return "VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK";
        case VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK:
            return "VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK";
        case VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK:
            return "VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK";
        case VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK:
            return "VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK";
        case VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK:
            return "VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK";
        case VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK:
            return "VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK";
        case VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK:
            return "VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK";
        case VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK:
            return "VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK";
        case VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK:
            return "VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK";
        case VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK:
            return "VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK";
        case VK_FORMAT_A1B5G5R5_UNORM_PACK16:
            return "VK_FORMAT_A1B5G5R5_UNORM_PACK16";
        case VK_FORMAT_A8_UNORM:
            return "VK_FORMAT_A8_UNORM";
        case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:
            return "VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG";
        case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG:
            return "VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG";
        case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG:
            return "VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG";
        case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG:
            return "VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG";
        case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG:
            return "VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG";
        case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG:
            return "VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG";
        case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG:
            return "VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG";
        case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG:
            return "VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG";
        case VK_FORMAT_ASTC_3x3x3_UNORM_BLOCK_EXT:
            return "VK_FORMAT_ASTC_3x3x3_UNORM_BLOCK_EXT";
        case VK_FORMAT_ASTC_3x3x3_SRGB_BLOCK_EXT:
            return "VK_FORMAT_ASTC_3x3x3_SRGB_BLOCK_EXT";
        case VK_FORMAT_ASTC_3x3x3_SFLOAT_BLOCK_EXT:
            return "VK_FORMAT_ASTC_3x3x3_SFLOAT_BLOCK_EXT";
        case VK_FORMAT_ASTC_4x3x3_UNORM_BLOCK_EXT:
            return "VK_FORMAT_ASTC_4x3x3_UNORM_BLOCK_EXT";
        case VK_FORMAT_ASTC_4x3x3_SRGB_BLOCK_EXT:
            return "VK_FORMAT_ASTC_4x3x3_SRGB_BLOCK_EXT";
        case VK_FORMAT_ASTC_4x3x3_SFLOAT_BLOCK_EXT:
            return "VK_FORMAT_ASTC_4x3x3_SFLOAT_BLOCK_EXT";
        case VK_FORMAT_ASTC_4x4x3_UNORM_BLOCK_EXT:
            return "VK_FORMAT_ASTC_4x4x3_UNORM_BLOCK_EXT";
        case VK_FORMAT_ASTC_4x4x3_SRGB_BLOCK_EXT:
            return "VK_FORMAT_ASTC_4x4x3_SRGB_BLOCK_EXT";
        case VK_FORMAT_ASTC_4x4x3_SFLOAT_BLOCK_EXT:
            return "VK_FORMAT_ASTC_4x4x3_SFLOAT_BLOCK_EXT";
        case VK_FORMAT_ASTC_4x4x4_UNORM_BLOCK_EXT:
            return "VK_FORMAT_ASTC_4x4x4_UNORM_BLOCK_EXT";
        case VK_FORMAT_ASTC_4x4x4_SRGB_BLOCK_EXT:
            return "VK_FORMAT_ASTC_4x4x4_SRGB_BLOCK_EXT";
        case VK_FORMAT_ASTC_4x4x4_SFLOAT_BLOCK_EXT:
            return "VK_FORMAT_ASTC_4x4x4_SFLOAT_BLOCK_EXT";
        case VK_FORMAT_ASTC_5x4x4_UNORM_BLOCK_EXT:
            return "VK_FORMAT_ASTC_5x4x4_UNORM_BLOCK_EXT";
        case VK_FORMAT_ASTC_5x4x4_SRGB_BLOCK_EXT:
            return "VK_FORMAT_ASTC_5x4x4_SRGB_BLOCK_EXT";
        case VK_FORMAT_ASTC_5x4x4_SFLOAT_BLOCK_EXT:
            return "VK_FORMAT_ASTC_5x4x4_SFLOAT_BLOCK_EXT";
        case VK_FORMAT_ASTC_5x5x4_UNORM_BLOCK_EXT:
            return "VK_FORMAT_ASTC_5x5x4_UNORM_BLOCK_EXT";
        case VK_FORMAT_ASTC_5x5x4_SRGB_BLOCK_EXT:
            return "VK_FORMAT_ASTC_5x5x4_SRGB_BLOCK_EXT";
        case VK_FORMAT_ASTC_5x5x4_SFLOAT_BLOCK_EXT:
            return "VK_FORMAT_ASTC_5x5x4_SFLOAT_BLOCK_EXT";
        case VK_FORMAT_ASTC_5x5x5_UNORM_BLOCK_EXT:
            return "VK_FORMAT_ASTC_5x5x5_UNORM_BLOCK_EXT";
        case VK_FORMAT_ASTC_5x5x5_SRGB_BLOCK_EXT:
            return "VK_FORMAT_ASTC_5x5x5_SRGB_BLOCK_EXT";
        case VK_FORMAT_ASTC_5x5x5_SFLOAT_BLOCK_EXT:
            return "VK_FORMAT_ASTC_5x5x5_SFLOAT_BLOCK_EXT";
        case VK_FORMAT_ASTC_6x5x5_UNORM_BLOCK_EXT:
            return "VK_FORMAT_ASTC_6x5x5_UNORM_BLOCK_EXT";
        case VK_FORMAT_ASTC_6x5x5_SRGB_BLOCK_EXT:
            return "VK_FORMAT_ASTC_6x5x5_SRGB_BLOCK_EXT";
        case VK_FORMAT_ASTC_6x5x5_SFLOAT_BLOCK_EXT:
            return "VK_FORMAT_ASTC_6x5x5_SFLOAT_BLOCK_EXT";
        case VK_FORMAT_ASTC_6x6x5_UNORM_BLOCK_EXT:
            return "VK_FORMAT_ASTC_6x6x5_UNORM_BLOCK_EXT";
        case VK_FORMAT_ASTC_6x6x5_SRGB_BLOCK_EXT:
            return "VK_FORMAT_ASTC_6x6x5_SRGB_BLOCK_EXT";
        case VK_FORMAT_ASTC_6x6x5_SFLOAT_BLOCK_EXT:
            return "VK_FORMAT_ASTC_6x6x5_SFLOAT_BLOCK_EXT";
        case VK_FORMAT_ASTC_6x6x6_UNORM_BLOCK_EXT:
            return "VK_FORMAT_ASTC_6x6x6_UNORM_BLOCK_EXT";
        case VK_FORMAT_ASTC_6x6x6_SRGB_BLOCK_EXT:
            return "VK_FORMAT_ASTC_6x6x6_SRGB_BLOCK_EXT";
        case VK_FORMAT_ASTC_6x6x6_SFLOAT_BLOCK_EXT:
            return "VK_FORMAT_ASTC_6x6x6_SFLOAT_BLOCK_EXT";
        case VK_FORMAT_R8_BOOL_ARM:
            return "VK_FORMAT_R8_BOOL_ARM";
        case VK_FORMAT_R16_SFLOAT_FPENCODING_BFLOAT16_ARM:
            return "VK_FORMAT_R16_SFLOAT_FPENCODING_BFLOAT16_ARM";
        case VK_FORMAT_R8_SFLOAT_FPENCODING_FLOAT8E4M3_ARM:
            return "VK_FORMAT_R8_SFLOAT_FPENCODING_FLOAT8E4M3_ARM";
        case VK_FORMAT_R8_SFLOAT_FPENCODING_FLOAT8E5M2_ARM:
            return "VK_FORMAT_R8_SFLOAT_FPENCODING_FLOAT8E5M2_ARM";
        case VK_FORMAT_R16G16_SFIXED5_NV:
            return "VK_FORMAT_R16G16_SFIXED5_NV";
        case VK_FORMAT_R10X6_UINT_PACK16_ARM:
            return "VK_FORMAT_R10X6_UINT_PACK16_ARM";
        case VK_FORMAT_R10X6G10X6_UINT_2PACK16_ARM:
            return "VK_FORMAT_R10X6G10X6_UINT_2PACK16_ARM";
        case VK_FORMAT_R10X6G10X6B10X6A10X6_UINT_4PACK16_ARM:
            return "VK_FORMAT_R10X6G10X6B10X6A10X6_UINT_4PACK16_ARM";
        case VK_FORMAT_R12X4_UINT_PACK16_ARM:
            return "VK_FORMAT_R12X4_UINT_PACK16_ARM";
        case VK_FORMAT_R12X4G12X4_UINT_2PACK16_ARM:
            return "VK_FORMAT_R12X4G12X4_UINT_2PACK16_ARM";
        case VK_FORMAT_R12X4G12X4B12X4A12X4_UINT_4PACK16_ARM:
            return "VK_FORMAT_R12X4G12X4B12X4A12X4_UINT_4PACK16_ARM";
        case VK_FORMAT_R14X2_UINT_PACK16_ARM:
            return "VK_FORMAT_R14X2_UINT_PACK16_ARM";
        case VK_FORMAT_R14X2G14X2_UINT_2PACK16_ARM:
            return "VK_FORMAT_R14X2G14X2_UINT_2PACK16_ARM";
        case VK_FORMAT_R14X2G14X2B14X2A14X2_UINT_4PACK16_ARM:
            return "VK_FORMAT_R14X2G14X2B14X2A14X2_UINT_4PACK16_ARM";
        case VK_FORMAT_R14X2_UNORM_PACK16_ARM:
            return "VK_FORMAT_R14X2_UNORM_PACK16_ARM";
        case VK_FORMAT_R14X2G14X2_UNORM_2PACK16_ARM:
            return "VK_FORMAT_R14X2G14X2_UNORM_2PACK16_ARM";
        case VK_FORMAT_R14X2G14X2B14X2A14X2_UNORM_4PACK16_ARM:
            return "VK_FORMAT_R14X2G14X2B14X2A14X2_UNORM_4PACK16_ARM";
        case VK_FORMAT_G14X2_B14X2R14X2_2PLANE_420_UNORM_3PACK16_ARM:
            return "VK_FORMAT_G14X2_B14X2R14X2_2PLANE_420_UNORM_3PACK16_ARM";
        case VK_FORMAT_G14X2_B14X2R14X2_2PLANE_422_UNORM_3PACK16_ARM:
            return "VK_FORMAT_G14X2_B14X2R14X2_2PLANE_422_UNORM_3PACK16_ARM";
        default:
            return "VK_FORMAT_UNDEFINED";
    }
}

static VkFormat StringToFormat(const std::string &input_value) {
    static const std::unordered_map<std::string, VkFormat> map = {
        {"VK_FORMAT_UNDEFINED", VK_FORMAT_UNDEFINED},
        {"VK_FORMAT_R4G4_UNORM_PACK8", VK_FORMAT_R4G4_UNORM_PACK8},
        {"VK_FORMAT_R4G4B4A4_UNORM_PACK16", VK_FORMAT_R4G4B4A4_UNORM_PACK16},
        {"VK_FORMAT_B4G4R4A4_UNORM_PACK16", VK_FORMAT_B4G4R4A4_UNORM_PACK16},
        {"VK_FORMAT_R5G6B5_UNORM_PACK16", VK_FORMAT_R5G6B5_UNORM_PACK16},
        {"VK_FORMAT_B5G6R5_UNORM_PACK16", VK_FORMAT_B5G6R5_UNORM_PACK16},
        {"VK_FORMAT_R5G5B5A1_UNORM_PACK16", VK_FORMAT_R5G5B5A1_UNORM_PACK16},
        {"VK_FORMAT_B5G5R5A1_UNORM_PACK16", VK_FORMAT_B5G5R5A1_UNORM_PACK16},
        {"VK_FORMAT_A1R5G5B5_UNORM_PACK16", VK_FORMAT_A1R5G5B5_UNORM_PACK16},
        {"VK_FORMAT_R8_UNORM", VK_FORMAT_R8_UNORM},
        {"VK_FORMAT_R8_SNORM", VK_FORMAT_R8_SNORM},
        {"VK_FORMAT_R8_USCALED", VK_FORMAT_R8_USCALED},
        {"VK_FORMAT_R8_SSCALED", VK_FORMAT_R8_SSCALED},
        {"VK_FORMAT_R8_UINT", VK_FORMAT_R8_UINT},
        {"VK_FORMAT_R8_SINT", VK_FORMAT_R8_SINT},
        {"VK_FORMAT_R8_SRGB", VK_FORMAT_R8_SRGB},
        {"VK_FORMAT_R8G8_UNORM", VK_FORMAT_R8G8_UNORM},
        {"VK_FORMAT_R8G8_SNORM", VK_FORMAT_R8G8_SNORM},
        {"VK_FORMAT_R8G8_USCALED", VK_FORMAT_R8G8_USCALED},
        {"VK_FORMAT_R8G8_SSCALED", VK_FORMAT_R8G8_SSCALED},
        {"VK_FORMAT_R8G8_UINT", VK_FORMAT_R8G8_UINT},
        {"VK_FORMAT_R8G8_SINT", VK_FORMAT_R8G8_SINT},
        {"VK_FORMAT_R8G8_SRGB", VK_FORMAT_R8G8_SRGB},
        {"VK_FORMAT_R8G8B8_UNORM", VK_FORMAT_R8G8B8_UNORM},
        {"VK_FORMAT_R8G8B8_SNORM", VK_FORMAT_R8G8B8_SNORM},
        {"VK_FORMAT_R8G8B8_USCALED", VK_FORMAT_R8G8B8_USCALED},
        {"VK_FORMAT_R8G8B8_SSCALED", VK_FORMAT_R8G8B8_SSCALED},
        {"VK_FORMAT_R8G8B8_UINT", VK_FORMAT_R8G8B8_UINT},
        {"VK_FORMAT_R8G8B8_SINT", VK_FORMAT_R8G8B8_SINT},
        {"VK_FORMAT_R8G8B8_SRGB", VK_FORMAT_R8G8B8_SRGB},
        {"VK_FORMAT_B8G8R8_UNORM", VK_FORMAT_B8G8R8_UNORM},
        {"VK_FORMAT_B8G8R8_SNORM", VK_FORMAT_B8G8R8_SNORM},
        {"VK_FORMAT_B8G8R8_USCALED", VK_FORMAT_B8G8R8_USCALED},
        {"VK_FORMAT_B8G8R8_SSCALED", VK_FORMAT_B8G8R8_SSCALED},
        {"VK_FORMAT_B8G8R8_UINT", VK_FORMAT_B8G8R8_UINT},
        {"VK_FORMAT_B8G8R8_SINT", VK_FORMAT_B8G8R8_SINT},
        {"VK_FORMAT_B8G8R8_SRGB", VK_FORMAT_B8G8R8_SRGB},
        {"VK_FORMAT_R8G8B8A8_UNORM", VK_FORMAT_R8G8B8A8_UNORM},
        {"VK_FORMAT_R8G8B8A8_SNORM", VK_FORMAT_R8G8B8A8_SNORM},
        {"VK_FORMAT_R8G8B8A8_USCALED", VK_FORMAT_R8G8B8A8_USCALED},
        {"VK_FORMAT_R8G8B8A8_SSCALED", VK_FORMAT_R8G8B8A8_SSCALED},
        {"VK_FORMAT_R8G8B8A8_UINT", VK_FORMAT_R8G8B8A8_UINT},
        {"VK_FORMAT_R8G8B8A8_SINT", VK_FORMAT_R8G8B8A8_SINT},
        {"VK_FORMAT_R8G8B8A8_SRGB", VK_FORMAT_R8G8B8A8_SRGB},
        {"VK_FORMAT_B8G8R8A8_UNORM", VK_FORMAT_B8G8R8A8_UNORM},
        {"VK_FORMAT_B8G8R8A8_SNORM", VK_FORMAT_B8G8R8A8_SNORM},
        {"VK_FORMAT_B8G8R8A8_USCALED", VK_FORMAT_B8G8R8A8_USCALED},
        {"VK_FORMAT_B8G8R8A8_SSCALED", VK_FORMAT_B8G8R8A8_SSCALED},
        {"VK_FORMAT_B8G8R8A8_UINT", VK_FORMAT_B8G8R8A8_UINT},
        {"VK_FORMAT_B8G8R8A8_SINT", VK_FORMAT_B8G8R8A8_SINT},
        {"VK_FORMAT_B8G8R8A8_SRGB", VK_FORMAT_B8G8R8A8_SRGB},
        {"VK_FORMAT_A8B8G8R8_UNORM_PACK32", VK_FORMAT_A8B8G8R8_UNORM_PACK32},
        {"VK_FORMAT_A8B8G8R8_SNORM_PACK32", VK_FORMAT_A8B8G8R8_SNORM_PACK32},
        {"VK_FORMAT_A8B8G8R8_USCALED_PACK32", VK_FORMAT_A8B8G8R8_USCALED_PACK32},
        {"VK_FORMAT_A8B8G8R8_SSCALED_PACK32", VK_FORMAT_A8B8G8R8_SSCALED_PACK32},
        {"VK_FORMAT_A8B8G8R8_UINT_PACK32", VK_FORMAT_A8B8G8R8_UINT_PACK32},
        {"VK_FORMAT_A8B8G8R8_SINT_PACK32", VK_FORMAT_A8B8G8R8_SINT_PACK32},
        {"VK_FORMAT_A8B8G8R8_SRGB_PACK32", VK_FORMAT_A8B8G8R8_SRGB_PACK32},
        {"VK_FORMAT_A2R10G10B10_UNORM_PACK32", VK_FORMAT_A2R10G10B10_UNORM_PACK32},
        {"VK_FORMAT_A2R10G10B10_SNORM_PACK32", VK_FORMAT_A2R10G10B10_SNORM_PACK32},
        {"VK_FORMAT_A2R10G10B10_USCALED_PACK32", VK_FORMAT_A2R10G10B10_USCALED_PACK32},
        {"VK_FORMAT_A2R10G10B10_SSCALED_PACK32", VK_FORMAT_A2R10G10B10_SSCALED_PACK32},
        {"VK_FORMAT_A2R10G10B10_UINT_PACK32", VK_FORMAT_A2R10G10B10_UINT_PACK32},
        {"VK_FORMAT_A2R10G10B10_SINT_PACK32", VK_FORMAT_A2R10G10B10_SINT_PACK32},
        {"VK_FORMAT_A2B10G10R10_UNORM_PACK32", VK_FORMAT_A2B10G10R10_UNORM_PACK32},
        {"VK_FORMAT_A2B10G10R10_SNORM_PACK32", VK_FORMAT_A2B10G10R10_SNORM_PACK32},
        {"VK_FORMAT_A2B10G10R10_USCALED_PACK32", VK_FORMAT_A2B10G10R10_USCALED_PACK32},
        {"VK_FORMAT_A2B10G10R10_SSCALED_PACK32", VK_FORMAT_A2B10G10R10_SSCALED_PACK32},
        {"VK_FORMAT_A2B10G10R10_UINT_PACK32", VK_FORMAT_A2B10G10R10_UINT_PACK32},
        {"VK_FORMAT_A2B10G10R10_SINT_PACK32", VK_FORMAT_A2B10G10R10_SINT_PACK32},
        {"VK_FORMAT_R16_UNORM", VK_FORMAT_R16_UNORM},
        {"VK_FORMAT_R16_SNORM", VK_FORMAT_R16_SNORM},
        {"VK_FORMAT_R16_USCALED", VK_FORMAT_R16_USCALED},
        {"VK_FORMAT_R16_SSCALED", VK_FORMAT_R16_SSCALED},
        {"VK_FORMAT_R16_UINT", VK_FORMAT_R16_UINT},
        {"VK_FORMAT_R16_SINT", VK_FORMAT_R16_SINT},
        {"VK_FORMAT_R16_SFLOAT", VK_FORMAT_R16_SFLOAT},
        {"VK_FORMAT_R16G16_UNORM", VK_FORMAT_R16G16_UNORM},
        {"VK_FORMAT_R16G16_SNORM", VK_FORMAT_R16G16_SNORM},
        {"VK_FORMAT_R16G16_USCALED", VK_FORMAT_R16G16_USCALED},
        {"VK_FORMAT_R16G16_SSCALED", VK_FORMAT_R16G16_SSCALED},
        {"VK_FORMAT_R16G16_UINT", VK_FORMAT_R16G16_UINT},
        {"VK_FORMAT_R16G16_SINT", VK_FORMAT_R16G16_SINT},
        {"VK_FORMAT_R16G16_SFLOAT", VK_FORMAT_R16G16_SFLOAT},
        {"VK_FORMAT_R16G16B16_UNORM", VK_FORMAT_R16G16B16_UNORM},
        {"VK_FORMAT_R16G16B16_SNORM", VK_FORMAT_R16G16B16_SNORM},
        {"VK_FORMAT_R16G16B16_USCALED", VK_FORMAT_R16G16B16_USCALED},
        {"VK_FORMAT_R16G16B16_SSCALED", VK_FORMAT_R16G16B16_SSCALED},
        {"VK_FORMAT_R16G16B16_UINT", VK_FORMAT_R16G16B16_UINT},
        {"VK_FORMAT_R16G16B16_SINT", VK_FORMAT_R16G16B16_SINT},
        {"VK_FORMAT_R16G16B16_SFLOAT", VK_FORMAT_R16G16B16_SFLOAT},
        {"VK_FORMAT_R16G16B16A16_UNORM", VK_FORMAT_R16G16B16A16_UNORM},
        {"VK_FORMAT_R16G16B16A16_SNORM", VK_FORMAT_R16G16B16A16_SNORM},
        {"VK_FORMAT_R16G16B16A16_USCALED", VK_FORMAT_R16G16B16A16_USCALED},
        {"VK_FORMAT_R16G16B16A16_SSCALED", VK_FORMAT_R16G16B16A16_SSCALED},
        {"VK_FORMAT_R16G16B16A16_UINT", VK_FORMAT_R16G16B16A16_UINT},
        {"VK_FORMAT_R16G16B16A16_SINT", VK_FORMAT_R16G16B16A16_SINT},
        {"VK_FORMAT_R16G16B16A16_SFLOAT", VK_FORMAT_R16G16B16A16_SFLOAT},
        {"VK_FORMAT_R32_UINT", VK_FORMAT_R32_UINT},
        {"VK_FORMAT_R32_SINT", VK_FORMAT_R32_SINT},
        {"VK_FORMAT_R32_SFLOAT", VK_FORMAT_R32_SFLOAT},
        {"VK_FORMAT_R32G32_UINT", VK_FORMAT_R32G32_UINT},
        {"VK_FORMAT_R32G32_SINT", VK_FORMAT_R32G32_SINT},
        {"VK_FORMAT_R32G32_SFLOAT", VK_FORMAT_R32G32_SFLOAT},
        {"VK_FORMAT_R32G32B32_UINT", VK_FORMAT_R32G32B32_UINT},
        {"VK_FORMAT_R32G32B32_SINT", VK_FORMAT_R32G32B32_SINT},
        {"VK_FORMAT_R32G32B32_SFLOAT", VK_FORMAT_R32G32B32_SFLOAT},
        {"VK_FORMAT_R32G32B32A32_UINT", VK_FORMAT_R32G32B32A32_UINT},
        {"VK_FORMAT_R32G32B32A32_SINT", VK_FORMAT_R32G32B32A32_SINT},
        {"VK_FORMAT_R32G32B32A32_SFLOAT", VK_FORMAT_R32G32B32A32_SFLOAT},
        {"VK_FORMAT_R64_UINT", VK_FORMAT_R64_UINT},
        {"VK_FORMAT_R64_SINT", VK_FORMAT_R64_SINT},
        {"VK_FORMAT_R64_SFLOAT", VK_FORMAT_R64_SFLOAT},
        {"VK_FORMAT_R64G64_UINT", VK_FORMAT_R64G64_UINT},
        {"VK_FORMAT_R64G64_SINT", VK_FORMAT_R64G64_SINT},
        {"VK_FORMAT_R64G64_SFLOAT", VK_FORMAT_R64G64_SFLOAT},
        {"VK_FORMAT_R64G64B64_UINT", VK_FORMAT_R64G64B64_UINT},
        {"VK_FORMAT_R64G64B64_SINT", VK_FORMAT_R64G64B64_SINT},
        {"VK_FORMAT_R64G64B64_SFLOAT", VK_FORMAT_R64G64B64_SFLOAT},
        {"VK_FORMAT_R64G64B64A64_UINT", VK_FORMAT_R64G64B64A64_UINT},
        {"VK_FORMAT_R64G64B64A64_SINT", VK_FORMAT_R64G64B64A64_SINT},
        {"VK_FORMAT_R64G64B64A64_SFLOAT", VK_FORMAT_R64G64B64A64_SFLOAT},
        {"VK_FORMAT_B10G11R11_UFLOAT_PACK32", VK_FORMAT_B10G11R11_UFLOAT_PACK32},
        {"VK_FORMAT_E5B9G9R9_UFLOAT_PACK32", VK_FORMAT_E5B9G9R9_UFLOAT_PACK32},
        {"VK_FORMAT_D16_UNORM", VK_FORMAT_D16_UNORM},
        {"VK_FORMAT_X8_D24_UNORM_PACK32", VK_FORMAT_X8_D24_UNORM_PACK32},
        {"VK_FORMAT_D32_SFLOAT", VK_FORMAT_D32_SFLOAT},
        {"VK_FORMAT_S8_UINT", VK_FORMAT_S8_UINT},
        {"VK_FORMAT_D16_UNORM_S8_UINT", VK_FORMAT_D16_UNORM_S8_UINT},
        {"VK_FORMAT_D24_UNORM_S8_UINT", VK_FORMAT_D24_UNORM_S8_UINT},
        {"VK_FORMAT_D32_SFLOAT_S8_UINT", VK_FORMAT_D32_SFLOAT_S8_UINT},
        {"VK_FORMAT_BC1_RGB_UNORM_BLOCK", VK_FORMAT_BC1_RGB_UNORM_BLOCK},
        {"VK_FORMAT_BC1_RGB_SRGB_BLOCK", VK_FORMAT_BC1_RGB_SRGB_BLOCK},
        {"VK_FORMAT_BC1_RGBA_UNORM_BLOCK", VK_FORMAT_BC1_RGBA_UNORM_BLOCK},
        {"VK_FORMAT_BC1_RGBA_SRGB_BLOCK", VK_FORMAT_BC1_RGBA_SRGB_BLOCK},
        {"VK_FORMAT_BC2_UNORM_BLOCK", VK_FORMAT_BC2_UNORM_BLOCK},
        {"VK_FORMAT_BC2_SRGB_BLOCK", VK_FORMAT_BC2_SRGB_BLOCK},
        {"VK_FORMAT_BC3_UNORM_BLOCK", VK_FORMAT_BC3_UNORM_BLOCK},
        {"VK_FORMAT_BC3_SRGB_BLOCK", VK_FORMAT_BC3_SRGB_BLOCK},
        {"VK_FORMAT_BC4_UNORM_BLOCK", VK_FORMAT_BC4_UNORM_BLOCK},
        {"VK_FORMAT_BC4_SNORM_BLOCK", VK_FORMAT_BC4_SNORM_BLOCK},
        {"VK_FORMAT_BC5_UNORM_BLOCK", VK_FORMAT_BC5_UNORM_BLOCK},
        {"VK_FORMAT_BC5_SNORM_BLOCK", VK_FORMAT_BC5_SNORM_BLOCK},
        {"VK_FORMAT_BC6H_UFLOAT_BLOCK", VK_FORMAT_BC6H_UFLOAT_BLOCK},
        {"VK_FORMAT_BC6H_SFLOAT_BLOCK", VK_FORMAT_BC6H_SFLOAT_BLOCK},
        {"VK_FORMAT_BC7_UNORM_BLOCK", VK_FORMAT_BC7_UNORM_BLOCK},
        {"VK_FORMAT_BC7_SRGB_BLOCK", VK_FORMAT_BC7_SRGB_BLOCK},
        {"VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK", VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK},
        {"VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK", VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK},
        {"VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK", VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK},
        {"VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK", VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK},
        {"VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK", VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK},
        {"VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK", VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK},
        {"VK_FORMAT_EAC_R11_UNORM_BLOCK", VK_FORMAT_EAC_R11_UNORM_BLOCK},
        {"VK_FORMAT_EAC_R11_SNORM_BLOCK", VK_FORMAT_EAC_R11_SNORM_BLOCK},
        {"VK_FORMAT_EAC_R11G11_UNORM_BLOCK", VK_FORMAT_EAC_R11G11_UNORM_BLOCK},
        {"VK_FORMAT_EAC_R11G11_SNORM_BLOCK", VK_FORMAT_EAC_R11G11_SNORM_BLOCK},
        {"VK_FORMAT_ASTC_4x4_UNORM_BLOCK", VK_FORMAT_ASTC_4x4_UNORM_BLOCK},
        {"VK_FORMAT_ASTC_4x4_SRGB_BLOCK", VK_FORMAT_ASTC_4x4_SRGB_BLOCK},
        {"VK_FORMAT_ASTC_5x4_UNORM_BLOCK", VK_FORMAT_ASTC_5x4_UNORM_BLOCK},
        {"VK_FORMAT_ASTC_5x4_SRGB_BLOCK", VK_FORMAT_ASTC_5x4_SRGB_BLOCK},
        {"VK_FORMAT_ASTC_5x5_UNORM_BLOCK", VK_FORMAT_ASTC_5x5_UNORM_BLOCK},
        {"VK_FORMAT_ASTC_5x5_SRGB_BLOCK", VK_FORMAT_ASTC_5x5_SRGB_BLOCK},
        {"VK_FORMAT_ASTC_6x5_UNORM_BLOCK", VK_FORMAT_ASTC_6x5_UNORM_BLOCK},
        {"VK_FORMAT_ASTC_6x5_SRGB_BLOCK", VK_FORMAT_ASTC_6x5_SRGB_BLOCK},
        {"VK_FORMAT_ASTC_6x6_UNORM_BLOCK", VK_FORMAT_ASTC_6x6_UNORM_BLOCK},
        {"VK_FORMAT_ASTC_6x6_SRGB_BLOCK", VK_FORMAT_ASTC_6x6_SRGB_BLOCK},
        {"VK_FORMAT_ASTC_8x5_UNORM_BLOCK", VK_FORMAT_ASTC_8x5_UNORM_BLOCK},
        {"VK_FORMAT_ASTC_8x5_SRGB_BLOCK", VK_FORMAT_ASTC_8x5_SRGB_BLOCK},
        {"VK_FORMAT_ASTC_8x6_UNORM_BLOCK", VK_FORMAT_ASTC_8x6_UNORM_BLOCK},
        {"VK_FORMAT_ASTC_8x6_SRGB_BLOCK", VK_FORMAT_ASTC_8x6_SRGB_BLOCK},
        {"VK_FORMAT_ASTC_8x8_UNORM_BLOCK", VK_FORMAT_ASTC_8x8_UNORM_BLOCK},
        {"VK_FORMAT_ASTC_8x8_SRGB_BLOCK", VK_FORMAT_ASTC_8x8_SRGB_BLOCK},
        {"VK_FORMAT_ASTC_10x5_UNORM_BLOCK", VK_FORMAT_ASTC_10x5_UNORM_BLOCK},
        {"VK_FORMAT_ASTC_10x5_SRGB_BLOCK", VK_FORMAT_ASTC_10x5_SRGB_BLOCK},
        {"VK_FORMAT_ASTC_10x6_UNORM_BLOCK", VK_FORMAT_ASTC_10x6_UNORM_BLOCK},
        {"VK_FORMAT_ASTC_10x6_SRGB_BLOCK", VK_FORMAT_ASTC_10x6_SRGB_BLOCK},
        {"VK_FORMAT_ASTC_10x8_UNORM_BLOCK", VK_FORMAT_ASTC_10x8_UNORM_BLOCK},
        {"VK_FORMAT_ASTC_10x8_SRGB_BLOCK", VK_FORMAT_ASTC_10x8_SRGB_BLOCK},
        {"VK_FORMAT_ASTC_10x10_UNORM_BLOCK", VK_FORMAT_ASTC_10x10_UNORM_BLOCK},
        {"VK_FORMAT_ASTC_10x10_SRGB_BLOCK", VK_FORMAT_ASTC_10x10_SRGB_BLOCK},
        {"VK_FORMAT_ASTC_12x10_UNORM_BLOCK", VK_FORMAT_ASTC_12x10_UNORM_BLOCK},
        {"VK_FORMAT_ASTC_12x10_SRGB_BLOCK", VK_FORMAT_ASTC_12x10_SRGB_BLOCK},
        {"VK_FORMAT_ASTC_12x12_UNORM_BLOCK", VK_FORMAT_ASTC_12x12_UNORM_BLOCK},
        {"VK_FORMAT_ASTC_12x12_SRGB_BLOCK", VK_FORMAT_ASTC_12x12_SRGB_BLOCK},
        {"VK_FORMAT_G8B8G8R8_422_UNORM", VK_FORMAT_G8B8G8R8_422_UNORM},
        {"VK_FORMAT_B8G8R8G8_422_UNORM", VK_FORMAT_B8G8R8G8_422_UNORM},
        {"VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM", VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM},
        {"VK_FORMAT_G8_B8R8_2PLANE_420_UNORM", VK_FORMAT_G8_B8R8_2PLANE_420_UNORM},
        {"VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM", VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM},
        {"VK_FORMAT_G8_B8R8_2PLANE_422_UNORM", VK_FORMAT_G8_B8R8_2PLANE_422_UNORM},
        {"VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM", VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM},
        {"VK_FORMAT_R10X6_UNORM_PACK16", VK_FORMAT_R10X6_UNORM_PACK16},
        {"VK_FORMAT_R10X6G10X6_UNORM_2PACK16", VK_FORMAT_R10X6G10X6_UNORM_2PACK16},
        {"VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16", VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16},
        {"VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16", VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16},
        {"VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16", VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16},
        {"VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16", VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16},
        {"VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16", VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16},
        {"VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16", VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16},
        {"VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16", VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16},
        {"VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16", VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16},
        {"VK_FORMAT_R12X4_UNORM_PACK16", VK_FORMAT_R12X4_UNORM_PACK16},
        {"VK_FORMAT_R12X4G12X4_UNORM_2PACK16", VK_FORMAT_R12X4G12X4_UNORM_2PACK16},
        {"VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16", VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16},
        {"VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16", VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16},
        {"VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16", VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16},
        {"VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16", VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16},
        {"VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16", VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16},
        {"VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16", VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16},
        {"VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16", VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16},
        {"VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16", VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16},
        {"VK_FORMAT_G16B16G16R16_422_UNORM", VK_FORMAT_G16B16G16R16_422_UNORM},
        {"VK_FORMAT_B16G16R16G16_422_UNORM", VK_FORMAT_B16G16R16G16_422_UNORM},
        {"VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM", VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM},
        {"VK_FORMAT_G16_B16R16_2PLANE_420_UNORM", VK_FORMAT_G16_B16R16_2PLANE_420_UNORM},
        {"VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM", VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM},
        {"VK_FORMAT_G16_B16R16_2PLANE_422_UNORM", VK_FORMAT_G16_B16R16_2PLANE_422_UNORM},
        {"VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM", VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM},
        {"VK_FORMAT_G8_B8R8_2PLANE_444_UNORM", VK_FORMAT_G8_B8R8_2PLANE_444_UNORM},
        {"VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16", VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16},
        {"VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16", VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16},
        {"VK_FORMAT_G16_B16R16_2PLANE_444_UNORM", VK_FORMAT_G16_B16R16_2PLANE_444_UNORM},
        {"VK_FORMAT_A4R4G4B4_UNORM_PACK16", VK_FORMAT_A4R4G4B4_UNORM_PACK16},
        {"VK_FORMAT_A4B4G4R4_UNORM_PACK16", VK_FORMAT_A4B4G4R4_UNORM_PACK16},
        {"VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK", VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK},
        {"VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK", VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK},
        {"VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK", VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK},
        {"VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK", VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK},
        {"VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK", VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK},
        {"VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK", VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK},
        {"VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK", VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK},
        {"VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK", VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK},
        {"VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK", VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK},
        {"VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK", VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK},
        {"VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK", VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK},
        {"VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK", VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK},
        {"VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK", VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK},
        {"VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK", VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK},
        {"VK_FORMAT_A1B5G5R5_UNORM_PACK16", VK_FORMAT_A1B5G5R5_UNORM_PACK16},
        {"VK_FORMAT_A8_UNORM", VK_FORMAT_A8_UNORM},
        {"VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG", VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG},
        {"VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG", VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG},
        {"VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG", VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG},
        {"VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG", VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG},
        {"VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG", VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG},
        {"VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG", VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG},
        {"VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG", VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG},
        {"VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG", VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG},
        {"VK_FORMAT_ASTC_3x3x3_UNORM_BLOCK_EXT", VK_FORMAT_ASTC_3x3x3_UNORM_BLOCK_EXT},
        {"VK_FORMAT_ASTC_3x3x3_SRGB_BLOCK_EXT", VK_FORMAT_ASTC_3x3x3_SRGB_BLOCK_EXT},
        {"VK_FORMAT_ASTC_3x3x3_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_3x3x3_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_4x3x3_UNORM_BLOCK_EXT", VK_FORMAT_ASTC_4x3x3_UNORM_BLOCK_EXT},
        {"VK_FORMAT_ASTC_4x3x3_SRGB_BLOCK_EXT", VK_FORMAT_ASTC_4x3x3_SRGB_BLOCK_EXT},
        {"VK_FORMAT_ASTC_4x3x3_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_4x3x3_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_4x4x3_UNORM_BLOCK_EXT", VK_FORMAT_ASTC_4x4x3_UNORM_BLOCK_EXT},
        {"VK_FORMAT_ASTC_4x4x3_SRGB_BLOCK_EXT", VK_FORMAT_ASTC_4x4x3_SRGB_BLOCK_EXT},
        {"VK_FORMAT_ASTC_4x4x3_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_4x4x3_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_4x4x4_UNORM_BLOCK_EXT", VK_FORMAT_ASTC_4x4x4_UNORM_BLOCK_EXT},
        {"VK_FORMAT_ASTC_4x4x4_SRGB_BLOCK_EXT", VK_FORMAT_ASTC_4x4x4_SRGB_BLOCK_EXT},
        {"VK_FORMAT_ASTC_4x4x4_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_4x4x4_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_5x4x4_UNORM_BLOCK_EXT", VK_FORMAT_ASTC_5x4x4_UNORM_BLOCK_EXT},
        {"VK_FORMAT_ASTC_5x4x4_SRGB_BLOCK_EXT", VK_FORMAT_ASTC_5x4x4_SRGB_BLOCK_EXT},
        {"VK_FORMAT_ASTC_5x4x4_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_5x4x4_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_5x5x4_UNORM_BLOCK_EXT", VK_FORMAT_ASTC_5x5x4_UNORM_BLOCK_EXT},
        {"VK_FORMAT_ASTC_5x5x4_SRGB_BLOCK_EXT", VK_FORMAT_ASTC_5x5x4_SRGB_BLOCK_EXT},
        {"VK_FORMAT_ASTC_5x5x4_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_5x5x4_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_5x5x5_UNORM_BLOCK_EXT", VK_FORMAT_ASTC_5x5x5_UNORM_BLOCK_EXT},
        {"VK_FORMAT_ASTC_5x5x5_SRGB_BLOCK_EXT", VK_FORMAT_ASTC_5x5x5_SRGB_BLOCK_EXT},
        {"VK_FORMAT_ASTC_5x5x5_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_5x5x5_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_6x5x5_UNORM_BLOCK_EXT", VK_FORMAT_ASTC_6x5x5_UNORM_BLOCK_EXT},
        {"VK_FORMAT_ASTC_6x5x5_SRGB_BLOCK_EXT", VK_FORMAT_ASTC_6x5x5_SRGB_BLOCK_EXT},
        {"VK_FORMAT_ASTC_6x5x5_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_6x5x5_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_6x6x5_UNORM_BLOCK_EXT", VK_FORMAT_ASTC_6x6x5_UNORM_BLOCK_EXT},
        {"VK_FORMAT_ASTC_6x6x5_SRGB_BLOCK_EXT", VK_FORMAT_ASTC_6x6x5_SRGB_BLOCK_EXT},
        {"VK_FORMAT_ASTC_6x6x5_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_6x6x5_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_6x6x6_UNORM_BLOCK_EXT", VK_FORMAT_ASTC_6x6x6_UNORM_BLOCK_EXT},
        {"VK_FORMAT_ASTC_6x6x6_SRGB_BLOCK_EXT", VK_FORMAT_ASTC_6x6x6_SRGB_BLOCK_EXT},
        {"VK_FORMAT_ASTC_6x6x6_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_6x6x6_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_R8_BOOL_ARM", VK_FORMAT_R8_BOOL_ARM},
        {"VK_FORMAT_R16_SFLOAT_FPENCODING_BFLOAT16_ARM", VK_FORMAT_R16_SFLOAT_FPENCODING_BFLOAT16_ARM},
        {"VK_FORMAT_R8_SFLOAT_FPENCODING_FLOAT8E4M3_ARM", VK_FORMAT_R8_SFLOAT_FPENCODING_FLOAT8E4M3_ARM},
        {"VK_FORMAT_R8_SFLOAT_FPENCODING_FLOAT8E5M2_ARM", VK_FORMAT_R8_SFLOAT_FPENCODING_FLOAT8E5M2_ARM},
        {"VK_FORMAT_R16G16_SFIXED5_NV", VK_FORMAT_R16G16_SFIXED5_NV},
        {"VK_FORMAT_R10X6_UINT_PACK16_ARM", VK_FORMAT_R10X6_UINT_PACK16_ARM},
        {"VK_FORMAT_R10X6G10X6_UINT_2PACK16_ARM", VK_FORMAT_R10X6G10X6_UINT_2PACK16_ARM},
        {"VK_FORMAT_R10X6G10X6B10X6A10X6_UINT_4PACK16_ARM", VK_FORMAT_R10X6G10X6B10X6A10X6_UINT_4PACK16_ARM},
        {"VK_FORMAT_R12X4_UINT_PACK16_ARM", VK_FORMAT_R12X4_UINT_PACK16_ARM},
        {"VK_FORMAT_R12X4G12X4_UINT_2PACK16_ARM", VK_FORMAT_R12X4G12X4_UINT_2PACK16_ARM},
        {"VK_FORMAT_R12X4G12X4B12X4A12X4_UINT_4PACK16_ARM", VK_FORMAT_R12X4G12X4B12X4A12X4_UINT_4PACK16_ARM},
        {"VK_FORMAT_R14X2_UINT_PACK16_ARM", VK_FORMAT_R14X2_UINT_PACK16_ARM},
        {"VK_FORMAT_R14X2G14X2_UINT_2PACK16_ARM", VK_FORMAT_R14X2G14X2_UINT_2PACK16_ARM},
        {"VK_FORMAT_R14X2G14X2B14X2A14X2_UINT_4PACK16_ARM", VK_FORMAT_R14X2G14X2B14X2A14X2_UINT_4PACK16_ARM},
        {"VK_FORMAT_R14X2_UNORM_PACK16_ARM", VK_FORMAT_R14X2_UNORM_PACK16_ARM},
        {"VK_FORMAT_R14X2G14X2_UNORM_2PACK16_ARM", VK_FORMAT_R14X2G14X2_UNORM_2PACK16_ARM},
        {"VK_FORMAT_R14X2G14X2B14X2A14X2_UNORM_4PACK16_ARM", VK_FORMAT_R14X2G14X2B14X2A14X2_UNORM_4PACK16_ARM},
        {"VK_FORMAT_G14X2_B14X2R14X2_2PLANE_420_UNORM_3PACK16_ARM", VK_FORMAT_G14X2_B14X2R14X2_2PLANE_420_UNORM_3PACK16_ARM},
        {"VK_FORMAT_G14X2_B14X2R14X2_2PLANE_422_UNORM_3PACK16_ARM", VK_FORMAT_G14X2_B14X2R14X2_2PLANE_422_UNORM_3PACK16_ARM},
        {"VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT", VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT},
        {"VK_FORMAT_G8B8G8R8_422_UNORM_KHR", VK_FORMAT_G8B8G8R8_422_UNORM_KHR},
        {"VK_FORMAT_B8G8R8G8_422_UNORM_KHR", VK_FORMAT_B8G8R8G8_422_UNORM_KHR},
        {"VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR", VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR},
        {"VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR", VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR},
        {"VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR", VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR},
        {"VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR", VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR},
        {"VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR", VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR},
        {"VK_FORMAT_R10X6_UNORM_PACK16_KHR", VK_FORMAT_R10X6_UNORM_PACK16_KHR},
        {"VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR", VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR},
        {"VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR", VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR},
        {"VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR", VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR},
        {"VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR", VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR},
        {"VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR", VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR},
        {"VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR", VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR},
        {"VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR", VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR},
        {"VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR", VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR},
        {"VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR", VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR},
        {"VK_FORMAT_R12X4_UNORM_PACK16_KHR", VK_FORMAT_R12X4_UNORM_PACK16_KHR},
        {"VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR", VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR},
        {"VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR", VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR},
        {"VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR", VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR},
        {"VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR", VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR},
        {"VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR", VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR},
        {"VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR", VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR},
        {"VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR", VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR},
        {"VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR", VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR},
        {"VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR", VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR},
        {"VK_FORMAT_G16B16G16R16_422_UNORM_KHR", VK_FORMAT_G16B16G16R16_422_UNORM_KHR},
        {"VK_FORMAT_B16G16R16G16_422_UNORM_KHR", VK_FORMAT_B16G16R16G16_422_UNORM_KHR},
        {"VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR", VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR},
        {"VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR", VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR},
        {"VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR", VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR},
        {"VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR", VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR},
        {"VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR", VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR},
        {"VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT", VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT},
        {"VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT", VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT},
        {"VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT", VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT},
        {"VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT", VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT},
        {"VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT", VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT},
        {"VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT", VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT},
        {"VK_FORMAT_R16G16_S10_5_NV", VK_FORMAT_R16G16_S10_5_NV},
        {"VK_FORMAT_A1B5G5R5_UNORM_PACK16_KHR", VK_FORMAT_A1B5G5R5_UNORM_PACK16_KHR},
        {"VK_FORMAT_A8_UNORM_KHR", VK_FORMAT_A8_UNORM_KHR},
    };
    const auto it = map.find(input_value);
    if (it != map.end()) {
        return it->second;
    }
    return VK_FORMAT_UNDEFINED;
}

static VkImageLayout StringToImageLayout(const std::string &input_value) {
    static const std::unordered_map<std::string, VkImageLayout> map = {
        {"VK_IMAGE_LAYOUT_UNDEFINED", VK_IMAGE_LAYOUT_UNDEFINED},
        {"VK_IMAGE_LAYOUT_GENERAL", VK_IMAGE_LAYOUT_GENERAL},
        {"VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL", VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
        {"VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL", VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
        {"VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL", VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL},
        {"VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL", VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL},
        {"VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL", VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL},
        {"VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL", VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL},
        {"VK_IMAGE_LAYOUT_PREINITIALIZED", VK_IMAGE_LAYOUT_PREINITIALIZED},
        {"VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL", VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL},
        {"VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL", VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL},
        {"VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL", VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL},
        {"VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL", VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL},
        {"VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL", VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL},
        {"VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL", VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL},
        {"VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL", VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL},
        {"VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL", VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL},
        {"VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ", VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ},
        {"VK_IMAGE_LAYOUT_PRESENT_SRC_KHR", VK_IMAGE_LAYOUT_PRESENT_SRC_KHR},
        {"VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR", VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR},
        {"VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR", VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR},
        {"VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR", VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR},
        {"VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR", VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR},
        {"VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT", VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT},
        {"VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR", VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR},
        {"VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR", VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR},
        {"VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR", VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR},
        {"VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR", VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR},
        {"VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT", VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT},
        {"VK_IMAGE_LAYOUT_TENSOR_ALIASING_ARM", VK_IMAGE_LAYOUT_TENSOR_ALIASING_ARM},
        {"VK_IMAGE_LAYOUT_VIDEO_ENCODE_QUANTIZATION_MAP_KHR", VK_IMAGE_LAYOUT_VIDEO_ENCODE_QUANTIZATION_MAP_KHR},
        {"VK_IMAGE_LAYOUT_ZERO_INITIALIZED_EXT", VK_IMAGE_LAYOUT_ZERO_INITIALIZED_EXT},
        {"VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR", VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR},
        {"VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR", VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR},
        {"VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV", VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV},
        {"VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR", VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR},
        {"VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR", VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR},
        {"VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR", VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR},
        {"VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR", VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR},
        {"VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR", VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR},
        {"VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR", VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR},
        {"VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR", VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR},
    };
    const auto it = map.find(input_value);
    if (it != map.end()) {
        return it->second;
    }
    return VK_IMAGE_LAYOUT_UNDEFINED;
}

static uint64_t VkStringToUint64(const std::string &input_value) {
    static const std::unordered_map<std::string, uint64_t> map = {
        // StdVideoAV1Profile
        {"STD_VIDEO_AV1_PROFILE_MAIN", static_cast<uint64_t>(STD_VIDEO_AV1_PROFILE_MAIN)},
        {"STD_VIDEO_AV1_PROFILE_HIGH", static_cast<uint64_t>(STD_VIDEO_AV1_PROFILE_HIGH)},
        {"STD_VIDEO_AV1_PROFILE_PROFESSIONAL", static_cast<uint64_t>(STD_VIDEO_AV1_PROFILE_PROFESSIONAL)},
        {"STD_VIDEO_AV1_PROFILE_INVALID", static_cast<uint64_t>(STD_VIDEO_AV1_PROFILE_INVALID)},
        // VkImageTiling
        {"VK_IMAGE_TILING_OPTIMAL", static_cast<uint64_t>(VK_IMAGE_TILING_OPTIMAL)},
        {"VK_IMAGE_TILING_LINEAR", static_cast<uint64_t>(VK_IMAGE_TILING_LINEAR)},
        {"VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT", static_cast<uint64_t>(VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT)},
        // StdVideoH265ProfileIdc
        {"STD_VIDEO_H265_PROFILE_IDC_MAIN", static_cast<uint64_t>(STD_VIDEO_H265_PROFILE_IDC_MAIN)},
        {"STD_VIDEO_H265_PROFILE_IDC_MAIN_10", static_cast<uint64_t>(STD_VIDEO_H265_PROFILE_IDC_MAIN_10)},
        {"STD_VIDEO_H265_PROFILE_IDC_MAIN_STILL_PICTURE", static_cast<uint64_t>(STD_VIDEO_H265_PROFILE_IDC_MAIN_STILL_PICTURE)},
        {"STD_VIDEO_H265_PROFILE_IDC_FORMAT_RANGE_EXTENSIONS", static_cast<uint64_t>(STD_VIDEO_H265_PROFILE_IDC_FORMAT_RANGE_EXTENSIONS)},
        {"STD_VIDEO_H265_PROFILE_IDC_SCC_EXTENSIONS", static_cast<uint64_t>(STD_VIDEO_H265_PROFILE_IDC_SCC_EXTENSIONS)},
        {"STD_VIDEO_H265_PROFILE_IDC_INVALID", static_cast<uint64_t>(STD_VIDEO_H265_PROFILE_IDC_INVALID)},
        // VkShaderStageFlagBits
        {"VK_SHADER_STAGE_VERTEX_BIT", static_cast<uint64_t>(VK_SHADER_STAGE_VERTEX_BIT)},
        {"VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT", static_cast<uint64_t>(VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT)},
        {"VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT", static_cast<uint64_t>(VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT)},
        {"VK_SHADER_STAGE_GEOMETRY_BIT", static_cast<uint64_t>(VK_SHADER_STAGE_GEOMETRY_BIT)},
        {"VK_SHADER_STAGE_FRAGMENT_BIT", static_cast<uint64_t>(VK_SHADER_STAGE_FRAGMENT_BIT)},
        {"VK_SHADER_STAGE_COMPUTE_BIT", static_cast<uint64_t>(VK_SHADER_STAGE_COMPUTE_BIT)},
        {"VK_SHADER_STAGE_ALL_GRAPHICS", static_cast<uint64_t>(VK_SHADER_STAGE_ALL_GRAPHICS)},
        {"VK_SHADER_STAGE_ALL", static_cast<uint64_t>(VK_SHADER_STAGE_ALL)},
        {"VK_SHADER_STAGE_RAYGEN_BIT_KHR", static_cast<uint64_t>(VK_SHADER_STAGE_RAYGEN_BIT_KHR)},
        {"VK_SHADER_STAGE_ANY_HIT_BIT_KHR", static_cast<uint64_t>(VK_SHADER_STAGE_ANY_HIT_BIT_KHR)},
        {"VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR", static_cast<uint64_t>(VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR)},
        {"VK_SHADER_STAGE_MISS_BIT_KHR", static_cast<uint64_t>(VK_SHADER_STAGE_MISS_BIT_KHR)},
        {"VK_SHADER_STAGE_INTERSECTION_BIT_KHR", static_cast<uint64_t>(VK_SHADER_STAGE_INTERSECTION_BIT_KHR)},
        {"VK_SHADER_STAGE_CALLABLE_BIT_KHR", static_cast<uint64_t>(VK_SHADER_STAGE_CALLABLE_BIT_KHR)},
        {"VK_SHADER_STAGE_TASK_BIT_EXT", static_cast<uint64_t>(VK_SHADER_STAGE_TASK_BIT_EXT)},
        {"VK_SHADER_STAGE_MESH_BIT_EXT", static_cast<uint64_t>(VK_SHADER_STAGE_MESH_BIT_EXT)},
        {"VK_SHADER_STAGE_SUBPASS_SHADING_BIT_HUAWEI", static_cast<uint64_t>(VK_SHADER_STAGE_SUBPASS_SHADING_BIT_HUAWEI)},
        {"VK_SHADER_STAGE_CLUSTER_CULLING_BIT_HUAWEI", static_cast<uint64_t>(VK_SHADER_STAGE_CLUSTER_CULLING_BIT_HUAWEI)},
        {"VK_SHADER_STAGE_RAYGEN_BIT_NV", static_cast<uint64_t>(VK_SHADER_STAGE_RAYGEN_BIT_NV)},
        {"VK_SHADER_STAGE_ANY_HIT_BIT_NV", static_cast<uint64_t>(VK_SHADER_STAGE_ANY_HIT_BIT_NV)},
        {"VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV", static_cast<uint64_t>(VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV)},
        {"VK_SHADER_STAGE_MISS_BIT_NV", static_cast<uint64_t>(VK_SHADER_STAGE_MISS_BIT_NV)},
        {"VK_SHADER_STAGE_INTERSECTION_BIT_NV", static_cast<uint64_t>(VK_SHADER_STAGE_INTERSECTION_BIT_NV)},
        {"VK_SHADER_STAGE_CALLABLE_BIT_NV", static_cast<uint64_t>(VK_SHADER_STAGE_CALLABLE_BIT_NV)},
        {"VK_SHADER_STAGE_TASK_BIT_NV", static_cast<uint64_t>(VK_SHADER_STAGE_TASK_BIT_NV)},
        {"VK_SHADER_STAGE_MESH_BIT_NV", static_cast<uint64_t>(VK_SHADER_STAGE_MESH_BIT_NV)},
        // VkVideoEncodeRgbModelConversionFlagBitsVALVE
        {"VK_VIDEO_ENCODE_RGB_MODEL_CONVERSION_RGB_IDENTITY_BIT_VALVE", static_cast<uint64_t>(VK_VIDEO_ENCODE_RGB_MODEL_CONVERSION_RGB_IDENTITY_BIT_VALVE)},
        {"VK_VIDEO_ENCODE_RGB_MODEL_CONVERSION_YCBCR_IDENTITY_BIT_VALVE", static_cast<uint64_t>(VK_VIDEO_ENCODE_RGB_MODEL_CONVERSION_YCBCR_IDENTITY_BIT_VALVE)},
        {"VK_VIDEO_ENCODE_RGB_MODEL_CONVERSION_YCBCR_709_BIT_VALVE", static_cast<uint64_t>(VK_VIDEO_ENCODE_RGB_MODEL_CONVERSION_YCBCR_709_BIT_VALVE)},
        {"VK_VIDEO_ENCODE_RGB_MODEL_CONVERSION_YCBCR_601_BIT_VALVE", static_cast<uint64_t>(VK_VIDEO_ENCODE_RGB_MODEL_CONVERSION_YCBCR_601_BIT_VALVE)},
        {"VK_VIDEO_ENCODE_RGB_MODEL_CONVERSION_YCBCR_2020_BIT_VALVE", static_cast<uint64_t>(VK_VIDEO_ENCODE_RGB_MODEL_CONVERSION_YCBCR_2020_BIT_VALVE)},
        // VkVideoEncodePerPartitionFeedbackFlagBitsKHR
        {"VK_VIDEO_ENCODE_PER_PARTITION_FEEDBACK_STATUS_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_PER_PARTITION_FEEDBACK_STATUS_BIT_KHR)},
        {"VK_VIDEO_ENCODE_PER_PARTITION_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_PER_PARTITION_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_PER_PARTITION_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_PER_PARTITION_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR)},
        // VkPipelineRobustnessBufferBehavior
        {"VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT", static_cast<uint64_t>(VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT)},
        {"VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED", static_cast<uint64_t>(VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED)},
        {"VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS", static_cast<uint64_t>(VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS)},
        {"VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2", static_cast<uint64_t>(VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2)},
        {"VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT_EXT", static_cast<uint64_t>(VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT_EXT)},
        {"VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT", static_cast<uint64_t>(VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT)},
        {"VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_EXT", static_cast<uint64_t>(VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_EXT)},
        {"VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT", static_cast<uint64_t>(VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT)},
        // StdVideoH264ProfileIdc
        {"STD_VIDEO_H264_PROFILE_IDC_BASELINE", static_cast<uint64_t>(STD_VIDEO_H264_PROFILE_IDC_BASELINE)},
        {"STD_VIDEO_H264_PROFILE_IDC_MAIN", static_cast<uint64_t>(STD_VIDEO_H264_PROFILE_IDC_MAIN)},
        {"STD_VIDEO_H264_PROFILE_IDC_HIGH", static_cast<uint64_t>(STD_VIDEO_H264_PROFILE_IDC_HIGH)},
        {"STD_VIDEO_H264_PROFILE_IDC_HIGH_10", static_cast<uint64_t>(STD_VIDEO_H264_PROFILE_IDC_HIGH_10)},
        {"STD_VIDEO_H264_PROFILE_IDC_HIGH_422", static_cast<uint64_t>(STD_VIDEO_H264_PROFILE_IDC_HIGH_422)},
        {"STD_VIDEO_H264_PROFILE_IDC_HIGH_444_PREDICTIVE", static_cast<uint64_t>(STD_VIDEO_H264_PROFILE_IDC_HIGH_444_PREDICTIVE)},
        {"STD_VIDEO_H264_PROFILE_IDC_INVALID", static_cast<uint64_t>(STD_VIDEO_H264_PROFILE_IDC_INVALID)},
        // VkVideoEncodeAV1StdFlagBitsKHR
        {"VK_VIDEO_ENCODE_AV1_STD_UNIFORM_TILE_SPACING_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_AV1_STD_UNIFORM_TILE_SPACING_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_AV1_STD_SKIP_MODE_PRESENT_UNSET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_AV1_STD_SKIP_MODE_PRESENT_UNSET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_AV1_STD_PRIMARY_REF_FRAME_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_AV1_STD_PRIMARY_REF_FRAME_BIT_KHR)},
        {"VK_VIDEO_ENCODE_AV1_STD_DELTA_Q_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_AV1_STD_DELTA_Q_BIT_KHR)},
        // VkToolPurposeFlagBits
        {"VK_TOOL_PURPOSE_VALIDATION_BIT", static_cast<uint64_t>(VK_TOOL_PURPOSE_VALIDATION_BIT)},
        {"VK_TOOL_PURPOSE_PROFILING_BIT", static_cast<uint64_t>(VK_TOOL_PURPOSE_PROFILING_BIT)},
        {"VK_TOOL_PURPOSE_TRACING_BIT", static_cast<uint64_t>(VK_TOOL_PURPOSE_TRACING_BIT)},
        {"VK_TOOL_PURPOSE_ADDITIONAL_FEATURES_BIT", static_cast<uint64_t>(VK_TOOL_PURPOSE_ADDITIONAL_FEATURES_BIT)},
        {"VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT", static_cast<uint64_t>(VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT)},
        {"VK_TOOL_PURPOSE_DEBUG_REPORTING_BIT_EXT", static_cast<uint64_t>(VK_TOOL_PURPOSE_DEBUG_REPORTING_BIT_EXT)},
        {"VK_TOOL_PURPOSE_DEBUG_MARKERS_BIT_EXT", static_cast<uint64_t>(VK_TOOL_PURPOSE_DEBUG_MARKERS_BIT_EXT)},
        {"VK_TOOL_PURPOSE_DEBUG_REPORTING_BIT_EXT", static_cast<uint64_t>(VK_TOOL_PURPOSE_DEBUG_REPORTING_BIT_EXT)},
        {"VK_TOOL_PURPOSE_DEBUG_MARKERS_BIT_EXT", static_cast<uint64_t>(VK_TOOL_PURPOSE_DEBUG_MARKERS_BIT_EXT)},
        {"VK_TOOL_PURPOSE_VALIDATION_BIT_EXT", static_cast<uint64_t>(VK_TOOL_PURPOSE_VALIDATION_BIT_EXT)},
        {"VK_TOOL_PURPOSE_PROFILING_BIT_EXT", static_cast<uint64_t>(VK_TOOL_PURPOSE_PROFILING_BIT_EXT)},
        {"VK_TOOL_PURPOSE_TRACING_BIT_EXT", static_cast<uint64_t>(VK_TOOL_PURPOSE_TRACING_BIT_EXT)},
        {"VK_TOOL_PURPOSE_ADDITIONAL_FEATURES_BIT_EXT", static_cast<uint64_t>(VK_TOOL_PURPOSE_ADDITIONAL_FEATURES_BIT_EXT)},
        {"VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT_EXT", static_cast<uint64_t>(VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT_EXT)},
        // VkMemoryDecompressionMethodFlagBitsNV
        {"VK_MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_EXT", static_cast<uint64_t>(VK_MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_EXT)},
        {"VK_MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_NV", static_cast<uint64_t>(VK_MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_NV)},
        // VkVideoCodecOperationFlagBitsKHR
        {"VK_VIDEO_CODEC_OPERATION_NONE_KHR", static_cast<uint64_t>(VK_VIDEO_CODEC_OPERATION_NONE_KHR)},
        {"VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR)},
        {"VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR)},
        {"VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR)},
        {"VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR)},
        {"VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR)},
        {"VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR)},
        {"VK_VIDEO_CODEC_OPERATION_DECODE_VP9_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_CODEC_OPERATION_DECODE_VP9_BIT_KHR)},
        // VkImageType
        {"VK_IMAGE_TYPE_1D", static_cast<uint64_t>(VK_IMAGE_TYPE_1D)},
        {"VK_IMAGE_TYPE_2D", static_cast<uint64_t>(VK_IMAGE_TYPE_2D)},
        {"VK_IMAGE_TYPE_3D", static_cast<uint64_t>(VK_IMAGE_TYPE_3D)},
        // VkVideoEncodeH265CtbSizeFlagBitsKHR
        {"VK_VIDEO_ENCODE_H265_CTB_SIZE_16_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_CTB_SIZE_16_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_CTB_SIZE_32_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_CTB_SIZE_32_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_CTB_SIZE_64_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_CTB_SIZE_64_BIT_KHR)},
        // StdVideoAV1Level
        {"STD_VIDEO_AV1_LEVEL_2_0", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_2_0)},
        {"STD_VIDEO_AV1_LEVEL_2_1", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_2_1)},
        {"STD_VIDEO_AV1_LEVEL_2_2", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_2_2)},
        {"STD_VIDEO_AV1_LEVEL_2_3", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_2_3)},
        {"STD_VIDEO_AV1_LEVEL_3_0", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_3_0)},
        {"STD_VIDEO_AV1_LEVEL_3_1", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_3_1)},
        {"STD_VIDEO_AV1_LEVEL_3_2", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_3_2)},
        {"STD_VIDEO_AV1_LEVEL_3_3", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_3_3)},
        {"STD_VIDEO_AV1_LEVEL_4_0", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_4_0)},
        {"STD_VIDEO_AV1_LEVEL_4_1", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_4_1)},
        {"STD_VIDEO_AV1_LEVEL_4_2", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_4_2)},
        {"STD_VIDEO_AV1_LEVEL_4_3", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_4_3)},
        {"STD_VIDEO_AV1_LEVEL_5_0", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_5_0)},
        {"STD_VIDEO_AV1_LEVEL_5_1", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_5_1)},
        {"STD_VIDEO_AV1_LEVEL_5_2", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_5_2)},
        {"STD_VIDEO_AV1_LEVEL_5_3", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_5_3)},
        {"STD_VIDEO_AV1_LEVEL_6_0", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_6_0)},
        {"STD_VIDEO_AV1_LEVEL_6_1", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_6_1)},
        {"STD_VIDEO_AV1_LEVEL_6_2", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_6_2)},
        {"STD_VIDEO_AV1_LEVEL_6_3", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_6_3)},
        {"STD_VIDEO_AV1_LEVEL_7_0", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_7_0)},
        {"STD_VIDEO_AV1_LEVEL_7_1", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_7_1)},
        {"STD_VIDEO_AV1_LEVEL_7_2", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_7_2)},
        {"STD_VIDEO_AV1_LEVEL_7_3", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_7_3)},
        {"STD_VIDEO_AV1_LEVEL_INVALID", static_cast<uint64_t>(STD_VIDEO_AV1_LEVEL_INVALID)},
        // VkIndirectCommandsInputModeFlagBitsEXT
        {"VK_INDIRECT_COMMANDS_INPUT_MODE_VULKAN_INDEX_BUFFER_EXT", static_cast<uint64_t>(VK_INDIRECT_COMMANDS_INPUT_MODE_VULKAN_INDEX_BUFFER_EXT)},
        {"VK_INDIRECT_COMMANDS_INPUT_MODE_DXGI_INDEX_BUFFER_EXT", static_cast<uint64_t>(VK_INDIRECT_COMMANDS_INPUT_MODE_DXGI_INDEX_BUFFER_EXT)},
        // VkVideoEncodeRgbChromaOffsetFlagBitsVALVE
        {"VK_VIDEO_ENCODE_RGB_CHROMA_OFFSET_COSITED_EVEN_BIT_VALVE", static_cast<uint64_t>(VK_VIDEO_ENCODE_RGB_CHROMA_OFFSET_COSITED_EVEN_BIT_VALVE)},
        {"VK_VIDEO_ENCODE_RGB_CHROMA_OFFSET_MIDPOINT_BIT_VALVE", static_cast<uint64_t>(VK_VIDEO_ENCODE_RGB_CHROMA_OFFSET_MIDPOINT_BIT_VALVE)},
        // VkVideoDecodeH264PictureLayoutFlagBitsKHR
        {"VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR", static_cast<uint64_t>(VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR)},
        {"VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR)},
        {"VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR)},
        // VkVideoDecodeCapabilityFlagBitsKHR
        {"VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR)},
        {"VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR)},
        // VkSampleCountFlagBits
        {"VK_SAMPLE_COUNT_1_BIT", static_cast<uint64_t>(VK_SAMPLE_COUNT_1_BIT)},
        {"VK_SAMPLE_COUNT_2_BIT", static_cast<uint64_t>(VK_SAMPLE_COUNT_2_BIT)},
        {"VK_SAMPLE_COUNT_4_BIT", static_cast<uint64_t>(VK_SAMPLE_COUNT_4_BIT)},
        {"VK_SAMPLE_COUNT_8_BIT", static_cast<uint64_t>(VK_SAMPLE_COUNT_8_BIT)},
        {"VK_SAMPLE_COUNT_16_BIT", static_cast<uint64_t>(VK_SAMPLE_COUNT_16_BIT)},
        {"VK_SAMPLE_COUNT_32_BIT", static_cast<uint64_t>(VK_SAMPLE_COUNT_32_BIT)},
        {"VK_SAMPLE_COUNT_64_BIT", static_cast<uint64_t>(VK_SAMPLE_COUNT_64_BIT)},
        // VkVideoEncodeAV1SuperblockSizeFlagBitsKHR
        {"VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_64_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_64_BIT_KHR)},
        {"VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_128_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_128_BIT_KHR)},
        // VkVideoEncodeH264CapabilityFlagBitsKHR
        {"VK_VIDEO_ENCODE_H264_CAPABILITY_HRD_COMPLIANCE_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_CAPABILITY_HRD_COMPLIANCE_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_CAPABILITY_PREDICTION_WEIGHT_TABLE_GENERATED_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_CAPABILITY_PREDICTION_WEIGHT_TABLE_GENERATED_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_CAPABILITY_ROW_UNALIGNED_SLICE_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_CAPABILITY_ROW_UNALIGNED_SLICE_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_CAPABILITY_DIFFERENT_SLICE_TYPE_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_CAPABILITY_DIFFERENT_SLICE_TYPE_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L0_LIST_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L0_LIST_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_CAPABILITY_PER_SLICE_CONSTANT_QP_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_CAPABILITY_PER_SLICE_CONSTANT_QP_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_CAPABILITY_GENERATE_PREFIX_NALU_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_CAPABILITY_GENERATE_PREFIX_NALU_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_CAPABILITY_B_PICTURE_INTRA_REFRESH_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_CAPABILITY_B_PICTURE_INTRA_REFRESH_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_CAPABILITY_MB_QP_DIFF_WRAPAROUND_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_CAPABILITY_MB_QP_DIFF_WRAPAROUND_BIT_KHR)},
        // VkPhysicalDeviceSchedulingControlsFlagBitsARM
        {"VK_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_SHADER_CORE_COUNT_ARM", static_cast<uint64_t>(VK_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_SHADER_CORE_COUNT_ARM)},
        {"VK_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_DISPATCH_PARAMETERS_ARM", static_cast<uint64_t>(VK_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_DISPATCH_PARAMETERS_ARM)},
        // VkDefaultVertexAttributeValueKHR
        {"VK_DEFAULT_VERTEX_ATTRIBUTE_VALUE_ZERO_ZERO_ZERO_ZERO_KHR", static_cast<uint64_t>(VK_DEFAULT_VERTEX_ATTRIBUTE_VALUE_ZERO_ZERO_ZERO_ZERO_KHR)},
        {"VK_DEFAULT_VERTEX_ATTRIBUTE_VALUE_ZERO_ZERO_ZERO_ONE_KHR", static_cast<uint64_t>(VK_DEFAULT_VERTEX_ATTRIBUTE_VALUE_ZERO_ZERO_ZERO_ONE_KHR)},
        // StdVideoVP9Level
        {"STD_VIDEO_VP9_LEVEL_1_0", static_cast<uint64_t>(STD_VIDEO_VP9_LEVEL_1_0)},
        {"STD_VIDEO_VP9_LEVEL_1_1", static_cast<uint64_t>(STD_VIDEO_VP9_LEVEL_1_1)},
        {"STD_VIDEO_VP9_LEVEL_2_0", static_cast<uint64_t>(STD_VIDEO_VP9_LEVEL_2_0)},
        {"STD_VIDEO_VP9_LEVEL_2_1", static_cast<uint64_t>(STD_VIDEO_VP9_LEVEL_2_1)},
        {"STD_VIDEO_VP9_LEVEL_3_0", static_cast<uint64_t>(STD_VIDEO_VP9_LEVEL_3_0)},
        {"STD_VIDEO_VP9_LEVEL_3_1", static_cast<uint64_t>(STD_VIDEO_VP9_LEVEL_3_1)},
        {"STD_VIDEO_VP9_LEVEL_4_0", static_cast<uint64_t>(STD_VIDEO_VP9_LEVEL_4_0)},
        {"STD_VIDEO_VP9_LEVEL_4_1", static_cast<uint64_t>(STD_VIDEO_VP9_LEVEL_4_1)},
        {"STD_VIDEO_VP9_LEVEL_5_0", static_cast<uint64_t>(STD_VIDEO_VP9_LEVEL_5_0)},
        {"STD_VIDEO_VP9_LEVEL_5_1", static_cast<uint64_t>(STD_VIDEO_VP9_LEVEL_5_1)},
        {"STD_VIDEO_VP9_LEVEL_5_2", static_cast<uint64_t>(STD_VIDEO_VP9_LEVEL_5_2)},
        {"STD_VIDEO_VP9_LEVEL_6_0", static_cast<uint64_t>(STD_VIDEO_VP9_LEVEL_6_0)},
        {"STD_VIDEO_VP9_LEVEL_6_1", static_cast<uint64_t>(STD_VIDEO_VP9_LEVEL_6_1)},
        {"STD_VIDEO_VP9_LEVEL_6_2", static_cast<uint64_t>(STD_VIDEO_VP9_LEVEL_6_2)},
        {"STD_VIDEO_VP9_LEVEL_INVALID", static_cast<uint64_t>(STD_VIDEO_VP9_LEVEL_INVALID)},
        // VkPointClippingBehavior
        {"VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES", static_cast<uint64_t>(VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES)},
        {"VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY", static_cast<uint64_t>(VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY)},
        {"VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES_KHR", static_cast<uint64_t>(VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES_KHR)},
        {"VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY_KHR", static_cast<uint64_t>(VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY_KHR)},
        // VkVideoEncodeH265TransformBlockSizeFlagBitsKHR
        {"VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_4_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_4_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_8_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_8_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_16_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_16_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_32_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_32_BIT_KHR)},
        // VkImageUsageFlagBits
        {"VK_IMAGE_USAGE_TRANSFER_SRC_BIT", static_cast<uint64_t>(VK_IMAGE_USAGE_TRANSFER_SRC_BIT)},
        {"VK_IMAGE_USAGE_TRANSFER_DST_BIT", static_cast<uint64_t>(VK_IMAGE_USAGE_TRANSFER_DST_BIT)},
        {"VK_IMAGE_USAGE_SAMPLED_BIT", static_cast<uint64_t>(VK_IMAGE_USAGE_SAMPLED_BIT)},
        {"VK_IMAGE_USAGE_STORAGE_BIT", static_cast<uint64_t>(VK_IMAGE_USAGE_STORAGE_BIT)},
        {"VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT", static_cast<uint64_t>(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)},
        {"VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT", static_cast<uint64_t>(VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)},
        {"VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT", static_cast<uint64_t>(VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT)},
        {"VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT", static_cast<uint64_t>(VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)},
        {"VK_IMAGE_USAGE_HOST_TRANSFER_BIT", static_cast<uint64_t>(VK_IMAGE_USAGE_HOST_TRANSFER_BIT)},
        {"VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR", static_cast<uint64_t>(VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR)},
        {"VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR", static_cast<uint64_t>(VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR)},
        {"VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR", static_cast<uint64_t>(VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR)},
        {"VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT", static_cast<uint64_t>(VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT)},
        {"VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR", static_cast<uint64_t>(VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR)},
        {"VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR", static_cast<uint64_t>(VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR)},
        {"VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR", static_cast<uint64_t>(VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR)},
        {"VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR", static_cast<uint64_t>(VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR)},
        {"VK_IMAGE_USAGE_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT", static_cast<uint64_t>(VK_IMAGE_USAGE_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT)},
        {"VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI", static_cast<uint64_t>(VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI)},
        {"VK_IMAGE_USAGE_SAMPLE_WEIGHT_BIT_QCOM", static_cast<uint64_t>(VK_IMAGE_USAGE_SAMPLE_WEIGHT_BIT_QCOM)},
        {"VK_IMAGE_USAGE_SAMPLE_BLOCK_MATCH_BIT_QCOM", static_cast<uint64_t>(VK_IMAGE_USAGE_SAMPLE_BLOCK_MATCH_BIT_QCOM)},
        {"VK_IMAGE_USAGE_TENSOR_ALIASING_BIT_ARM", static_cast<uint64_t>(VK_IMAGE_USAGE_TENSOR_ALIASING_BIT_ARM)},
        {"VK_IMAGE_USAGE_TILE_MEMORY_BIT_QCOM", static_cast<uint64_t>(VK_IMAGE_USAGE_TILE_MEMORY_BIT_QCOM)},
        {"VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR", static_cast<uint64_t>(VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR)},
        {"VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR", static_cast<uint64_t>(VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR)},
        {"VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV", static_cast<uint64_t>(VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV)},
        {"VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT", static_cast<uint64_t>(VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT)},
        // VkVideoEncodeH265CapabilityFlagBitsKHR
        {"VK_VIDEO_ENCODE_H265_CAPABILITY_HRD_COMPLIANCE_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_CAPABILITY_HRD_COMPLIANCE_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_CAPABILITY_PREDICTION_WEIGHT_TABLE_GENERATED_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_CAPABILITY_PREDICTION_WEIGHT_TABLE_GENERATED_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_CAPABILITY_ROW_UNALIGNED_SLICE_SEGMENT_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_CAPABILITY_ROW_UNALIGNED_SLICE_SEGMENT_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_CAPABILITY_DIFFERENT_SLICE_SEGMENT_TYPE_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_CAPABILITY_DIFFERENT_SLICE_SEGMENT_TYPE_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_CAPABILITY_B_FRAME_IN_L0_LIST_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_CAPABILITY_B_FRAME_IN_L0_LIST_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_CAPABILITY_PER_SLICE_SEGMENT_CONSTANT_QP_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_CAPABILITY_PER_SLICE_SEGMENT_CONSTANT_QP_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_CAPABILITY_MULTIPLE_TILES_PER_SLICE_SEGMENT_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_CAPABILITY_MULTIPLE_TILES_PER_SLICE_SEGMENT_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_CAPABILITY_MULTIPLE_SLICE_SEGMENTS_PER_TILE_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_CAPABILITY_MULTIPLE_SLICE_SEGMENTS_PER_TILE_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_CAPABILITY_B_PICTURE_INTRA_REFRESH_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_CAPABILITY_B_PICTURE_INTRA_REFRESH_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_CAPABILITY_CU_QP_DIFF_WRAPAROUND_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_CAPABILITY_CU_QP_DIFF_WRAPAROUND_BIT_KHR)},
        // VkVideoEncodeRgbRangeCompressionFlagBitsVALVE
        {"VK_VIDEO_ENCODE_RGB_RANGE_COMPRESSION_FULL_RANGE_BIT_VALVE", static_cast<uint64_t>(VK_VIDEO_ENCODE_RGB_RANGE_COMPRESSION_FULL_RANGE_BIT_VALVE)},
        {"VK_VIDEO_ENCODE_RGB_RANGE_COMPRESSION_NARROW_RANGE_BIT_VALVE", static_cast<uint64_t>(VK_VIDEO_ENCODE_RGB_RANGE_COMPRESSION_NARROW_RANGE_BIT_VALVE)},
        // StdVideoVP9Profile
        {"STD_VIDEO_VP9_PROFILE_0", static_cast<uint64_t>(STD_VIDEO_VP9_PROFILE_0)},
        {"STD_VIDEO_VP9_PROFILE_1", static_cast<uint64_t>(STD_VIDEO_VP9_PROFILE_1)},
        {"STD_VIDEO_VP9_PROFILE_2", static_cast<uint64_t>(STD_VIDEO_VP9_PROFILE_2)},
        {"STD_VIDEO_VP9_PROFILE_3", static_cast<uint64_t>(STD_VIDEO_VP9_PROFILE_3)},
        {"STD_VIDEO_VP9_PROFILE_INVALID", static_cast<uint64_t>(STD_VIDEO_VP9_PROFILE_INVALID)},
        // VkVideoEncodeH264StdFlagBitsKHR
        {"VK_VIDEO_ENCODE_H264_STD_SEPARATE_COLOR_PLANE_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_STD_SEPARATE_COLOR_PLANE_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_STD_QPPRIME_Y_ZERO_TRANSFORM_BYPASS_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_STD_QPPRIME_Y_ZERO_TRANSFORM_BYPASS_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_STD_SCALING_MATRIX_PRESENT_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_STD_SCALING_MATRIX_PRESENT_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_STD_CHROMA_QP_INDEX_OFFSET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_STD_CHROMA_QP_INDEX_OFFSET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_STD_SECOND_CHROMA_QP_INDEX_OFFSET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_STD_SECOND_CHROMA_QP_INDEX_OFFSET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_STD_PIC_INIT_QP_MINUS26_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_STD_PIC_INIT_QP_MINUS26_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_STD_WEIGHTED_PRED_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_STD_WEIGHTED_PRED_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_STD_WEIGHTED_BIPRED_IDC_EXPLICIT_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_STD_WEIGHTED_BIPRED_IDC_EXPLICIT_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_STD_WEIGHTED_BIPRED_IDC_IMPLICIT_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_STD_WEIGHTED_BIPRED_IDC_IMPLICIT_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_STD_TRANSFORM_8X8_MODE_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_STD_TRANSFORM_8X8_MODE_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_STD_DIRECT_SPATIAL_MV_PRED_FLAG_UNSET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_STD_DIRECT_SPATIAL_MV_PRED_FLAG_UNSET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_STD_ENTROPY_CODING_MODE_FLAG_UNSET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_STD_ENTROPY_CODING_MODE_FLAG_UNSET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_STD_ENTROPY_CODING_MODE_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_STD_ENTROPY_CODING_MODE_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_STD_DIRECT_8X8_INFERENCE_FLAG_UNSET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_STD_DIRECT_8X8_INFERENCE_FLAG_UNSET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_STD_CONSTRAINED_INTRA_PRED_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_STD_CONSTRAINED_INTRA_PRED_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_DISABLED_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_DISABLED_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_ENABLED_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_ENABLED_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_PARTIAL_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_PARTIAL_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_STD_SLICE_QP_DELTA_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_STD_SLICE_QP_DELTA_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H264_STD_DIFFERENT_SLICE_QP_DELTA_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H264_STD_DIFFERENT_SLICE_QP_DELTA_BIT_KHR)},
        // VkPipelineRobustnessImageBehavior
        {"VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT", static_cast<uint64_t>(VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT)},
        {"VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED", static_cast<uint64_t>(VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED)},
        {"VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS", static_cast<uint64_t>(VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS)},
        {"VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2", static_cast<uint64_t>(VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2)},
        {"VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT_EXT", static_cast<uint64_t>(VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT_EXT)},
        {"VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED_EXT", static_cast<uint64_t>(VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED_EXT)},
        {"VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_EXT", static_cast<uint64_t>(VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_EXT)},
        {"VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2_EXT", static_cast<uint64_t>(VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2_EXT)},
        // VkVideoCapabilityFlagBitsKHR
        {"VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR)},
        {"VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR)},
        // VkVideoEncodeH265StdFlagBitsKHR
        {"VK_VIDEO_ENCODE_H265_STD_SEPARATE_COLOR_PLANE_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_SEPARATE_COLOR_PLANE_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_STD_SAMPLE_ADAPTIVE_OFFSET_ENABLED_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_SAMPLE_ADAPTIVE_OFFSET_ENABLED_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_STD_SCALING_LIST_DATA_PRESENT_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_SCALING_LIST_DATA_PRESENT_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_STD_PCM_ENABLED_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_PCM_ENABLED_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_STD_SPS_TEMPORAL_MVP_ENABLED_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_SPS_TEMPORAL_MVP_ENABLED_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_STD_INIT_QP_MINUS26_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_INIT_QP_MINUS26_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_STD_WEIGHTED_PRED_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_WEIGHTED_PRED_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_STD_WEIGHTED_BIPRED_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_WEIGHTED_BIPRED_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_STD_LOG2_PARALLEL_MERGE_LEVEL_MINUS2_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_LOG2_PARALLEL_MERGE_LEVEL_MINUS2_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_STD_SIGN_DATA_HIDING_ENABLED_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_SIGN_DATA_HIDING_ENABLED_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_STD_TRANSFORM_SKIP_ENABLED_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_TRANSFORM_SKIP_ENABLED_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_STD_TRANSFORM_SKIP_ENABLED_FLAG_UNSET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_TRANSFORM_SKIP_ENABLED_FLAG_UNSET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_STD_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_STD_TRANSQUANT_BYPASS_ENABLED_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_TRANSQUANT_BYPASS_ENABLED_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_STD_CONSTRAINED_INTRA_PRED_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_CONSTRAINED_INTRA_PRED_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_STD_ENTROPY_CODING_SYNC_ENABLED_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_ENTROPY_CODING_SYNC_ENABLED_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_STD_DEBLOCKING_FILTER_OVERRIDE_ENABLED_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_DEBLOCKING_FILTER_OVERRIDE_ENABLED_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_STD_DEPENDENT_SLICE_SEGMENTS_ENABLED_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_DEPENDENT_SLICE_SEGMENTS_ENABLED_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_STD_DEPENDENT_SLICE_SEGMENT_FLAG_SET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_DEPENDENT_SLICE_SEGMENT_FLAG_SET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_STD_SLICE_QP_DELTA_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_SLICE_QP_DELTA_BIT_KHR)},
        {"VK_VIDEO_ENCODE_H265_STD_DIFFERENT_SLICE_QP_DELTA_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_H265_STD_DIFFERENT_SLICE_QP_DELTA_BIT_KHR)},
        // VkSubgroupFeatureFlagBits
        {"VK_SUBGROUP_FEATURE_BASIC_BIT", static_cast<uint64_t>(VK_SUBGROUP_FEATURE_BASIC_BIT)},
        {"VK_SUBGROUP_FEATURE_VOTE_BIT", static_cast<uint64_t>(VK_SUBGROUP_FEATURE_VOTE_BIT)},
        {"VK_SUBGROUP_FEATURE_ARITHMETIC_BIT", static_cast<uint64_t>(VK_SUBGROUP_FEATURE_ARITHMETIC_BIT)},
        {"VK_SUBGROUP_FEATURE_BALLOT_BIT", static_cast<uint64_t>(VK_SUBGROUP_FEATURE_BALLOT_BIT)},
        {"VK_SUBGROUP_FEATURE_SHUFFLE_BIT", static_cast<uint64_t>(VK_SUBGROUP_FEATURE_SHUFFLE_BIT)},
        {"VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT", static_cast<uint64_t>(VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT)},
        {"VK_SUBGROUP_FEATURE_CLUSTERED_BIT", static_cast<uint64_t>(VK_SUBGROUP_FEATURE_CLUSTERED_BIT)},
        {"VK_SUBGROUP_FEATURE_QUAD_BIT", static_cast<uint64_t>(VK_SUBGROUP_FEATURE_QUAD_BIT)},
        {"VK_SUBGROUP_FEATURE_ROTATE_BIT", static_cast<uint64_t>(VK_SUBGROUP_FEATURE_ROTATE_BIT)},
        {"VK_SUBGROUP_FEATURE_ROTATE_CLUSTERED_BIT", static_cast<uint64_t>(VK_SUBGROUP_FEATURE_ROTATE_CLUSTERED_BIT)},
        {"VK_SUBGROUP_FEATURE_PARTITIONED_BIT_EXT", static_cast<uint64_t>(VK_SUBGROUP_FEATURE_PARTITIONED_BIT_EXT)},
        {"VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV", static_cast<uint64_t>(VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV)},
        {"VK_SUBGROUP_FEATURE_ROTATE_BIT_KHR", static_cast<uint64_t>(VK_SUBGROUP_FEATURE_ROTATE_BIT_KHR)},
        {"VK_SUBGROUP_FEATURE_ROTATE_CLUSTERED_BIT_KHR", static_cast<uint64_t>(VK_SUBGROUP_FEATURE_ROTATE_CLUSTERED_BIT_KHR)},
        // VkVideoEncodeAV1CapabilityFlagBitsKHR
        {"VK_VIDEO_ENCODE_AV1_CAPABILITY_PER_RATE_CONTROL_GROUP_MIN_MAX_Q_INDEX_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_AV1_CAPABILITY_PER_RATE_CONTROL_GROUP_MIN_MAX_Q_INDEX_BIT_KHR)},
        {"VK_VIDEO_ENCODE_AV1_CAPABILITY_GENERATE_OBU_EXTENSION_HEADER_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_AV1_CAPABILITY_GENERATE_OBU_EXTENSION_HEADER_BIT_KHR)},
        {"VK_VIDEO_ENCODE_AV1_CAPABILITY_PRIMARY_REFERENCE_CDF_ONLY_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_AV1_CAPABILITY_PRIMARY_REFERENCE_CDF_ONLY_BIT_KHR)},
        {"VK_VIDEO_ENCODE_AV1_CAPABILITY_FRAME_SIZE_OVERRIDE_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_AV1_CAPABILITY_FRAME_SIZE_OVERRIDE_BIT_KHR)},
        {"VK_VIDEO_ENCODE_AV1_CAPABILITY_MOTION_VECTOR_SCALING_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_AV1_CAPABILITY_MOTION_VECTOR_SCALING_BIT_KHR)},
        {"VK_VIDEO_ENCODE_AV1_CAPABILITY_COMPOUND_PREDICTION_INTRA_REFRESH_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_AV1_CAPABILITY_COMPOUND_PREDICTION_INTRA_REFRESH_BIT_KHR)},
        // StdVideoH265LevelIdc
        {"STD_VIDEO_H265_LEVEL_IDC_1_0", static_cast<uint64_t>(STD_VIDEO_H265_LEVEL_IDC_1_0)},
        {"STD_VIDEO_H265_LEVEL_IDC_2_0", static_cast<uint64_t>(STD_VIDEO_H265_LEVEL_IDC_2_0)},
        {"STD_VIDEO_H265_LEVEL_IDC_2_1", static_cast<uint64_t>(STD_VIDEO_H265_LEVEL_IDC_2_1)},
        {"STD_VIDEO_H265_LEVEL_IDC_3_0", static_cast<uint64_t>(STD_VIDEO_H265_LEVEL_IDC_3_0)},
        {"STD_VIDEO_H265_LEVEL_IDC_3_1", static_cast<uint64_t>(STD_VIDEO_H265_LEVEL_IDC_3_1)},
        {"STD_VIDEO_H265_LEVEL_IDC_4_0", static_cast<uint64_t>(STD_VIDEO_H265_LEVEL_IDC_4_0)},
        {"STD_VIDEO_H265_LEVEL_IDC_4_1", static_cast<uint64_t>(STD_VIDEO_H265_LEVEL_IDC_4_1)},
        {"STD_VIDEO_H265_LEVEL_IDC_5_0", static_cast<uint64_t>(STD_VIDEO_H265_LEVEL_IDC_5_0)},
        {"STD_VIDEO_H265_LEVEL_IDC_5_1", static_cast<uint64_t>(STD_VIDEO_H265_LEVEL_IDC_5_1)},
        {"STD_VIDEO_H265_LEVEL_IDC_5_2", static_cast<uint64_t>(STD_VIDEO_H265_LEVEL_IDC_5_2)},
        {"STD_VIDEO_H265_LEVEL_IDC_6_0", static_cast<uint64_t>(STD_VIDEO_H265_LEVEL_IDC_6_0)},
        {"STD_VIDEO_H265_LEVEL_IDC_6_1", static_cast<uint64_t>(STD_VIDEO_H265_LEVEL_IDC_6_1)},
        {"STD_VIDEO_H265_LEVEL_IDC_6_2", static_cast<uint64_t>(STD_VIDEO_H265_LEVEL_IDC_6_2)},
        {"STD_VIDEO_H265_LEVEL_IDC_INVALID", static_cast<uint64_t>(STD_VIDEO_H265_LEVEL_IDC_INVALID)},
        // VkOpticalFlowGridSizeFlagBitsNV
        {"VK_OPTICAL_FLOW_GRID_SIZE_UNKNOWN_NV", static_cast<uint64_t>(VK_OPTICAL_FLOW_GRID_SIZE_UNKNOWN_NV)},
        {"VK_OPTICAL_FLOW_GRID_SIZE_1X1_BIT_NV", static_cast<uint64_t>(VK_OPTICAL_FLOW_GRID_SIZE_1X1_BIT_NV)},
        {"VK_OPTICAL_FLOW_GRID_SIZE_2X2_BIT_NV", static_cast<uint64_t>(VK_OPTICAL_FLOW_GRID_SIZE_2X2_BIT_NV)},
        {"VK_OPTICAL_FLOW_GRID_SIZE_4X4_BIT_NV", static_cast<uint64_t>(VK_OPTICAL_FLOW_GRID_SIZE_4X4_BIT_NV)},
        {"VK_OPTICAL_FLOW_GRID_SIZE_8X8_BIT_NV", static_cast<uint64_t>(VK_OPTICAL_FLOW_GRID_SIZE_8X8_BIT_NV)},
        // VkBufferUsageFlagBits
        {"VK_BUFFER_USAGE_TRANSFER_SRC_BIT", static_cast<uint64_t>(VK_BUFFER_USAGE_TRANSFER_SRC_BIT)},
        {"VK_BUFFER_USAGE_TRANSFER_DST_BIT", static_cast<uint64_t>(VK_BUFFER_USAGE_TRANSFER_DST_BIT)},
        {"VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT", static_cast<uint64_t>(VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)},
        {"VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT", static_cast<uint64_t>(VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT)},
        {"VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT", static_cast<uint64_t>(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)},
        {"VK_BUFFER_USAGE_STORAGE_BUFFER_BIT", static_cast<uint64_t>(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)},
        {"VK_BUFFER_USAGE_INDEX_BUFFER_BIT", static_cast<uint64_t>(VK_BUFFER_USAGE_INDEX_BUFFER_BIT)},
        {"VK_BUFFER_USAGE_VERTEX_BUFFER_BIT", static_cast<uint64_t>(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)},
        {"VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT", static_cast<uint64_t>(VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT)},
        {"VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT", static_cast<uint64_t>(VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT)},
        {"VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR", static_cast<uint64_t>(VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR)},
        {"VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR", static_cast<uint64_t>(VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR)},
        {"VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT", static_cast<uint64_t>(VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT)},
        {"VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT", static_cast<uint64_t>(VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT)},
        {"VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT", static_cast<uint64_t>(VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT)},
        {"VK_BUFFER_USAGE_EXECUTION_GRAPH_SCRATCH_BIT_AMDX", static_cast<uint64_t>(VK_BUFFER_USAGE_EXECUTION_GRAPH_SCRATCH_BIT_AMDX)},
        {"VK_BUFFER_USAGE_DESCRIPTOR_HEAP_BIT_EXT", static_cast<uint64_t>(VK_BUFFER_USAGE_DESCRIPTOR_HEAP_BIT_EXT)},
        {"VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR", static_cast<uint64_t>(VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR)},
        {"VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR", static_cast<uint64_t>(VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR)},
        {"VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR", static_cast<uint64_t>(VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR)},
        {"VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR", static_cast<uint64_t>(VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR)},
        {"VK_BUFFER_USAGE_VIDEO_ENCODE_SRC_BIT_KHR", static_cast<uint64_t>(VK_BUFFER_USAGE_VIDEO_ENCODE_SRC_BIT_KHR)},
        {"VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT", static_cast<uint64_t>(VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT)},
        {"VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT", static_cast<uint64_t>(VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT)},
        {"VK_BUFFER_USAGE_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT", static_cast<uint64_t>(VK_BUFFER_USAGE_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT)},
        {"VK_BUFFER_USAGE_MICROMAP_BUILD_INPUT_READ_ONLY_BIT_EXT", static_cast<uint64_t>(VK_BUFFER_USAGE_MICROMAP_BUILD_INPUT_READ_ONLY_BIT_EXT)},
        {"VK_BUFFER_USAGE_MICROMAP_STORAGE_BIT_EXT", static_cast<uint64_t>(VK_BUFFER_USAGE_MICROMAP_STORAGE_BIT_EXT)},
        {"VK_BUFFER_USAGE_TILE_MEMORY_BIT_QCOM", static_cast<uint64_t>(VK_BUFFER_USAGE_TILE_MEMORY_BIT_QCOM)},
        {"VK_BUFFER_USAGE_RAY_TRACING_BIT_NV", static_cast<uint64_t>(VK_BUFFER_USAGE_RAY_TRACING_BIT_NV)},
        {"VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT", static_cast<uint64_t>(VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT)},
        {"VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR", static_cast<uint64_t>(VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR)},
        // VkVideoEncodeFeedbackFlagBitsKHR
        {"VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR)},
        {"VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR)},
        {"VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_HAS_OVERRIDES_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_HAS_OVERRIDES_BIT_KHR)},
        {"VK_VIDEO_ENCODE_FEEDBACK_AVERAGE_QUANTIZATION_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_FEEDBACK_AVERAGE_QUANTIZATION_BIT_KHR)},
        {"VK_VIDEO_ENCODE_FEEDBACK_MIN_QUANTIZATION_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_FEEDBACK_MIN_QUANTIZATION_BIT_KHR)},
        {"VK_VIDEO_ENCODE_FEEDBACK_MAX_QUANTIZATION_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_FEEDBACK_MAX_QUANTIZATION_BIT_KHR)},
        {"VK_VIDEO_ENCODE_FEEDBACK_INTRA_PIXELS_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_FEEDBACK_INTRA_PIXELS_BIT_KHR)},
        {"VK_VIDEO_ENCODE_FEEDBACK_INTER_PIXELS_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_FEEDBACK_INTER_PIXELS_BIT_KHR)},
        {"VK_VIDEO_ENCODE_FEEDBACK_SKIPPED_PIXELS_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_FEEDBACK_SKIPPED_PIXELS_BIT_KHR)},
        {"VK_VIDEO_ENCODE_FEEDBACK_PICTURE_PARTITION_COUNT_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_FEEDBACK_PICTURE_PARTITION_COUNT_BIT_KHR)},
        // VkShaderFloatControlsIndependence
        {"VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY", static_cast<uint64_t>(VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY)},
        {"VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL", static_cast<uint64_t>(VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL)},
        {"VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE", static_cast<uint64_t>(VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE)},
        {"VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY_KHR", static_cast<uint64_t>(VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY_KHR)},
        {"VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL_KHR", static_cast<uint64_t>(VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL_KHR)},
        {"VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE_KHR", static_cast<uint64_t>(VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE_KHR)},
        // VkVideoEncodeRateControlModeFlagBitsKHR
        {"VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR)},
        {"VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR)},
        {"VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR)},
        {"VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR)},
        // VkResolveModeFlagBits
        {"VK_RESOLVE_MODE_NONE", static_cast<uint64_t>(VK_RESOLVE_MODE_NONE)},
        {"VK_RESOLVE_MODE_SAMPLE_ZERO_BIT", static_cast<uint64_t>(VK_RESOLVE_MODE_SAMPLE_ZERO_BIT)},
        {"VK_RESOLVE_MODE_AVERAGE_BIT", static_cast<uint64_t>(VK_RESOLVE_MODE_AVERAGE_BIT)},
        {"VK_RESOLVE_MODE_MIN_BIT", static_cast<uint64_t>(VK_RESOLVE_MODE_MIN_BIT)},
        {"VK_RESOLVE_MODE_MAX_BIT", static_cast<uint64_t>(VK_RESOLVE_MODE_MAX_BIT)},
        {"VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_BIT_ANDROID", static_cast<uint64_t>(VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_BIT_ANDROID)},
        {"VK_RESOLVE_MODE_CUSTOM_BIT_EXT", static_cast<uint64_t>(VK_RESOLVE_MODE_CUSTOM_BIT_EXT)},
        {"VK_RESOLVE_MODE_NONE_KHR", static_cast<uint64_t>(VK_RESOLVE_MODE_NONE_KHR)},
        {"VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR", static_cast<uint64_t>(VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR)},
        {"VK_RESOLVE_MODE_AVERAGE_BIT_KHR", static_cast<uint64_t>(VK_RESOLVE_MODE_AVERAGE_BIT_KHR)},
        {"VK_RESOLVE_MODE_MIN_BIT_KHR", static_cast<uint64_t>(VK_RESOLVE_MODE_MIN_BIT_KHR)},
        {"VK_RESOLVE_MODE_MAX_BIT_KHR", static_cast<uint64_t>(VK_RESOLVE_MODE_MAX_BIT_KHR)},
        {"VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID", static_cast<uint64_t>(VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID)},
        // VkQueueFlagBits
        {"VK_QUEUE_GRAPHICS_BIT", static_cast<uint64_t>(VK_QUEUE_GRAPHICS_BIT)},
        {"VK_QUEUE_COMPUTE_BIT", static_cast<uint64_t>(VK_QUEUE_COMPUTE_BIT)},
        {"VK_QUEUE_TRANSFER_BIT", static_cast<uint64_t>(VK_QUEUE_TRANSFER_BIT)},
        {"VK_QUEUE_SPARSE_BINDING_BIT", static_cast<uint64_t>(VK_QUEUE_SPARSE_BINDING_BIT)},
        {"VK_QUEUE_PROTECTED_BIT", static_cast<uint64_t>(VK_QUEUE_PROTECTED_BIT)},
        {"VK_QUEUE_VIDEO_DECODE_BIT_KHR", static_cast<uint64_t>(VK_QUEUE_VIDEO_DECODE_BIT_KHR)},
        {"VK_QUEUE_VIDEO_ENCODE_BIT_KHR", static_cast<uint64_t>(VK_QUEUE_VIDEO_ENCODE_BIT_KHR)},
        {"VK_QUEUE_OPTICAL_FLOW_BIT_NV", static_cast<uint64_t>(VK_QUEUE_OPTICAL_FLOW_BIT_NV)},
        {"VK_QUEUE_DATA_GRAPH_BIT_ARM", static_cast<uint64_t>(VK_QUEUE_DATA_GRAPH_BIT_ARM)},
        // VkFormat
        {"VK_FORMAT_UNDEFINED", static_cast<uint64_t>(VK_FORMAT_UNDEFINED)},
        {"VK_FORMAT_R4G4_UNORM_PACK8", static_cast<uint64_t>(VK_FORMAT_R4G4_UNORM_PACK8)},
        {"VK_FORMAT_R4G4B4A4_UNORM_PACK16", static_cast<uint64_t>(VK_FORMAT_R4G4B4A4_UNORM_PACK16)},
        {"VK_FORMAT_B4G4R4A4_UNORM_PACK16", static_cast<uint64_t>(VK_FORMAT_B4G4R4A4_UNORM_PACK16)},
        {"VK_FORMAT_R5G6B5_UNORM_PACK16", static_cast<uint64_t>(VK_FORMAT_R5G6B5_UNORM_PACK16)},
        {"VK_FORMAT_B5G6R5_UNORM_PACK16", static_cast<uint64_t>(VK_FORMAT_B5G6R5_UNORM_PACK16)},
        {"VK_FORMAT_R5G5B5A1_UNORM_PACK16", static_cast<uint64_t>(VK_FORMAT_R5G5B5A1_UNORM_PACK16)},
        {"VK_FORMAT_B5G5R5A1_UNORM_PACK16", static_cast<uint64_t>(VK_FORMAT_B5G5R5A1_UNORM_PACK16)},
        {"VK_FORMAT_A1R5G5B5_UNORM_PACK16", static_cast<uint64_t>(VK_FORMAT_A1R5G5B5_UNORM_PACK16)},
        {"VK_FORMAT_R8_UNORM", static_cast<uint64_t>(VK_FORMAT_R8_UNORM)},
        {"VK_FORMAT_R8_SNORM", static_cast<uint64_t>(VK_FORMAT_R8_SNORM)},
        {"VK_FORMAT_R8_USCALED", static_cast<uint64_t>(VK_FORMAT_R8_USCALED)},
        {"VK_FORMAT_R8_SSCALED", static_cast<uint64_t>(VK_FORMAT_R8_SSCALED)},
        {"VK_FORMAT_R8_UINT", static_cast<uint64_t>(VK_FORMAT_R8_UINT)},
        {"VK_FORMAT_R8_SINT", static_cast<uint64_t>(VK_FORMAT_R8_SINT)},
        {"VK_FORMAT_R8_SRGB", static_cast<uint64_t>(VK_FORMAT_R8_SRGB)},
        {"VK_FORMAT_R8G8_UNORM", static_cast<uint64_t>(VK_FORMAT_R8G8_UNORM)},
        {"VK_FORMAT_R8G8_SNORM", static_cast<uint64_t>(VK_FORMAT_R8G8_SNORM)},
        {"VK_FORMAT_R8G8_USCALED", static_cast<uint64_t>(VK_FORMAT_R8G8_USCALED)},
        {"VK_FORMAT_R8G8_SSCALED", static_cast<uint64_t>(VK_FORMAT_R8G8_SSCALED)},
        {"VK_FORMAT_R8G8_UINT", static_cast<uint64_t>(VK_FORMAT_R8G8_UINT)},
        {"VK_FORMAT_R8G8_SINT", static_cast<uint64_t>(VK_FORMAT_R8G8_SINT)},
        {"VK_FORMAT_R8G8_SRGB", static_cast<uint64_t>(VK_FORMAT_R8G8_SRGB)},
        {"VK_FORMAT_R8G8B8_UNORM", static_cast<uint64_t>(VK_FORMAT_R8G8B8_UNORM)},
        {"VK_FORMAT_R8G8B8_SNORM", static_cast<uint64_t>(VK_FORMAT_R8G8B8_SNORM)},
        {"VK_FORMAT_R8G8B8_USCALED", static_cast<uint64_t>(VK_FORMAT_R8G8B8_USCALED)},
        {"VK_FORMAT_R8G8B8_SSCALED", static_cast<uint64_t>(VK_FORMAT_R8G8B8_SSCALED)},
        {"VK_FORMAT_R8G8B8_UINT", static_cast<uint64_t>(VK_FORMAT_R8G8B8_UINT)},
        {"VK_FORMAT_R8G8B8_SINT", static_cast<uint64_t>(VK_FORMAT_R8G8B8_SINT)},
        {"VK_FORMAT_R8G8B8_SRGB", static_cast<uint64_t>(VK_FORMAT_R8G8B8_SRGB)},
        {"VK_FORMAT_B8G8R8_UNORM", static_cast<uint64_t>(VK_FORMAT_B8G8R8_UNORM)},
        {"VK_FORMAT_B8G8R8_SNORM", static_cast<uint64_t>(VK_FORMAT_B8G8R8_SNORM)},
        {"VK_FORMAT_B8G8R8_USCALED", static_cast<uint64_t>(VK_FORMAT_B8G8R8_USCALED)},
        {"VK_FORMAT_B8G8R8_SSCALED", static_cast<uint64_t>(VK_FORMAT_B8G8R8_SSCALED)},
        {"VK_FORMAT_B8G8R8_UINT", static_cast<uint64_t>(VK_FORMAT_B8G8R8_UINT)},
        {"VK_FORMAT_B8G8R8_SINT", static_cast<uint64_t>(VK_FORMAT_B8G8R8_SINT)},
        {"VK_FORMAT_B8G8R8_SRGB", static_cast<uint64_t>(VK_FORMAT_B8G8R8_SRGB)},
        {"VK_FORMAT_R8G8B8A8_UNORM", static_cast<uint64_t>(VK_FORMAT_R8G8B8A8_UNORM)},
        {"VK_FORMAT_R8G8B8A8_SNORM", static_cast<uint64_t>(VK_FORMAT_R8G8B8A8_SNORM)},
        {"VK_FORMAT_R8G8B8A8_USCALED", static_cast<uint64_t>(VK_FORMAT_R8G8B8A8_USCALED)},
        {"VK_FORMAT_R8G8B8A8_SSCALED", static_cast<uint64_t>(VK_FORMAT_R8G8B8A8_SSCALED)},
        {"VK_FORMAT_R8G8B8A8_UINT", static_cast<uint64_t>(VK_FORMAT_R8G8B8A8_UINT)},
        {"VK_FORMAT_R8G8B8A8_SINT", static_cast<uint64_t>(VK_FORMAT_R8G8B8A8_SINT)},
        {"VK_FORMAT_R8G8B8A8_SRGB", static_cast<uint64_t>(VK_FORMAT_R8G8B8A8_SRGB)},
        {"VK_FORMAT_B8G8R8A8_UNORM", static_cast<uint64_t>(VK_FORMAT_B8G8R8A8_UNORM)},
        {"VK_FORMAT_B8G8R8A8_SNORM", static_cast<uint64_t>(VK_FORMAT_B8G8R8A8_SNORM)},
        {"VK_FORMAT_B8G8R8A8_USCALED", static_cast<uint64_t>(VK_FORMAT_B8G8R8A8_USCALED)},
        {"VK_FORMAT_B8G8R8A8_SSCALED", static_cast<uint64_t>(VK_FORMAT_B8G8R8A8_SSCALED)},
        {"VK_FORMAT_B8G8R8A8_UINT", static_cast<uint64_t>(VK_FORMAT_B8G8R8A8_UINT)},
        {"VK_FORMAT_B8G8R8A8_SINT", static_cast<uint64_t>(VK_FORMAT_B8G8R8A8_SINT)},
        {"VK_FORMAT_B8G8R8A8_SRGB", static_cast<uint64_t>(VK_FORMAT_B8G8R8A8_SRGB)},
        {"VK_FORMAT_A8B8G8R8_UNORM_PACK32", static_cast<uint64_t>(VK_FORMAT_A8B8G8R8_UNORM_PACK32)},
        {"VK_FORMAT_A8B8G8R8_SNORM_PACK32", static_cast<uint64_t>(VK_FORMAT_A8B8G8R8_SNORM_PACK32)},
        {"VK_FORMAT_A8B8G8R8_USCALED_PACK32", static_cast<uint64_t>(VK_FORMAT_A8B8G8R8_USCALED_PACK32)},
        {"VK_FORMAT_A8B8G8R8_SSCALED_PACK32", static_cast<uint64_t>(VK_FORMAT_A8B8G8R8_SSCALED_PACK32)},
        {"VK_FORMAT_A8B8G8R8_UINT_PACK32", static_cast<uint64_t>(VK_FORMAT_A8B8G8R8_UINT_PACK32)},
        {"VK_FORMAT_A8B8G8R8_SINT_PACK32", static_cast<uint64_t>(VK_FORMAT_A8B8G8R8_SINT_PACK32)},
        {"VK_FORMAT_A8B8G8R8_SRGB_PACK32", static_cast<uint64_t>(VK_FORMAT_A8B8G8R8_SRGB_PACK32)},
        {"VK_FORMAT_A2R10G10B10_UNORM_PACK32", static_cast<uint64_t>(VK_FORMAT_A2R10G10B10_UNORM_PACK32)},
        {"VK_FORMAT_A2R10G10B10_SNORM_PACK32", static_cast<uint64_t>(VK_FORMAT_A2R10G10B10_SNORM_PACK32)},
        {"VK_FORMAT_A2R10G10B10_USCALED_PACK32", static_cast<uint64_t>(VK_FORMAT_A2R10G10B10_USCALED_PACK32)},
        {"VK_FORMAT_A2R10G10B10_SSCALED_PACK32", static_cast<uint64_t>(VK_FORMAT_A2R10G10B10_SSCALED_PACK32)},
        {"VK_FORMAT_A2R10G10B10_UINT_PACK32", static_cast<uint64_t>(VK_FORMAT_A2R10G10B10_UINT_PACK32)},
        {"VK_FORMAT_A2R10G10B10_SINT_PACK32", static_cast<uint64_t>(VK_FORMAT_A2R10G10B10_SINT_PACK32)},
        {"VK_FORMAT_A2B10G10R10_UNORM_PACK32", static_cast<uint64_t>(VK_FORMAT_A2B10G10R10_UNORM_PACK32)},
        {"VK_FORMAT_A2B10G10R10_SNORM_PACK32", static_cast<uint64_t>(VK_FORMAT_A2B10G10R10_SNORM_PACK32)},
        {"VK_FORMAT_A2B10G10R10_USCALED_PACK32", static_cast<uint64_t>(VK_FORMAT_A2B10G10R10_USCALED_PACK32)},
        {"VK_FORMAT_A2B10G10R10_SSCALED_PACK32", static_cast<uint64_t>(VK_FORMAT_A2B10G10R10_SSCALED_PACK32)},
        {"VK_FORMAT_A2B10G10R10_UINT_PACK32", static_cast<uint64_t>(VK_FORMAT_A2B10G10R10_UINT_PACK32)},
        {"VK_FORMAT_A2B10G10R10_SINT_PACK32", static_cast<uint64_t>(VK_FORMAT_A2B10G10R10_SINT_PACK32)},
        {"VK_FORMAT_R16_UNORM", static_cast<uint64_t>(VK_FORMAT_R16_UNORM)},
        {"VK_FORMAT_R16_SNORM", static_cast<uint64_t>(VK_FORMAT_R16_SNORM)},
        {"VK_FORMAT_R16_USCALED", static_cast<uint64_t>(VK_FORMAT_R16_USCALED)},
        {"VK_FORMAT_R16_SSCALED", static_cast<uint64_t>(VK_FORMAT_R16_SSCALED)},
        {"VK_FORMAT_R16_UINT", static_cast<uint64_t>(VK_FORMAT_R16_UINT)},
        {"VK_FORMAT_R16_SINT", static_cast<uint64_t>(VK_FORMAT_R16_SINT)},
        {"VK_FORMAT_R16_SFLOAT", static_cast<uint64_t>(VK_FORMAT_R16_SFLOAT)},
        {"VK_FORMAT_R16G16_UNORM", static_cast<uint64_t>(VK_FORMAT_R16G16_UNORM)},
        {"VK_FORMAT_R16G16_SNORM", static_cast<uint64_t>(VK_FORMAT_R16G16_SNORM)},
        {"VK_FORMAT_R16G16_USCALED", static_cast<uint64_t>(VK_FORMAT_R16G16_USCALED)},
        {"VK_FORMAT_R16G16_SSCALED", static_cast<uint64_t>(VK_FORMAT_R16G16_SSCALED)},
        {"VK_FORMAT_R16G16_UINT", static_cast<uint64_t>(VK_FORMAT_R16G16_UINT)},
        {"VK_FORMAT_R16G16_SINT", static_cast<uint64_t>(VK_FORMAT_R16G16_SINT)},
        {"VK_FORMAT_R16G16_SFLOAT", static_cast<uint64_t>(VK_FORMAT_R16G16_SFLOAT)},
        {"VK_FORMAT_R16G16B16_UNORM", static_cast<uint64_t>(VK_FORMAT_R16G16B16_UNORM)},
        {"VK_FORMAT_R16G16B16_SNORM", static_cast<uint64_t>(VK_FORMAT_R16G16B16_SNORM)},
        {"VK_FORMAT_R16G16B16_USCALED", static_cast<uint64_t>(VK_FORMAT_R16G16B16_USCALED)},
        {"VK_FORMAT_R16G16B16_SSCALED", static_cast<uint64_t>(VK_FORMAT_R16G16B16_SSCALED)},
        {"VK_FORMAT_R16G16B16_UINT", static_cast<uint64_t>(VK_FORMAT_R16G16B16_UINT)},
        {"VK_FORMAT_R16G16B16_SINT", static_cast<uint64_t>(VK_FORMAT_R16G16B16_SINT)},
        {"VK_FORMAT_R16G16B16_SFLOAT", static_cast<uint64_t>(VK_FORMAT_R16G16B16_SFLOAT)},
        {"VK_FORMAT_R16G16B16A16_UNORM", static_cast<uint64_t>(VK_FORMAT_R16G16B16A16_UNORM)},
        {"VK_FORMAT_R16G16B16A16_SNORM", static_cast<uint64_t>(VK_FORMAT_R16G16B16A16_SNORM)},
        {"VK_FORMAT_R16G16B16A16_USCALED", static_cast<uint64_t>(VK_FORMAT_R16G16B16A16_USCALED)},
        {"VK_FORMAT_R16G16B16A16_SSCALED", static_cast<uint64_t>(VK_FORMAT_R16G16B16A16_SSCALED)},
        {"VK_FORMAT_R16G16B16A16_UINT", static_cast<uint64_t>(VK_FORMAT_R16G16B16A16_UINT)},
        {"VK_FORMAT_R16G16B16A16_SINT", static_cast<uint64_t>(VK_FORMAT_R16G16B16A16_SINT)},
        {"VK_FORMAT_R16G16B16A16_SFLOAT", static_cast<uint64_t>(VK_FORMAT_R16G16B16A16_SFLOAT)},
        {"VK_FORMAT_R32_UINT", static_cast<uint64_t>(VK_FORMAT_R32_UINT)},
        {"VK_FORMAT_R32_SINT", static_cast<uint64_t>(VK_FORMAT_R32_SINT)},
        {"VK_FORMAT_R32_SFLOAT", static_cast<uint64_t>(VK_FORMAT_R32_SFLOAT)},
        {"VK_FORMAT_R32G32_UINT", static_cast<uint64_t>(VK_FORMAT_R32G32_UINT)},
        {"VK_FORMAT_R32G32_SINT", static_cast<uint64_t>(VK_FORMAT_R32G32_SINT)},
        {"VK_FORMAT_R32G32_SFLOAT", static_cast<uint64_t>(VK_FORMAT_R32G32_SFLOAT)},
        {"VK_FORMAT_R32G32B32_UINT", static_cast<uint64_t>(VK_FORMAT_R32G32B32_UINT)},
        {"VK_FORMAT_R32G32B32_SINT", static_cast<uint64_t>(VK_FORMAT_R32G32B32_SINT)},
        {"VK_FORMAT_R32G32B32_SFLOAT", static_cast<uint64_t>(VK_FORMAT_R32G32B32_SFLOAT)},
        {"VK_FORMAT_R32G32B32A32_UINT", static_cast<uint64_t>(VK_FORMAT_R32G32B32A32_UINT)},
        {"VK_FORMAT_R32G32B32A32_SINT", static_cast<uint64_t>(VK_FORMAT_R32G32B32A32_SINT)},
        {"VK_FORMAT_R32G32B32A32_SFLOAT", static_cast<uint64_t>(VK_FORMAT_R32G32B32A32_SFLOAT)},
        {"VK_FORMAT_R64_UINT", static_cast<uint64_t>(VK_FORMAT_R64_UINT)},
        {"VK_FORMAT_R64_SINT", static_cast<uint64_t>(VK_FORMAT_R64_SINT)},
        {"VK_FORMAT_R64_SFLOAT", static_cast<uint64_t>(VK_FORMAT_R64_SFLOAT)},
        {"VK_FORMAT_R64G64_UINT", static_cast<uint64_t>(VK_FORMAT_R64G64_UINT)},
        {"VK_FORMAT_R64G64_SINT", static_cast<uint64_t>(VK_FORMAT_R64G64_SINT)},
        {"VK_FORMAT_R64G64_SFLOAT", static_cast<uint64_t>(VK_FORMAT_R64G64_SFLOAT)},
        {"VK_FORMAT_R64G64B64_UINT", static_cast<uint64_t>(VK_FORMAT_R64G64B64_UINT)},
        {"VK_FORMAT_R64G64B64_SINT", static_cast<uint64_t>(VK_FORMAT_R64G64B64_SINT)},
        {"VK_FORMAT_R64G64B64_SFLOAT", static_cast<uint64_t>(VK_FORMAT_R64G64B64_SFLOAT)},
        {"VK_FORMAT_R64G64B64A64_UINT", static_cast<uint64_t>(VK_FORMAT_R64G64B64A64_UINT)},
        {"VK_FORMAT_R64G64B64A64_SINT", static_cast<uint64_t>(VK_FORMAT_R64G64B64A64_SINT)},
        {"VK_FORMAT_R64G64B64A64_SFLOAT", static_cast<uint64_t>(VK_FORMAT_R64G64B64A64_SFLOAT)},
        {"VK_FORMAT_B10G11R11_UFLOAT_PACK32", static_cast<uint64_t>(VK_FORMAT_B10G11R11_UFLOAT_PACK32)},
        {"VK_FORMAT_E5B9G9R9_UFLOAT_PACK32", static_cast<uint64_t>(VK_FORMAT_E5B9G9R9_UFLOAT_PACK32)},
        {"VK_FORMAT_D16_UNORM", static_cast<uint64_t>(VK_FORMAT_D16_UNORM)},
        {"VK_FORMAT_X8_D24_UNORM_PACK32", static_cast<uint64_t>(VK_FORMAT_X8_D24_UNORM_PACK32)},
        {"VK_FORMAT_D32_SFLOAT", static_cast<uint64_t>(VK_FORMAT_D32_SFLOAT)},
        {"VK_FORMAT_S8_UINT", static_cast<uint64_t>(VK_FORMAT_S8_UINT)},
        {"VK_FORMAT_D16_UNORM_S8_UINT", static_cast<uint64_t>(VK_FORMAT_D16_UNORM_S8_UINT)},
        {"VK_FORMAT_D24_UNORM_S8_UINT", static_cast<uint64_t>(VK_FORMAT_D24_UNORM_S8_UINT)},
        {"VK_FORMAT_D32_SFLOAT_S8_UINT", static_cast<uint64_t>(VK_FORMAT_D32_SFLOAT_S8_UINT)},
        {"VK_FORMAT_BC1_RGB_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_BC1_RGB_UNORM_BLOCK)},
        {"VK_FORMAT_BC1_RGB_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_BC1_RGB_SRGB_BLOCK)},
        {"VK_FORMAT_BC1_RGBA_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_BC1_RGBA_UNORM_BLOCK)},
        {"VK_FORMAT_BC1_RGBA_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_BC1_RGBA_SRGB_BLOCK)},
        {"VK_FORMAT_BC2_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_BC2_UNORM_BLOCK)},
        {"VK_FORMAT_BC2_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_BC2_SRGB_BLOCK)},
        {"VK_FORMAT_BC3_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_BC3_UNORM_BLOCK)},
        {"VK_FORMAT_BC3_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_BC3_SRGB_BLOCK)},
        {"VK_FORMAT_BC4_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_BC4_UNORM_BLOCK)},
        {"VK_FORMAT_BC4_SNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_BC4_SNORM_BLOCK)},
        {"VK_FORMAT_BC5_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_BC5_UNORM_BLOCK)},
        {"VK_FORMAT_BC5_SNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_BC5_SNORM_BLOCK)},
        {"VK_FORMAT_BC6H_UFLOAT_BLOCK", static_cast<uint64_t>(VK_FORMAT_BC6H_UFLOAT_BLOCK)},
        {"VK_FORMAT_BC6H_SFLOAT_BLOCK", static_cast<uint64_t>(VK_FORMAT_BC6H_SFLOAT_BLOCK)},
        {"VK_FORMAT_BC7_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_BC7_UNORM_BLOCK)},
        {"VK_FORMAT_BC7_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_BC7_SRGB_BLOCK)},
        {"VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK)},
        {"VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK)},
        {"VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK)},
        {"VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK)},
        {"VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK)},
        {"VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK)},
        {"VK_FORMAT_EAC_R11_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_EAC_R11_UNORM_BLOCK)},
        {"VK_FORMAT_EAC_R11_SNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_EAC_R11_SNORM_BLOCK)},
        {"VK_FORMAT_EAC_R11G11_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_EAC_R11G11_UNORM_BLOCK)},
        {"VK_FORMAT_EAC_R11G11_SNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_EAC_R11G11_SNORM_BLOCK)},
        {"VK_FORMAT_ASTC_4x4_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_4x4_UNORM_BLOCK)},
        {"VK_FORMAT_ASTC_4x4_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_4x4_SRGB_BLOCK)},
        {"VK_FORMAT_ASTC_5x4_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_5x4_UNORM_BLOCK)},
        {"VK_FORMAT_ASTC_5x4_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_5x4_SRGB_BLOCK)},
        {"VK_FORMAT_ASTC_5x5_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_5x5_UNORM_BLOCK)},
        {"VK_FORMAT_ASTC_5x5_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_5x5_SRGB_BLOCK)},
        {"VK_FORMAT_ASTC_6x5_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_6x5_UNORM_BLOCK)},
        {"VK_FORMAT_ASTC_6x5_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_6x5_SRGB_BLOCK)},
        {"VK_FORMAT_ASTC_6x6_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_6x6_UNORM_BLOCK)},
        {"VK_FORMAT_ASTC_6x6_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_6x6_SRGB_BLOCK)},
        {"VK_FORMAT_ASTC_8x5_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_8x5_UNORM_BLOCK)},
        {"VK_FORMAT_ASTC_8x5_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_8x5_SRGB_BLOCK)},
        {"VK_FORMAT_ASTC_8x6_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_8x6_UNORM_BLOCK)},
        {"VK_FORMAT_ASTC_8x6_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_8x6_SRGB_BLOCK)},
        {"VK_FORMAT_ASTC_8x8_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_8x8_UNORM_BLOCK)},
        {"VK_FORMAT_ASTC_8x8_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_8x8_SRGB_BLOCK)},
        {"VK_FORMAT_ASTC_10x5_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_10x5_UNORM_BLOCK)},
        {"VK_FORMAT_ASTC_10x5_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_10x5_SRGB_BLOCK)},
        {"VK_FORMAT_ASTC_10x6_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_10x6_UNORM_BLOCK)},
        {"VK_FORMAT_ASTC_10x6_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_10x6_SRGB_BLOCK)},
        {"VK_FORMAT_ASTC_10x8_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_10x8_UNORM_BLOCK)},
        {"VK_FORMAT_ASTC_10x8_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_10x8_SRGB_BLOCK)},
        {"VK_FORMAT_ASTC_10x10_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_10x10_UNORM_BLOCK)},
        {"VK_FORMAT_ASTC_10x10_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_10x10_SRGB_BLOCK)},
        {"VK_FORMAT_ASTC_12x10_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_12x10_UNORM_BLOCK)},
        {"VK_FORMAT_ASTC_12x10_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_12x10_SRGB_BLOCK)},
        {"VK_FORMAT_ASTC_12x12_UNORM_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_12x12_UNORM_BLOCK)},
        {"VK_FORMAT_ASTC_12x12_SRGB_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_12x12_SRGB_BLOCK)},
        {"VK_FORMAT_G8B8G8R8_422_UNORM", static_cast<uint64_t>(VK_FORMAT_G8B8G8R8_422_UNORM)},
        {"VK_FORMAT_B8G8R8G8_422_UNORM", static_cast<uint64_t>(VK_FORMAT_B8G8R8G8_422_UNORM)},
        {"VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM", static_cast<uint64_t>(VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM)},
        {"VK_FORMAT_G8_B8R8_2PLANE_420_UNORM", static_cast<uint64_t>(VK_FORMAT_G8_B8R8_2PLANE_420_UNORM)},
        {"VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM", static_cast<uint64_t>(VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM)},
        {"VK_FORMAT_G8_B8R8_2PLANE_422_UNORM", static_cast<uint64_t>(VK_FORMAT_G8_B8R8_2PLANE_422_UNORM)},
        {"VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM", static_cast<uint64_t>(VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM)},
        {"VK_FORMAT_R10X6_UNORM_PACK16", static_cast<uint64_t>(VK_FORMAT_R10X6_UNORM_PACK16)},
        {"VK_FORMAT_R10X6G10X6_UNORM_2PACK16", static_cast<uint64_t>(VK_FORMAT_R10X6G10X6_UNORM_2PACK16)},
        {"VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16", static_cast<uint64_t>(VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16)},
        {"VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16", static_cast<uint64_t>(VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16)},
        {"VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16", static_cast<uint64_t>(VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16)},
        {"VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16", static_cast<uint64_t>(VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16)},
        {"VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16", static_cast<uint64_t>(VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16)},
        {"VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16", static_cast<uint64_t>(VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16)},
        {"VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16", static_cast<uint64_t>(VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16)},
        {"VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16", static_cast<uint64_t>(VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16)},
        {"VK_FORMAT_R12X4_UNORM_PACK16", static_cast<uint64_t>(VK_FORMAT_R12X4_UNORM_PACK16)},
        {"VK_FORMAT_R12X4G12X4_UNORM_2PACK16", static_cast<uint64_t>(VK_FORMAT_R12X4G12X4_UNORM_2PACK16)},
        {"VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16", static_cast<uint64_t>(VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16)},
        {"VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16", static_cast<uint64_t>(VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16)},
        {"VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16", static_cast<uint64_t>(VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16)},
        {"VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16", static_cast<uint64_t>(VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16)},
        {"VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16", static_cast<uint64_t>(VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16)},
        {"VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16", static_cast<uint64_t>(VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16)},
        {"VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16", static_cast<uint64_t>(VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16)},
        {"VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16", static_cast<uint64_t>(VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16)},
        {"VK_FORMAT_G16B16G16R16_422_UNORM", static_cast<uint64_t>(VK_FORMAT_G16B16G16R16_422_UNORM)},
        {"VK_FORMAT_B16G16R16G16_422_UNORM", static_cast<uint64_t>(VK_FORMAT_B16G16R16G16_422_UNORM)},
        {"VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM", static_cast<uint64_t>(VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM)},
        {"VK_FORMAT_G16_B16R16_2PLANE_420_UNORM", static_cast<uint64_t>(VK_FORMAT_G16_B16R16_2PLANE_420_UNORM)},
        {"VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM", static_cast<uint64_t>(VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM)},
        {"VK_FORMAT_G16_B16R16_2PLANE_422_UNORM", static_cast<uint64_t>(VK_FORMAT_G16_B16R16_2PLANE_422_UNORM)},
        {"VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM", static_cast<uint64_t>(VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM)},
        {"VK_FORMAT_G8_B8R8_2PLANE_444_UNORM", static_cast<uint64_t>(VK_FORMAT_G8_B8R8_2PLANE_444_UNORM)},
        {"VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16", static_cast<uint64_t>(VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16)},
        {"VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16", static_cast<uint64_t>(VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16)},
        {"VK_FORMAT_G16_B16R16_2PLANE_444_UNORM", static_cast<uint64_t>(VK_FORMAT_G16_B16R16_2PLANE_444_UNORM)},
        {"VK_FORMAT_A4R4G4B4_UNORM_PACK16", static_cast<uint64_t>(VK_FORMAT_A4R4G4B4_UNORM_PACK16)},
        {"VK_FORMAT_A4B4G4R4_UNORM_PACK16", static_cast<uint64_t>(VK_FORMAT_A4B4G4R4_UNORM_PACK16)},
        {"VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK)},
        {"VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK)},
        {"VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK)},
        {"VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK)},
        {"VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK)},
        {"VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK)},
        {"VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK)},
        {"VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK)},
        {"VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK)},
        {"VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK)},
        {"VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK)},
        {"VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK)},
        {"VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK)},
        {"VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK", static_cast<uint64_t>(VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK)},
        {"VK_FORMAT_A1B5G5R5_UNORM_PACK16", static_cast<uint64_t>(VK_FORMAT_A1B5G5R5_UNORM_PACK16)},
        {"VK_FORMAT_A8_UNORM", static_cast<uint64_t>(VK_FORMAT_A8_UNORM)},
        {"VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG", static_cast<uint64_t>(VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG)},
        {"VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG", static_cast<uint64_t>(VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG)},
        {"VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG", static_cast<uint64_t>(VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG)},
        {"VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG", static_cast<uint64_t>(VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG)},
        {"VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG", static_cast<uint64_t>(VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG)},
        {"VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG", static_cast<uint64_t>(VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG)},
        {"VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG", static_cast<uint64_t>(VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG)},
        {"VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG", static_cast<uint64_t>(VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG)},
        {"VK_FORMAT_ASTC_3x3x3_UNORM_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_3x3x3_UNORM_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_3x3x3_SRGB_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_3x3x3_SRGB_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_3x3x3_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_3x3x3_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_4x3x3_UNORM_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_4x3x3_UNORM_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_4x3x3_SRGB_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_4x3x3_SRGB_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_4x3x3_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_4x3x3_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_4x4x3_UNORM_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_4x4x3_UNORM_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_4x4x3_SRGB_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_4x4x3_SRGB_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_4x4x3_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_4x4x3_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_4x4x4_UNORM_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_4x4x4_UNORM_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_4x4x4_SRGB_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_4x4x4_SRGB_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_4x4x4_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_4x4x4_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_5x4x4_UNORM_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_5x4x4_UNORM_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_5x4x4_SRGB_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_5x4x4_SRGB_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_5x4x4_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_5x4x4_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_5x5x4_UNORM_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_5x5x4_UNORM_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_5x5x4_SRGB_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_5x5x4_SRGB_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_5x5x4_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_5x5x4_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_5x5x5_UNORM_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_5x5x5_UNORM_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_5x5x5_SRGB_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_5x5x5_SRGB_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_5x5x5_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_5x5x5_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_6x5x5_UNORM_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_6x5x5_UNORM_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_6x5x5_SRGB_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_6x5x5_SRGB_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_6x5x5_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_6x5x5_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_6x6x5_UNORM_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_6x6x5_UNORM_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_6x6x5_SRGB_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_6x6x5_SRGB_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_6x6x5_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_6x6x5_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_6x6x6_UNORM_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_6x6x6_UNORM_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_6x6x6_SRGB_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_6x6x6_SRGB_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_6x6x6_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_6x6x6_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_R8_BOOL_ARM", static_cast<uint64_t>(VK_FORMAT_R8_BOOL_ARM)},
        {"VK_FORMAT_R16_SFLOAT_FPENCODING_BFLOAT16_ARM", static_cast<uint64_t>(VK_FORMAT_R16_SFLOAT_FPENCODING_BFLOAT16_ARM)},
        {"VK_FORMAT_R8_SFLOAT_FPENCODING_FLOAT8E4M3_ARM", static_cast<uint64_t>(VK_FORMAT_R8_SFLOAT_FPENCODING_FLOAT8E4M3_ARM)},
        {"VK_FORMAT_R8_SFLOAT_FPENCODING_FLOAT8E5M2_ARM", static_cast<uint64_t>(VK_FORMAT_R8_SFLOAT_FPENCODING_FLOAT8E5M2_ARM)},
        {"VK_FORMAT_R16G16_SFIXED5_NV", static_cast<uint64_t>(VK_FORMAT_R16G16_SFIXED5_NV)},
        {"VK_FORMAT_R10X6_UINT_PACK16_ARM", static_cast<uint64_t>(VK_FORMAT_R10X6_UINT_PACK16_ARM)},
        {"VK_FORMAT_R10X6G10X6_UINT_2PACK16_ARM", static_cast<uint64_t>(VK_FORMAT_R10X6G10X6_UINT_2PACK16_ARM)},
        {"VK_FORMAT_R10X6G10X6B10X6A10X6_UINT_4PACK16_ARM", static_cast<uint64_t>(VK_FORMAT_R10X6G10X6B10X6A10X6_UINT_4PACK16_ARM)},
        {"VK_FORMAT_R12X4_UINT_PACK16_ARM", static_cast<uint64_t>(VK_FORMAT_R12X4_UINT_PACK16_ARM)},
        {"VK_FORMAT_R12X4G12X4_UINT_2PACK16_ARM", static_cast<uint64_t>(VK_FORMAT_R12X4G12X4_UINT_2PACK16_ARM)},
        {"VK_FORMAT_R12X4G12X4B12X4A12X4_UINT_4PACK16_ARM", static_cast<uint64_t>(VK_FORMAT_R12X4G12X4B12X4A12X4_UINT_4PACK16_ARM)},
        {"VK_FORMAT_R14X2_UINT_PACK16_ARM", static_cast<uint64_t>(VK_FORMAT_R14X2_UINT_PACK16_ARM)},
        {"VK_FORMAT_R14X2G14X2_UINT_2PACK16_ARM", static_cast<uint64_t>(VK_FORMAT_R14X2G14X2_UINT_2PACK16_ARM)},
        {"VK_FORMAT_R14X2G14X2B14X2A14X2_UINT_4PACK16_ARM", static_cast<uint64_t>(VK_FORMAT_R14X2G14X2B14X2A14X2_UINT_4PACK16_ARM)},
        {"VK_FORMAT_R14X2_UNORM_PACK16_ARM", static_cast<uint64_t>(VK_FORMAT_R14X2_UNORM_PACK16_ARM)},
        {"VK_FORMAT_R14X2G14X2_UNORM_2PACK16_ARM", static_cast<uint64_t>(VK_FORMAT_R14X2G14X2_UNORM_2PACK16_ARM)},
        {"VK_FORMAT_R14X2G14X2B14X2A14X2_UNORM_4PACK16_ARM", static_cast<uint64_t>(VK_FORMAT_R14X2G14X2B14X2A14X2_UNORM_4PACK16_ARM)},
        {"VK_FORMAT_G14X2_B14X2R14X2_2PLANE_420_UNORM_3PACK16_ARM", static_cast<uint64_t>(VK_FORMAT_G14X2_B14X2R14X2_2PLANE_420_UNORM_3PACK16_ARM)},
        {"VK_FORMAT_G14X2_B14X2R14X2_2PLANE_422_UNORM_3PACK16_ARM", static_cast<uint64_t>(VK_FORMAT_G14X2_B14X2R14X2_2PLANE_422_UNORM_3PACK16_ARM)},
        {"VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT", static_cast<uint64_t>(VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT)},
        {"VK_FORMAT_G8B8G8R8_422_UNORM_KHR", static_cast<uint64_t>(VK_FORMAT_G8B8G8R8_422_UNORM_KHR)},
        {"VK_FORMAT_B8G8R8G8_422_UNORM_KHR", static_cast<uint64_t>(VK_FORMAT_B8G8R8G8_422_UNORM_KHR)},
        {"VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR", static_cast<uint64_t>(VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR)},
        {"VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR", static_cast<uint64_t>(VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR)},
        {"VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR", static_cast<uint64_t>(VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR)},
        {"VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR", static_cast<uint64_t>(VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR)},
        {"VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR", static_cast<uint64_t>(VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR)},
        {"VK_FORMAT_R10X6_UNORM_PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_R10X6_UNORM_PACK16_KHR)},
        {"VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR)},
        {"VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR)},
        {"VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR)},
        {"VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR)},
        {"VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR)},
        {"VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR)},
        {"VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR)},
        {"VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR)},
        {"VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR)},
        {"VK_FORMAT_R12X4_UNORM_PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_R12X4_UNORM_PACK16_KHR)},
        {"VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR)},
        {"VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR)},
        {"VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR)},
        {"VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR)},
        {"VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR)},
        {"VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR)},
        {"VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR)},
        {"VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR)},
        {"VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR)},
        {"VK_FORMAT_G16B16G16R16_422_UNORM_KHR", static_cast<uint64_t>(VK_FORMAT_G16B16G16R16_422_UNORM_KHR)},
        {"VK_FORMAT_B16G16R16G16_422_UNORM_KHR", static_cast<uint64_t>(VK_FORMAT_B16G16R16G16_422_UNORM_KHR)},
        {"VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR", static_cast<uint64_t>(VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR)},
        {"VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR", static_cast<uint64_t>(VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR)},
        {"VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR", static_cast<uint64_t>(VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR)},
        {"VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR", static_cast<uint64_t>(VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR)},
        {"VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR", static_cast<uint64_t>(VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR)},
        {"VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT", static_cast<uint64_t>(VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT)},
        {"VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT", static_cast<uint64_t>(VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT)},
        {"VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT", static_cast<uint64_t>(VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT)},
        {"VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT", static_cast<uint64_t>(VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT)},
        {"VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT", static_cast<uint64_t>(VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT)},
        {"VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT", static_cast<uint64_t>(VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT)},
        {"VK_FORMAT_R16G16_S10_5_NV", static_cast<uint64_t>(VK_FORMAT_R16G16_S10_5_NV)},
        {"VK_FORMAT_A1B5G5R5_UNORM_PACK16_KHR", static_cast<uint64_t>(VK_FORMAT_A1B5G5R5_UNORM_PACK16_KHR)},
        {"VK_FORMAT_A8_UNORM_KHR", static_cast<uint64_t>(VK_FORMAT_A8_UNORM_KHR)},
        // VkImageCreateFlagBits
        {"VK_IMAGE_CREATE_SPARSE_BINDING_BIT", static_cast<uint64_t>(VK_IMAGE_CREATE_SPARSE_BINDING_BIT)},
        {"VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT", static_cast<uint64_t>(VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT)},
        {"VK_IMAGE_CREATE_SPARSE_ALIASED_BIT", static_cast<uint64_t>(VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)},
        {"VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT", static_cast<uint64_t>(VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT)},
        {"VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT", static_cast<uint64_t>(VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT)},
        {"VK_IMAGE_CREATE_ALIAS_BIT", static_cast<uint64_t>(VK_IMAGE_CREATE_ALIAS_BIT)},
        {"VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT", static_cast<uint64_t>(VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT)},
        {"VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT", static_cast<uint64_t>(VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT)},
        {"VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT", static_cast<uint64_t>(VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT)},
        {"VK_IMAGE_CREATE_EXTENDED_USAGE_BIT", static_cast<uint64_t>(VK_IMAGE_CREATE_EXTENDED_USAGE_BIT)},
        {"VK_IMAGE_CREATE_PROTECTED_BIT", static_cast<uint64_t>(VK_IMAGE_CREATE_PROTECTED_BIT)},
        {"VK_IMAGE_CREATE_DISJOINT_BIT", static_cast<uint64_t>(VK_IMAGE_CREATE_DISJOINT_BIT)},
        {"VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV", static_cast<uint64_t>(VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV)},
        {"VK_IMAGE_CREATE_DESCRIPTOR_HEAP_CAPTURE_REPLAY_BIT_EXT", static_cast<uint64_t>(VK_IMAGE_CREATE_DESCRIPTOR_HEAP_CAPTURE_REPLAY_BIT_EXT)},
        {"VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT", static_cast<uint64_t>(VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT)},
        {"VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT", static_cast<uint64_t>(VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT)},
        {"VK_IMAGE_CREATE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT", static_cast<uint64_t>(VK_IMAGE_CREATE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT)},
        {"VK_IMAGE_CREATE_2D_VIEW_COMPATIBLE_BIT_EXT", static_cast<uint64_t>(VK_IMAGE_CREATE_2D_VIEW_COMPATIBLE_BIT_EXT)},
        {"VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR", static_cast<uint64_t>(VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR)},
        {"VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_EXT", static_cast<uint64_t>(VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_EXT)},
        {"VK_IMAGE_CREATE_ALIAS_SINGLE_LAYER_DESCRIPTOR_BIT_KHR", static_cast<uint64_t>(VK_IMAGE_CREATE_ALIAS_SINGLE_LAYER_DESCRIPTOR_BIT_KHR)},
        {"VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR", static_cast<uint64_t>(VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR)},
        {"VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR", static_cast<uint64_t>(VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR)},
        {"VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR", static_cast<uint64_t>(VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR)},
        {"VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR", static_cast<uint64_t>(VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR)},
        {"VK_IMAGE_CREATE_DISJOINT_BIT_KHR", static_cast<uint64_t>(VK_IMAGE_CREATE_DISJOINT_BIT_KHR)},
        {"VK_IMAGE_CREATE_ALIAS_BIT_KHR", static_cast<uint64_t>(VK_IMAGE_CREATE_ALIAS_BIT_KHR)},
        {"VK_IMAGE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT", static_cast<uint64_t>(VK_IMAGE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT)},
        {"VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM", static_cast<uint64_t>(VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM)},
        // StdVideoH264LevelIdc
        {"STD_VIDEO_H264_LEVEL_IDC_1_0", static_cast<uint64_t>(STD_VIDEO_H264_LEVEL_IDC_1_0)},
        {"STD_VIDEO_H264_LEVEL_IDC_1_1", static_cast<uint64_t>(STD_VIDEO_H264_LEVEL_IDC_1_1)},
        {"STD_VIDEO_H264_LEVEL_IDC_1_2", static_cast<uint64_t>(STD_VIDEO_H264_LEVEL_IDC_1_2)},
        {"STD_VIDEO_H264_LEVEL_IDC_1_3", static_cast<uint64_t>(STD_VIDEO_H264_LEVEL_IDC_1_3)},
        {"STD_VIDEO_H264_LEVEL_IDC_2_0", static_cast<uint64_t>(STD_VIDEO_H264_LEVEL_IDC_2_0)},
        {"STD_VIDEO_H264_LEVEL_IDC_2_1", static_cast<uint64_t>(STD_VIDEO_H264_LEVEL_IDC_2_1)},
        {"STD_VIDEO_H264_LEVEL_IDC_2_2", static_cast<uint64_t>(STD_VIDEO_H264_LEVEL_IDC_2_2)},
        {"STD_VIDEO_H264_LEVEL_IDC_3_0", static_cast<uint64_t>(STD_VIDEO_H264_LEVEL_IDC_3_0)},
        {"STD_VIDEO_H264_LEVEL_IDC_3_1", static_cast<uint64_t>(STD_VIDEO_H264_LEVEL_IDC_3_1)},
        {"STD_VIDEO_H264_LEVEL_IDC_3_2", static_cast<uint64_t>(STD_VIDEO_H264_LEVEL_IDC_3_2)},
        {"STD_VIDEO_H264_LEVEL_IDC_4_0", static_cast<uint64_t>(STD_VIDEO_H264_LEVEL_IDC_4_0)},
        {"STD_VIDEO_H264_LEVEL_IDC_4_1", static_cast<uint64_t>(STD_VIDEO_H264_LEVEL_IDC_4_1)},
        {"STD_VIDEO_H264_LEVEL_IDC_4_2", static_cast<uint64_t>(STD_VIDEO_H264_LEVEL_IDC_4_2)},
        {"STD_VIDEO_H264_LEVEL_IDC_5_0", static_cast<uint64_t>(STD_VIDEO_H264_LEVEL_IDC_5_0)},
        {"STD_VIDEO_H264_LEVEL_IDC_5_1", static_cast<uint64_t>(STD_VIDEO_H264_LEVEL_IDC_5_1)},
        {"STD_VIDEO_H264_LEVEL_IDC_5_2", static_cast<uint64_t>(STD_VIDEO_H264_LEVEL_IDC_5_2)},
        {"STD_VIDEO_H264_LEVEL_IDC_6_0", static_cast<uint64_t>(STD_VIDEO_H264_LEVEL_IDC_6_0)},
        {"STD_VIDEO_H264_LEVEL_IDC_6_1", static_cast<uint64_t>(STD_VIDEO_H264_LEVEL_IDC_6_1)},
        {"STD_VIDEO_H264_LEVEL_IDC_6_2", static_cast<uint64_t>(STD_VIDEO_H264_LEVEL_IDC_6_2)},
        {"STD_VIDEO_H264_LEVEL_IDC_INVALID", static_cast<uint64_t>(STD_VIDEO_H264_LEVEL_IDC_INVALID)},
        // VkVideoChromaSubsamplingFlagBitsKHR
        {"VK_VIDEO_CHROMA_SUBSAMPLING_INVALID_KHR", static_cast<uint64_t>(VK_VIDEO_CHROMA_SUBSAMPLING_INVALID_KHR)},
        {"VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR)},
        {"VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR)},
        {"VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR)},
        {"VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR)},
        // VkVideoComponentBitDepthFlagBitsKHR
        {"VK_VIDEO_COMPONENT_BIT_DEPTH_INVALID_KHR", static_cast<uint64_t>(VK_VIDEO_COMPONENT_BIT_DEPTH_INVALID_KHR)},
        {"VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR)},
        {"VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR)},
        {"VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR)},
        // VkVideoEncodeCapabilityFlagBitsKHR
        {"VK_VIDEO_ENCODE_CAPABILITY_PRECEDING_EXTERNALLY_ENCODED_BYTES_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_CAPABILITY_PRECEDING_EXTERNALLY_ENCODED_BYTES_BIT_KHR)},
        {"VK_VIDEO_ENCODE_CAPABILITY_INSUFFICIENT_BITSTREAM_BUFFER_RANGE_DETECTION_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_CAPABILITY_INSUFFICIENT_BITSTREAM_BUFFER_RANGE_DETECTION_BIT_KHR)},
        {"VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR)},
        {"VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR)},
        // VkVideoEncodeIntraRefreshModeFlagBitsKHR
        {"VK_VIDEO_ENCODE_INTRA_REFRESH_MODE_NONE_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_INTRA_REFRESH_MODE_NONE_KHR)},
        {"VK_VIDEO_ENCODE_INTRA_REFRESH_MODE_PER_PICTURE_PARTITION_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_INTRA_REFRESH_MODE_PER_PICTURE_PARTITION_BIT_KHR)},
        {"VK_VIDEO_ENCODE_INTRA_REFRESH_MODE_BLOCK_BASED_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_INTRA_REFRESH_MODE_BLOCK_BASED_BIT_KHR)},
        {"VK_VIDEO_ENCODE_INTRA_REFRESH_MODE_BLOCK_ROW_BASED_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_INTRA_REFRESH_MODE_BLOCK_ROW_BASED_BIT_KHR)},
        {"VK_VIDEO_ENCODE_INTRA_REFRESH_MODE_BLOCK_COLUMN_BASED_BIT_KHR", static_cast<uint64_t>(VK_VIDEO_ENCODE_INTRA_REFRESH_MODE_BLOCK_COLUMN_BASED_BIT_KHR)},
        // VkLayeredDriverUnderlyingApiMSFT
        {"VK_LAYERED_DRIVER_UNDERLYING_API_NONE_MSFT", static_cast<uint64_t>(VK_LAYERED_DRIVER_UNDERLYING_API_NONE_MSFT)},
        {"VK_LAYERED_DRIVER_UNDERLYING_API_D3D12_MSFT", static_cast<uint64_t>(VK_LAYERED_DRIVER_UNDERLYING_API_D3D12_MSFT)},
    };
    const auto it = map.find(input_value);
    if (it != map.end()) {
        return it->second;
    }
    return 0;
}

static VkFormatFeatureFlags StringToVkFormatFeatureFlags(const std::string &input_value) {
    static const std::unordered_map<std::string, VkFormatFeatureFlags> map = {
        {"VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT", VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT},
        {"VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT", VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT},
        {"VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT", VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT},
        {"VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT", VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT},
        {"VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT", VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT},
        {"VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT", VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT},
        {"VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT", VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT},
        {"VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT", VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT},
        {"VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT", VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT},
        {"VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT", VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT},
        {"VK_FORMAT_FEATURE_BLIT_SRC_BIT", VK_FORMAT_FEATURE_BLIT_SRC_BIT},
        {"VK_FORMAT_FEATURE_BLIT_DST_BIT", VK_FORMAT_FEATURE_BLIT_DST_BIT},
        {"VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT", VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT},
        {"VK_FORMAT_FEATURE_TRANSFER_SRC_BIT", VK_FORMAT_FEATURE_TRANSFER_SRC_BIT},
        {"VK_FORMAT_FEATURE_TRANSFER_DST_BIT", VK_FORMAT_FEATURE_TRANSFER_DST_BIT},
        {"VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT", VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT},
        {"VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT", VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT},
        {"VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT", VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT},
        {"VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT", VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT},
        {"VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT", VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT},
        {"VK_FORMAT_FEATURE_DISJOINT_BIT", VK_FORMAT_FEATURE_DISJOINT_BIT},
        {"VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT", VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT},
        {"VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT", VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT},
        {"VK_FORMAT_FEATURE_VIDEO_DECODE_OUTPUT_BIT_KHR", VK_FORMAT_FEATURE_VIDEO_DECODE_OUTPUT_BIT_KHR},
        {"VK_FORMAT_FEATURE_VIDEO_DECODE_DPB_BIT_KHR", VK_FORMAT_FEATURE_VIDEO_DECODE_DPB_BIT_KHR},
        {"VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR", VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR},
        {"VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT", VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT},
        {"VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT", VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT},
        {"VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR", VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR},
        {"VK_FORMAT_FEATURE_VIDEO_ENCODE_INPUT_BIT_KHR", VK_FORMAT_FEATURE_VIDEO_ENCODE_INPUT_BIT_KHR},
        {"VK_FORMAT_FEATURE_VIDEO_ENCODE_DPB_BIT_KHR", VK_FORMAT_FEATURE_VIDEO_ENCODE_DPB_BIT_KHR},
        {"VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG", VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG},
        {"VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR", VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR},
        {"VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR", VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR},
        {"VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT", VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT},
        {"VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT_KHR", VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT_KHR},
        {"VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR", VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR},
        {"VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT_KHR", VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT_KHR},
        {"VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT_KHR", VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT_KHR},
        {"VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT_KHR", VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT_KHR},
        {"VK_FORMAT_FEATURE_DISJOINT_BIT_KHR", VK_FORMAT_FEATURE_DISJOINT_BIT_KHR},
        {"VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT_KHR", VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT_KHR},
    };
    const auto it = map.find(input_value);
    if (it != map.end()) {
        return it->second;
    }
    return VkFormatFeatureFlags{};
}

static VkQueueFlags StringToVkQueueFlags(const std::string &input_value) {
    static const std::unordered_map<std::string, VkQueueFlags> map = {
        {"VK_QUEUE_GRAPHICS_BIT", VK_QUEUE_GRAPHICS_BIT},
        {"VK_QUEUE_COMPUTE_BIT", VK_QUEUE_COMPUTE_BIT},
        {"VK_QUEUE_TRANSFER_BIT", VK_QUEUE_TRANSFER_BIT},
        {"VK_QUEUE_SPARSE_BINDING_BIT", VK_QUEUE_SPARSE_BINDING_BIT},
        {"VK_QUEUE_PROTECTED_BIT", VK_QUEUE_PROTECTED_BIT},
        {"VK_QUEUE_VIDEO_DECODE_BIT_KHR", VK_QUEUE_VIDEO_DECODE_BIT_KHR},
        {"VK_QUEUE_VIDEO_ENCODE_BIT_KHR", VK_QUEUE_VIDEO_ENCODE_BIT_KHR},
        {"VK_QUEUE_OPTICAL_FLOW_BIT_NV", VK_QUEUE_OPTICAL_FLOW_BIT_NV},
        {"VK_QUEUE_DATA_GRAPH_BIT_ARM", VK_QUEUE_DATA_GRAPH_BIT_ARM},
    };
    const auto it = map.find(input_value);
    if (it != map.end()) {
        return it->second;
    }
    return VkQueueFlags{};
}

static VkQueueGlobalPriorityKHR StringToVkQueueGlobalPriorityKHR(const std::string &input_value) {
    static const std::unordered_map<std::string, VkQueueGlobalPriorityKHR> map = {
        {"VK_QUEUE_GLOBAL_PRIORITY_LOW", VK_QUEUE_GLOBAL_PRIORITY_LOW},
        {"VK_QUEUE_GLOBAL_PRIORITY_MEDIUM", VK_QUEUE_GLOBAL_PRIORITY_MEDIUM},
        {"VK_QUEUE_GLOBAL_PRIORITY_HIGH", VK_QUEUE_GLOBAL_PRIORITY_HIGH},
        {"VK_QUEUE_GLOBAL_PRIORITY_REALTIME", VK_QUEUE_GLOBAL_PRIORITY_REALTIME},
        {"VK_QUEUE_GLOBAL_PRIORITY_LOW_EXT", VK_QUEUE_GLOBAL_PRIORITY_LOW_EXT},
        {"VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT", VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT},
        {"VK_QUEUE_GLOBAL_PRIORITY_HIGH_EXT", VK_QUEUE_GLOBAL_PRIORITY_HIGH_EXT},
        {"VK_QUEUE_GLOBAL_PRIORITY_REALTIME_EXT", VK_QUEUE_GLOBAL_PRIORITY_REALTIME_EXT},
        {"VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR", VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR},
        {"VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR", VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR},
        {"VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR", VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR},
        {"VK_QUEUE_GLOBAL_PRIORITY_REALTIME_KHR", VK_QUEUE_GLOBAL_PRIORITY_REALTIME_KHR},
    };
    const auto it = map.find(input_value);
    if (it != map.end()) {
        return it->second;
    }
    return VkQueueGlobalPriorityKHR{};
}

static VkVideoCodecOperationFlagsKHR StringToVkVideoCodecOperationFlagsKHR(const std::string &input_value) {
    static const std::unordered_map<std::string, VkVideoCodecOperationFlagsKHR> map = {
        {"VK_VIDEO_CODEC_OPERATION_NONE_KHR", VK_VIDEO_CODEC_OPERATION_NONE_KHR},
        {"VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR", VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR},
        {"VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR", VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR},
        {"VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR", VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR},
        {"VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR", VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR},
        {"VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR", VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR},
        {"VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR", VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR},
        {"VK_VIDEO_CODEC_OPERATION_DECODE_VP9_BIT_KHR", VK_VIDEO_CODEC_OPERATION_DECODE_VP9_BIT_KHR},
    };
    const auto it = map.find(input_value);
    if (it != map.end()) {
        return it->second;
    }
    return VkVideoCodecOperationFlagsKHR{};
}

static VkPipelineStageFlags StringToVkPipelineStageFlags(const std::string &input_value) {
    static const std::unordered_map<std::string, VkPipelineStageFlags> map = {
        {"VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT", VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT},
        {"VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT", VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT},
        {"VK_PIPELINE_STAGE_VERTEX_INPUT_BIT", VK_PIPELINE_STAGE_VERTEX_INPUT_BIT},
        {"VK_PIPELINE_STAGE_VERTEX_SHADER_BIT", VK_PIPELINE_STAGE_VERTEX_SHADER_BIT},
        {"VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT", VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT},
        {"VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT", VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT},
        {"VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT", VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT},
        {"VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT", VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT},
        {"VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT", VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT},
        {"VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT", VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT},
        {"VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT", VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT},
        {"VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT", VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT},
        {"VK_PIPELINE_STAGE_TRANSFER_BIT", VK_PIPELINE_STAGE_TRANSFER_BIT},
        {"VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT", VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT},
        {"VK_PIPELINE_STAGE_HOST_BIT", VK_PIPELINE_STAGE_HOST_BIT},
        {"VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT", VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT},
        {"VK_PIPELINE_STAGE_ALL_COMMANDS_BIT", VK_PIPELINE_STAGE_ALL_COMMANDS_BIT},
        {"VK_PIPELINE_STAGE_NONE", VK_PIPELINE_STAGE_NONE},
        {"VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT", VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT},
        {"VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT", VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT},
        {"VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR", VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR},
        {"VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR", VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR},
        {"VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT", VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT},
        {"VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR", VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR},
        {"VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT", VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT},
        {"VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT", VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT},
        {"VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_EXT", VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_EXT},
        {"VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV", VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV},
        {"VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_NV", VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_NV},
        {"VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_NV", VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_NV},
        {"VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV", VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV},
        {"VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV", VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV},
        {"VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV", VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV},
        {"VK_PIPELINE_STAGE_NONE_KHR", VK_PIPELINE_STAGE_NONE_KHR},
    };
    const auto it = map.find(input_value);
    if (it != map.end()) {
        return it->second;
    }
    return VkPipelineStageFlags{};
}

static VkPipelineStageFlags2 StringToVkPipelineStageFlags2(const std::string &input_value) {
    static const std::unordered_map<std::string, VkPipelineStageFlags2> map = {
        {"VK_PIPELINE_STAGE_2_NONE", VK_PIPELINE_STAGE_2_NONE},
        {"VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT", VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT},
        {"VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT", VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT},
        {"VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT", VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT},
        {"VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT", VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT},
        {"VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT", VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT},
        {"VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT", VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT},
        {"VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT", VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT},
        {"VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT", VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT},
        {"VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT", VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT},
        {"VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT", VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT},
        {"VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT", VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT},
        {"VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT", VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT},
        {"VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT", VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT},
        {"VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT", VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT},
        {"VK_PIPELINE_STAGE_2_HOST_BIT", VK_PIPELINE_STAGE_2_HOST_BIT},
        {"VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT", VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT},
        {"VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT", VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT},
        {"VK_PIPELINE_STAGE_2_COPY_BIT", VK_PIPELINE_STAGE_2_COPY_BIT},
        {"VK_PIPELINE_STAGE_2_RESOLVE_BIT", VK_PIPELINE_STAGE_2_RESOLVE_BIT},
        {"VK_PIPELINE_STAGE_2_BLIT_BIT", VK_PIPELINE_STAGE_2_BLIT_BIT},
        {"VK_PIPELINE_STAGE_2_CLEAR_BIT", VK_PIPELINE_STAGE_2_CLEAR_BIT},
        {"VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT", VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT},
        {"VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT", VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT},
        {"VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT", VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT},
        {"VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR", VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR", VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT", VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT},
        {"VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT", VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT},
        {"VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_EXT", VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_EXT},
        {"VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR", VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR", VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR", VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT", VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT},
        {"VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT", VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT},
        {"VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT", VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT},
        {"VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI", VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI},
        {"VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI", VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI},
        {"VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR", VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT", VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT},
        {"VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI", VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI},
        {"VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV", VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV},
        {"VK_PIPELINE_STAGE_2_CONVERT_COOPERATIVE_VECTOR_MATRIX_BIT_NV", VK_PIPELINE_STAGE_2_CONVERT_COOPERATIVE_VECTOR_MATRIX_BIT_NV},
        {"VK_PIPELINE_STAGE_2_DATA_GRAPH_BIT_ARM", VK_PIPELINE_STAGE_2_DATA_GRAPH_BIT_ARM},
        {"VK_PIPELINE_STAGE_2_COPY_INDIRECT_BIT_KHR", VK_PIPELINE_STAGE_2_COPY_INDIRECT_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_MEMORY_DECOMPRESSION_BIT_EXT", VK_PIPELINE_STAGE_2_MEMORY_DECOMPRESSION_BIT_EXT},
        {"VK_PIPELINE_STAGE_2_TRANSFER_BIT", VK_PIPELINE_STAGE_2_TRANSFER_BIT},
        {"VK_PIPELINE_STAGE_2_NONE_KHR", VK_PIPELINE_STAGE_2_NONE_KHR},
        {"VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR", VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT_KHR", VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT_KHR", VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT_KHR", VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT_KHR", VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT_KHR", VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT_KHR", VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT_KHR", VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT_KHR", VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT_KHR", VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR", VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT_KHR", VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT_KHR", VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR", VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR", VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_HOST_BIT_KHR", VK_PIPELINE_STAGE_2_HOST_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR", VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR", VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_COPY_BIT_KHR", VK_PIPELINE_STAGE_2_COPY_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_RESOLVE_BIT_KHR", VK_PIPELINE_STAGE_2_RESOLVE_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_BLIT_BIT_KHR", VK_PIPELINE_STAGE_2_BLIT_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_CLEAR_BIT_KHR", VK_PIPELINE_STAGE_2_CLEAR_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT_KHR", VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT_KHR", VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT_KHR", VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT_KHR},
        {"VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV", VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV},
        {"VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NV", VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NV},
        {"VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_NV", VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_NV},
        {"VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_NV", VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_NV},
        {"VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_NV", VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_NV},
        {"VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_NV", VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_NV},
        {"VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI", VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI},
    };
    const auto it = map.find(input_value);
    if (it != map.end()) {
        return it->second;
    }
    return VkPipelineStageFlags2{};
}

static VkFormatFeatureFlags2 StringToVkFormatFeatureFlags2(const std::string &input_value) {
    static const std::unordered_map<std::string, VkFormatFeatureFlags2> map = {
        {"VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT", VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT},
        {"VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT", VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT},
        {"VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT", VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT},
        {"VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT", VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT},
        {"VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT", VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT},
        {"VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_ATOMIC_BIT", VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_ATOMIC_BIT},
        {"VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT", VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT},
        {"VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT", VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT},
        {"VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT", VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT},
        {"VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT", VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT},
        {"VK_FORMAT_FEATURE_2_BLIT_SRC_BIT", VK_FORMAT_FEATURE_2_BLIT_SRC_BIT},
        {"VK_FORMAT_FEATURE_2_BLIT_DST_BIT", VK_FORMAT_FEATURE_2_BLIT_DST_BIT},
        {"VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT", VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT},
        {"VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT", VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT},
        {"VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT", VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT},
        {"VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT", VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT},
        {"VK_FORMAT_FEATURE_2_MIDPOINT_CHROMA_SAMPLES_BIT", VK_FORMAT_FEATURE_2_MIDPOINT_CHROMA_SAMPLES_BIT},
        {"VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT", VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT},
        {"VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT", VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT},
        {"VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT", VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT},
        {"VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT", VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT},
        {"VK_FORMAT_FEATURE_2_DISJOINT_BIT", VK_FORMAT_FEATURE_2_DISJOINT_BIT},
        {"VK_FORMAT_FEATURE_2_COSITED_CHROMA_SAMPLES_BIT", VK_FORMAT_FEATURE_2_COSITED_CHROMA_SAMPLES_BIT},
        {"VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT", VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT},
        {"VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT", VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT},
        {"VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT", VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT},
        {"VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_CUBIC_BIT", VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_CUBIC_BIT},
        {"VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT", VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT},
        {"VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR", VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR", VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR", VK_FORMAT_FEATURE_2_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_FRAGMENT_DENSITY_MAP_BIT_EXT", VK_FORMAT_FEATURE_2_FRAGMENT_DENSITY_MAP_BIT_EXT},
        {"VK_FORMAT_FEATURE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR", VK_FORMAT_FEATURE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR", VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR", VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_BLOCK_MATCHING_SXD_BIT_QCOM", VK_FORMAT_FEATURE_2_BLOCK_MATCHING_SXD_BIT_QCOM},
        {"VK_FORMAT_FEATURE_2_ACCELERATION_STRUCTURE_RADIUS_BUFFER_BIT_NV", VK_FORMAT_FEATURE_2_ACCELERATION_STRUCTURE_RADIUS_BUFFER_BIT_NV},
        {"VK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV", VK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV},
        {"VK_FORMAT_FEATURE_2_WEIGHT_IMAGE_BIT_QCOM", VK_FORMAT_FEATURE_2_WEIGHT_IMAGE_BIT_QCOM},
        {"VK_FORMAT_FEATURE_2_WEIGHT_SAMPLED_IMAGE_BIT_QCOM", VK_FORMAT_FEATURE_2_WEIGHT_SAMPLED_IMAGE_BIT_QCOM},
        {"VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM", VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM},
        {"VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM", VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM},
        {"VK_FORMAT_FEATURE_2_TENSOR_SHADER_BIT_ARM", VK_FORMAT_FEATURE_2_TENSOR_SHADER_BIT_ARM},
        {"VK_FORMAT_FEATURE_2_TENSOR_IMAGE_ALIASING_BIT_ARM", VK_FORMAT_FEATURE_2_TENSOR_IMAGE_ALIASING_BIT_ARM},
        {"VK_FORMAT_FEATURE_2_OPTICAL_FLOW_IMAGE_BIT_NV", VK_FORMAT_FEATURE_2_OPTICAL_FLOW_IMAGE_BIT_NV},
        {"VK_FORMAT_FEATURE_2_OPTICAL_FLOW_VECTOR_BIT_NV", VK_FORMAT_FEATURE_2_OPTICAL_FLOW_VECTOR_BIT_NV},
        {"VK_FORMAT_FEATURE_2_OPTICAL_FLOW_COST_BIT_NV", VK_FORMAT_FEATURE_2_OPTICAL_FLOW_COST_BIT_NV},
        {"VK_FORMAT_FEATURE_2_TENSOR_DATA_GRAPH_BIT_ARM", VK_FORMAT_FEATURE_2_TENSOR_DATA_GRAPH_BIT_ARM},
        {"VK_FORMAT_FEATURE_2_COPY_IMAGE_INDIRECT_DST_BIT_KHR", VK_FORMAT_FEATURE_2_COPY_IMAGE_INDIRECT_DST_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR", VK_FORMAT_FEATURE_2_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR", VK_FORMAT_FEATURE_2_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_2D_BIT_IMG", VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_2D_BIT_IMG},
        {"VK_FORMAT_FEATURE_2_DEPTH_COPY_ON_COMPUTE_QUEUE_BIT_KHR", VK_FORMAT_FEATURE_2_DEPTH_COPY_ON_COMPUTE_QUEUE_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_DEPTH_COPY_ON_TRANSFER_QUEUE_BIT_KHR", VK_FORMAT_FEATURE_2_DEPTH_COPY_ON_TRANSFER_QUEUE_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_STENCIL_COPY_ON_COMPUTE_QUEUE_BIT_KHR", VK_FORMAT_FEATURE_2_STENCIL_COPY_ON_COMPUTE_QUEUE_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_STENCIL_COPY_ON_TRANSFER_QUEUE_BIT_KHR", VK_FORMAT_FEATURE_2_STENCIL_COPY_ON_TRANSFER_QUEUE_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_DATA_GRAPH_OPTICAL_FLOW_IMAGE_BIT_ARM", VK_FORMAT_FEATURE_2_DATA_GRAPH_OPTICAL_FLOW_IMAGE_BIT_ARM},
        {"VK_FORMAT_FEATURE_2_DATA_GRAPH_OPTICAL_FLOW_VECTOR_BIT_ARM", VK_FORMAT_FEATURE_2_DATA_GRAPH_OPTICAL_FLOW_VECTOR_BIT_ARM},
        {"VK_FORMAT_FEATURE_2_DATA_GRAPH_OPTICAL_FLOW_COST_BIT_ARM", VK_FORMAT_FEATURE_2_DATA_GRAPH_OPTICAL_FLOW_COST_BIT_ARM},
        {"VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT_EXT", VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT_EXT},
        {"VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR", VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT_KHR", VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT_KHR", VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT_KHR", VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT_KHR", VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_ATOMIC_BIT_KHR", VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_ATOMIC_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT_KHR", VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR", VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT_KHR", VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT_KHR", VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_BLIT_SRC_BIT_KHR", VK_FORMAT_FEATURE_2_BLIT_SRC_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_BLIT_DST_BIT_KHR", VK_FORMAT_FEATURE_2_BLIT_DST_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT_KHR", VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT_KHR", VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT_KHR", VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_MIDPOINT_CHROMA_SAMPLES_BIT_KHR", VK_FORMAT_FEATURE_2_MIDPOINT_CHROMA_SAMPLES_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR", VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT_KHR", VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT_KHR", VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT_KHR", VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_DISJOINT_BIT_KHR", VK_FORMAT_FEATURE_2_DISJOINT_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_COSITED_CHROMA_SAMPLES_BIT_KHR", VK_FORMAT_FEATURE_2_COSITED_CHROMA_SAMPLES_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT_KHR", VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR", VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT_KHR", VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT_KHR", VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT_KHR},
        {"VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT", VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT},
    };
    const auto it = map.find(input_value);
    if (it != map.end()) {
        return it->second;
    }
    return VkFormatFeatureFlags2{};
}

static bool operator==(const VkOffset2D& lhs, const VkOffset2D& rhs) {
    if (lhs.x != rhs.x) return false;
    if (lhs.y != rhs.y) return false;
    return true;
}

static bool operator!=(const VkOffset2D& lhs, const VkOffset2D& rhs) {
    return !operator==(lhs, rhs);
}

template <>
struct std::hash<VkOffset2D> {
    std::size_t operator()(const VkOffset2D& k) const {        const std::size_t kMagic = 0x9e3779b97f4a7c16UL;
        std::size_t h = 0;
        h ^= std::hash<decltype(k.x)>{}(k.x) + kMagic + (h << 6) + (h >> 2);
        h ^= std::hash<decltype(k.y)>{}(k.y) + kMagic + (h << 6) + (h >> 2);
        return h;
    }
};

static bool operator==(const VkOffset3D& lhs, const VkOffset3D& rhs) {
    if (lhs.x != rhs.x) return false;
    if (lhs.y != rhs.y) return false;
    if (lhs.z != rhs.z) return false;
    return true;
}

static bool operator!=(const VkOffset3D& lhs, const VkOffset3D& rhs) {
    return !operator==(lhs, rhs);
}

template <>
struct std::hash<VkOffset3D> {
    std::size_t operator()(const VkOffset3D& k) const {        const std::size_t kMagic = 0x9e3779b97f4a7c16UL;
        std::size_t h = 0;
        h ^= std::hash<decltype(k.x)>{}(k.x) + kMagic + (h << 6) + (h >> 2);
        h ^= std::hash<decltype(k.y)>{}(k.y) + kMagic + (h << 6) + (h >> 2);
        h ^= std::hash<decltype(k.z)>{}(k.z) + kMagic + (h << 6) + (h >> 2);
        return h;
    }
};

static bool operator==(const VkExtent2D& lhs, const VkExtent2D& rhs) {
    if (lhs.width != rhs.width) return false;
    if (lhs.height != rhs.height) return false;
    return true;
}

static bool operator!=(const VkExtent2D& lhs, const VkExtent2D& rhs) {
    return !operator==(lhs, rhs);
}

template <>
struct std::hash<VkExtent2D> {
    std::size_t operator()(const VkExtent2D& k) const {        const std::size_t kMagic = 0x9e3779b97f4a7c16UL;
        std::size_t h = 0;
        h ^= std::hash<decltype(k.width)>{}(k.width) + kMagic + (h << 6) + (h >> 2);
        h ^= std::hash<decltype(k.height)>{}(k.height) + kMagic + (h << 6) + (h >> 2);
        return h;
    }
};

static bool operator==(const VkExtent3D& lhs, const VkExtent3D& rhs) {
    if (lhs.width != rhs.width) return false;
    if (lhs.height != rhs.height) return false;
    if (lhs.depth != rhs.depth) return false;
    return true;
}

static bool operator!=(const VkExtent3D& lhs, const VkExtent3D& rhs) {
    return !operator==(lhs, rhs);
}

template <>
struct std::hash<VkExtent3D> {
    std::size_t operator()(const VkExtent3D& k) const {        const std::size_t kMagic = 0x9e3779b97f4a7c16UL;
        std::size_t h = 0;
        h ^= std::hash<decltype(k.width)>{}(k.width) + kMagic + (h << 6) + (h >> 2);
        h ^= std::hash<decltype(k.height)>{}(k.height) + kMagic + (h << 6) + (h >> 2);
        h ^= std::hash<decltype(k.depth)>{}(k.depth) + kMagic + (h << 6) + (h >> 2);
        return h;
    }
};

static bool operator==(const VkComponentMapping& lhs, const VkComponentMapping& rhs) {
    if (lhs.r != rhs.r) return false;
    if (lhs.g != rhs.g) return false;
    if (lhs.b != rhs.b) return false;
    if (lhs.a != rhs.a) return false;
    return true;
}

static bool operator!=(const VkComponentMapping& lhs, const VkComponentMapping& rhs) {
    return !operator==(lhs, rhs);
}

template <>
struct std::hash<VkComponentMapping> {
    std::size_t operator()(const VkComponentMapping& k) const {        const std::size_t kMagic = 0x9e3779b97f4a7c16UL;
        std::size_t h = 0;
        h ^= std::hash<decltype(k.r)>{}(k.r) + kMagic + (h << 6) + (h >> 2);
        h ^= std::hash<decltype(k.g)>{}(k.g) + kMagic + (h << 6) + (h >> 2);
        h ^= std::hash<decltype(k.b)>{}(k.b) + kMagic + (h << 6) + (h >> 2);
        h ^= std::hash<decltype(k.a)>{}(k.a) + kMagic + (h << 6) + (h >> 2);
        return h;
    }
};

// Global constants //////////////////////////////////////////////////////////////////////////////////////////////////////////////

// For new features/functionality, increment the minor level and reset patch level to zero.
// For any changes, at least increment the patch level.  See https://semver.org/
// When updating the version, be sure to make corresponding changes to the layer manifest file at
// layer/VkLayer_khronos_profiles.json.in

const uint32_t kVersionProfilesMajor = 1;
const uint32_t kVersionProfilesMinor = 3;
const uint32_t kVersionProfilesPatch = 0;
const uint32_t kVersionProfilesImplementation =
    VK_MAKE_VERSION(kVersionProfilesMajor, kVersionProfilesMinor, kVersionProfilesPatch);

static const char *SCHEMA_URI_BASE = "https://schema.khronos.org/vulkan/profiles-";

// Properties of this layer:
const VkLayerProperties kLayerProperties[] = {{
    kLayerName,                   // layerName
    VK_MAKE_VERSION(1, 0, 68),       // specVersion (clamped to final 1.0 spec version)
    kVersionProfilesImplementation,  // implementationVersion
    "Khronos Profiles layer"         // description
}};
const uint32_t kLayerPropertiesCount = (sizeof(kLayerProperties) / sizeof(kLayerProperties[0]));

// Instance extensions that this layer provides:
const VkExtensionProperties kInstanceExtensionProperties[] = {
    VkExtensionProperties{VK_EXT_LAYER_SETTINGS_EXTENSION_NAME, VK_EXT_LAYER_SETTINGS_SPEC_VERSION}};
const uint32_t kInstanceExtensionPropertiesCount = static_cast<uint32_t>(std::size(kInstanceExtensionProperties));

// Device extensions that this layer provides:
const std::array<VkExtensionProperties, 2> kDeviceExtensionProperties = {
    {{VK_EXT_TOOLING_INFO_EXTENSION_NAME, VK_EXT_TOOLING_INFO_SPEC_VERSION},
     {VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME, VK_KHR_PORTABILITY_SUBSET_SPEC_VERSION}}};
const uint32_t kDeviceExtensionPropertiesCount = static_cast<uint32_t>(kDeviceExtensionProperties.size());

// Global variables //////////////////////////////////////////////////////////////////////////////////////////////////////////////

uint32_t requested_version = 0;
bool device_has_astc_hdr = false;
bool device_has_astc = false;
bool device_has_etc2 = false;
bool device_has_bc = false;
bool device_has_pvrtc = false;

std::recursive_mutex global_lock;  // Enforce thread-safety for this layer.

#define GET_VALUE(member, name, not_modifiable, requested_profile) GetValue(device_name, parent, member, #name, &dest->name, not_modifiable, requested_profile)
#define GET_ARRAY(member, name, not_modifiable) GetArray(device_name, parent, member, #name, dest->name, not_modifiable)

#define GET_VALUE_WARN(member, name, not_modifiable, requested_profile, warn_func)                     \
    if (!GetValue(device_name, parent, member, #name, &dest->name, not_modifiable, requested_profile, warn_func)) { \
        valid = false;                                                              \
    }
#define GET_VALUE_SIZE_T_WARN(member, name, not_modifiable, requested_profile, warn_func)                   \
    if (!GetValueSizet(device_name, parent, member, #name, &dest->name, not_modifiable, requested_profile, warn_func)) { \
        valid = false;                                                                   \
    }
#define GET_VALUE_FLAG_WARN(member, name, not_modifiable, requested_profile)                    \
    if (!GetValueFlag(device_name, parent, member, #name, &dest->name, not_modifiable, requested_profile)) { \
        valid = false;                                                       \
    }
#define GET_VALUE_ENUM_WARN(member, name, not_modifiable, requested_profile, warn_func)                    \
    if (!GetValueEnum(device_name, parent, member, #name, &dest->name, not_modifiable, requested_profile, warn_func)) { \
        valid = false;                                                                  \
    }

static bool IsInstanceExtension(const char* name) {
	 const char* table[] = {
          "VK_KHR_surface",
          "VK_KHR_display",
          "VK_KHR_xlib_surface",
          "VK_KHR_xcb_surface",
          "VK_KHR_wayland_surface",
          "VK_KHR_android_surface",
          "VK_KHR_win32_surface",
          "VK_EXT_debug_report",
          "VK_GGP_stream_descriptor_surface",
          "VK_NV_external_memory_capabilities",
          "VK_KHR_get_physical_device_properties2",
          "VK_EXT_validation_flags",
          "VK_NN_vi_surface",
          "VK_KHR_device_group_creation",
          "VK_KHR_external_memory_capabilities",
          "VK_KHR_external_semaphore_capabilities",
          "VK_EXT_direct_mode_display",
          "VK_EXT_acquire_xlib_display",
          "VK_EXT_display_surface_counter",
          "VK_EXT_swapchain_colorspace",
          "VK_KHR_external_fence_capabilities",
          "VK_KHR_get_surface_capabilities2",
          "VK_KHR_get_display_properties2",
          "VK_MVK_ios_surface",
          "VK_MVK_macos_surface",
          "VK_EXT_debug_utils",
          "VK_FUCHSIA_imagepipe_surface",
          "VK_EXT_metal_surface",
          "VK_KHR_surface_protected_capabilities",
          "VK_EXT_validation_features",
          "VK_EXT_headless_surface",
          "VK_EXT_surface_maintenance1",
          "VK_EXT_acquire_drm_display",
          "VK_EXT_directfb_surface",
          "VK_QNX_screen_surface",
          "VK_KHR_portability_enumeration",
          "VK_GOOGLE_surfaceless_query",
          "VK_LUNARG_direct_driver_loading",
          "VK_KHR_surface_maintenance1",
          "VK_EXT_layer_settings",
          "VK_NV_display_stereo",
          "VK_OHOS_surface",
          "VK_SEC_ubm_surface"
     };

     bool result = false;
     for (std::size_t i = 0, n = std::size(table); i < n; ++i) {
           if (strcmp(table[i], name) == 0) {
               result = true;
               break;
           }
     }

     return result;
}

struct VideoProfileInfoChain {
    bool valid{false};
    VkVideoProfileInfoKHR video_profile_info_{};
    VkVideoDecodeAV1ProfileInfoKHR video_decode_av_1_profile_info_{};
    VkVideoDecodeH264ProfileInfoKHR video_decode_h_264_profile_info_{};
    VkVideoDecodeH265ProfileInfoKHR video_decode_h_265_profile_info_{};
    VkVideoDecodeVP9ProfileInfoKHR video_decode_vp_9_profile_info_{};
    VkVideoEncodeAV1ProfileInfoKHR video_encode_av_1_profile_info_{};
    VkVideoEncodeH264ProfileInfoKHR video_encode_h_264_profile_info_{};
    VkVideoEncodeH265ProfileInfoKHR video_encode_h_265_profile_info_{};

    VideoProfileInfoChain() {}
    VideoProfileInfoChain(const VideoProfileInfoChain& info) {
        InitFrom(&info.video_profile_info_);
    }

    VideoProfileInfoChain(const VkVideoProfileInfoKHR *info) {
        InitFrom(info);
    }

    VideoProfileInfoChain& operator=(const VideoProfileInfoChain& rhs) {
        InitFrom(&rhs.video_profile_info_);
        return *this;
    }

    void InitFrom(const VkVideoProfileInfoKHR *info) {
        auto p = reinterpret_cast<const VkBaseInStructure*>(info);
        valid = true;
        const void** ppnext = nullptr;
        while (p != nullptr) {
            switch (p->sType) {
                case VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR:
                    if (ppnext != nullptr) *ppnext = &video_profile_info_;
                    video_profile_info_ = *reinterpret_cast<const VkVideoProfileInfoKHR*>(p);
                    video_profile_info_.pNext = nullptr;
                    ppnext = &video_profile_info_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PROFILE_INFO_KHR:
                    if (ppnext != nullptr) *ppnext = &video_decode_av_1_profile_info_;
                    video_decode_av_1_profile_info_ = *reinterpret_cast<const VkVideoDecodeAV1ProfileInfoKHR*>(p);
                    video_decode_av_1_profile_info_.pNext = nullptr;
                    ppnext = &video_decode_av_1_profile_info_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR:
                    if (ppnext != nullptr) *ppnext = &video_decode_h_264_profile_info_;
                    video_decode_h_264_profile_info_ = *reinterpret_cast<const VkVideoDecodeH264ProfileInfoKHR*>(p);
                    video_decode_h_264_profile_info_.pNext = nullptr;
                    ppnext = &video_decode_h_264_profile_info_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR:
                    if (ppnext != nullptr) *ppnext = &video_decode_h_265_profile_info_;
                    video_decode_h_265_profile_info_ = *reinterpret_cast<const VkVideoDecodeH265ProfileInfoKHR*>(p);
                    video_decode_h_265_profile_info_.pNext = nullptr;
                    ppnext = &video_decode_h_265_profile_info_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_DECODE_VP9_PROFILE_INFO_KHR:
                    if (ppnext != nullptr) *ppnext = &video_decode_vp_9_profile_info_;
                    video_decode_vp_9_profile_info_ = *reinterpret_cast<const VkVideoDecodeVP9ProfileInfoKHR*>(p);
                    video_decode_vp_9_profile_info_.pNext = nullptr;
                    ppnext = &video_decode_vp_9_profile_info_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PROFILE_INFO_KHR:
                    if (ppnext != nullptr) *ppnext = &video_encode_av_1_profile_info_;
                    video_encode_av_1_profile_info_ = *reinterpret_cast<const VkVideoEncodeAV1ProfileInfoKHR*>(p);
                    video_encode_av_1_profile_info_.pNext = nullptr;
                    ppnext = &video_encode_av_1_profile_info_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_INFO_KHR:
                    if (ppnext != nullptr) *ppnext = &video_encode_h_264_profile_info_;
                    video_encode_h_264_profile_info_ = *reinterpret_cast<const VkVideoEncodeH264ProfileInfoKHR*>(p);
                    video_encode_h_264_profile_info_.pNext = nullptr;
                    ppnext = &video_encode_h_264_profile_info_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_INFO_KHR:
                    if (ppnext != nullptr) *ppnext = &video_encode_h_265_profile_info_;
                    video_encode_h_265_profile_info_ = *reinterpret_cast<const VkVideoEncodeH265ProfileInfoKHR*>(p);
                    video_encode_h_265_profile_info_.pNext = nullptr;
                    ppnext = &video_encode_h_265_profile_info_.pNext;
                    break;
                default:
                    valid = false;
                    return;
            }
            p = p->pNext;
        }
    }

    bool operator==(const VideoProfileInfoChain &rhs) const {
        if (video_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR) {
            if (rhs.video_profile_info_.sType != VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR) return false;
            if (video_profile_info_.videoCodecOperation != rhs.video_profile_info_.videoCodecOperation) return false;
            if (video_profile_info_.chromaSubsampling != rhs.video_profile_info_.chromaSubsampling) return false;
            if (video_profile_info_.lumaBitDepth != rhs.video_profile_info_.lumaBitDepth) return false;
            if (video_profile_info_.chromaBitDepth != rhs.video_profile_info_.chromaBitDepth) return false;
        } else {
            if (rhs.video_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR) return false;
        }
        if (video_decode_av_1_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PROFILE_INFO_KHR) {
            if (rhs.video_decode_av_1_profile_info_.sType != VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PROFILE_INFO_KHR) return false;
            if (video_decode_av_1_profile_info_.stdProfile != rhs.video_decode_av_1_profile_info_.stdProfile) return false;
            if (video_decode_av_1_profile_info_.filmGrainSupport != rhs.video_decode_av_1_profile_info_.filmGrainSupport) return false;
        } else {
            if (rhs.video_decode_av_1_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PROFILE_INFO_KHR) return false;
        }
        if (video_decode_h_264_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR) {
            if (rhs.video_decode_h_264_profile_info_.sType != VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR) return false;
            if (video_decode_h_264_profile_info_.stdProfileIdc != rhs.video_decode_h_264_profile_info_.stdProfileIdc) return false;
            if (video_decode_h_264_profile_info_.pictureLayout != rhs.video_decode_h_264_profile_info_.pictureLayout) return false;
        } else {
            if (rhs.video_decode_h_264_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR) return false;
        }
        if (video_decode_h_265_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR) {
            if (rhs.video_decode_h_265_profile_info_.sType != VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR) return false;
            if (video_decode_h_265_profile_info_.stdProfileIdc != rhs.video_decode_h_265_profile_info_.stdProfileIdc) return false;
        } else {
            if (rhs.video_decode_h_265_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR) return false;
        }
        if (video_decode_vp_9_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_VP9_PROFILE_INFO_KHR) {
            if (rhs.video_decode_vp_9_profile_info_.sType != VK_STRUCTURE_TYPE_VIDEO_DECODE_VP9_PROFILE_INFO_KHR) return false;
            if (video_decode_vp_9_profile_info_.stdProfile != rhs.video_decode_vp_9_profile_info_.stdProfile) return false;
        } else {
            if (rhs.video_decode_vp_9_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_VP9_PROFILE_INFO_KHR) return false;
        }
        if (video_encode_av_1_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PROFILE_INFO_KHR) {
            if (rhs.video_encode_av_1_profile_info_.sType != VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PROFILE_INFO_KHR) return false;
            if (video_encode_av_1_profile_info_.stdProfile != rhs.video_encode_av_1_profile_info_.stdProfile) return false;
        } else {
            if (rhs.video_encode_av_1_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PROFILE_INFO_KHR) return false;
        }
        if (video_encode_h_264_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_INFO_KHR) {
            if (rhs.video_encode_h_264_profile_info_.sType != VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_INFO_KHR) return false;
            if (video_encode_h_264_profile_info_.stdProfileIdc != rhs.video_encode_h_264_profile_info_.stdProfileIdc) return false;
        } else {
            if (rhs.video_encode_h_264_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_INFO_KHR) return false;
        }
        if (video_encode_h_265_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_INFO_KHR) {
            if (rhs.video_encode_h_265_profile_info_.sType != VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_INFO_KHR) return false;
            if (video_encode_h_265_profile_info_.stdProfileIdc != rhs.video_encode_h_265_profile_info_.stdProfileIdc) return false;
        } else {
            if (rhs.video_encode_h_265_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_INFO_KHR) return false;
        }
        return true;
    }

    struct hash {
        std::size_t operator()(const VideoProfileInfoChain& key) const {
            std::size_t h = 0;
            const std::size_t kMagic = 0x9e3779b97f4a7c16UL;
            if (key.video_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR) {
                h ^= std::hash<decltype(key.video_profile_info_.videoCodecOperation)>{}(key.video_profile_info_.videoCodecOperation) + kMagic + (h << 6) + (h >> 2);
                h ^= std::hash<decltype(key.video_profile_info_.chromaSubsampling)>{}(key.video_profile_info_.chromaSubsampling) + kMagic + (h << 6) + (h >> 2);
                h ^= std::hash<decltype(key.video_profile_info_.lumaBitDepth)>{}(key.video_profile_info_.lumaBitDepth) + kMagic + (h << 6) + (h >> 2);
                h ^= std::hash<decltype(key.video_profile_info_.chromaBitDepth)>{}(key.video_profile_info_.chromaBitDepth) + kMagic + (h << 6) + (h >> 2);
            }
            if (key.video_decode_av_1_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PROFILE_INFO_KHR) {
                h ^= std::hash<decltype(key.video_decode_av_1_profile_info_.stdProfile)>{}(key.video_decode_av_1_profile_info_.stdProfile) + kMagic + (h << 6) + (h >> 2);
                h ^= std::hash<decltype(key.video_decode_av_1_profile_info_.filmGrainSupport)>{}(key.video_decode_av_1_profile_info_.filmGrainSupport) + kMagic + (h << 6) + (h >> 2);
            }
            if (key.video_decode_h_264_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR) {
                h ^= std::hash<decltype(key.video_decode_h_264_profile_info_.stdProfileIdc)>{}(key.video_decode_h_264_profile_info_.stdProfileIdc) + kMagic + (h << 6) + (h >> 2);
                h ^= std::hash<decltype(key.video_decode_h_264_profile_info_.pictureLayout)>{}(key.video_decode_h_264_profile_info_.pictureLayout) + kMagic + (h << 6) + (h >> 2);
            }
            if (key.video_decode_h_265_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR) {
                h ^= std::hash<decltype(key.video_decode_h_265_profile_info_.stdProfileIdc)>{}(key.video_decode_h_265_profile_info_.stdProfileIdc) + kMagic + (h << 6) + (h >> 2);
            }
            if (key.video_decode_vp_9_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_VP9_PROFILE_INFO_KHR) {
                h ^= std::hash<decltype(key.video_decode_vp_9_profile_info_.stdProfile)>{}(key.video_decode_vp_9_profile_info_.stdProfile) + kMagic + (h << 6) + (h >> 2);
            }
            if (key.video_encode_av_1_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PROFILE_INFO_KHR) {
                h ^= std::hash<decltype(key.video_encode_av_1_profile_info_.stdProfile)>{}(key.video_encode_av_1_profile_info_.stdProfile) + kMagic + (h << 6) + (h >> 2);
            }
            if (key.video_encode_h_264_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_INFO_KHR) {
                h ^= std::hash<decltype(key.video_encode_h_264_profile_info_.stdProfileIdc)>{}(key.video_encode_h_264_profile_info_.stdProfileIdc) + kMagic + (h << 6) + (h >> 2);
            }
            if (key.video_encode_h_265_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_INFO_KHR) {
                h ^= std::hash<decltype(key.video_encode_h_265_profile_info_.stdProfileIdc)>{}(key.video_encode_h_265_profile_info_.stdProfileIdc) + kMagic + (h << 6) + (h >> 2);
            }
            return h;
        }
    };
};

template <> struct std::hash<VideoProfileInfoChain> : VideoProfileInfoChain::hash {};

class JsonVideoProfileInfo {
    bool is_valid_{false};
    bool video_profile_info_defined_{false};
    struct {
        std::optional<VkVideoCodecOperationFlagBitsKHR> videoCodecOperation{};
        std::optional<VkVideoChromaSubsamplingFlagsKHR> chromaSubsampling{};
        std::optional<VkVideoComponentBitDepthFlagsKHR> lumaBitDepth{};
        std::optional<VkVideoComponentBitDepthFlagsKHR> chromaBitDepth{};
    } video_profile_info_{};
    bool video_decode_av_1_profile_info_defined_{false};
    struct {
        std::optional<StdVideoAV1Profile> stdProfile{};
        std::optional<VkBool32> filmGrainSupport{};
    } video_decode_av_1_profile_info_{};
    bool video_decode_h_264_profile_info_defined_{false};
    struct {
        std::optional<StdVideoH264ProfileIdc> stdProfileIdc{};
        std::optional<VkVideoDecodeH264PictureLayoutFlagBitsKHR> pictureLayout{};
    } video_decode_h_264_profile_info_{};
    bool video_decode_h_265_profile_info_defined_{false};
    struct {
        std::optional<StdVideoH265ProfileIdc> stdProfileIdc{};
    } video_decode_h_265_profile_info_{};
    bool video_decode_vp_9_profile_info_defined_{false};
    struct {
        std::optional<StdVideoVP9Profile> stdProfile{};
    } video_decode_vp_9_profile_info_{};
    bool video_encode_av_1_profile_info_defined_{false};
    struct {
        std::optional<StdVideoAV1Profile> stdProfile{};
    } video_encode_av_1_profile_info_{};
    bool video_encode_h_264_profile_info_defined_{false};
    struct {
        std::optional<StdVideoH264ProfileIdc> stdProfileIdc{};
    } video_encode_h_264_profile_info_{};
    bool video_encode_h_265_profile_info_defined_{false};
    struct {
        std::optional<StdVideoH265ProfileIdc> stdProfileIdc{};
    } video_encode_h_265_profile_info_{};

    bool ParseJson(const Json::Value &profile_json) {
        if (!profile_json.isMember("profile")) return true;
        const Json::Value &profile_info_json = profile_json["profile"];
        const Json::Value *video_profile_info_json = nullptr;
        if (profile_info_json.isMember("VkVideoProfileInfoKHR")) {
            if (video_profile_info_json != nullptr) return false;
            video_profile_info_json = &profile_info_json["VkVideoProfileInfoKHR"];
        }
        if (video_profile_info_json != nullptr) {
            video_profile_info_defined_ = true;
            if (video_profile_info_json->isMember("videoCodecOperation")) {
                const Json::Value &value = (*video_profile_info_json)["videoCodecOperation"];
                if (!value.isString()) return false;
                video_profile_info_.videoCodecOperation = static_cast<VkVideoCodecOperationFlagBitsKHR>(VkStringToUint64(value.asString()));
            }
            if (video_profile_info_json->isMember("chromaSubsampling")) {
                const Json::Value &value = (*video_profile_info_json)["chromaSubsampling"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_profile_info_.chromaSubsampling = static_cast<VkVideoChromaSubsamplingFlagsKHR>(mask);
            }
            if (video_profile_info_json->isMember("lumaBitDepth")) {
                const Json::Value &value = (*video_profile_info_json)["lumaBitDepth"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_profile_info_.lumaBitDepth = static_cast<VkVideoComponentBitDepthFlagsKHR>(mask);
            }
            if (video_profile_info_json->isMember("chromaBitDepth")) {
                const Json::Value &value = (*video_profile_info_json)["chromaBitDepth"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_profile_info_.chromaBitDepth = static_cast<VkVideoComponentBitDepthFlagsKHR>(mask);
            }
        }
        const Json::Value *video_decode_av_1_profile_info_json = nullptr;
        if (profile_info_json.isMember("VkVideoDecodeAV1ProfileInfoKHR")) {
            if (video_decode_av_1_profile_info_json != nullptr) return false;
            video_decode_av_1_profile_info_json = &profile_info_json["VkVideoDecodeAV1ProfileInfoKHR"];
        }
        if (video_decode_av_1_profile_info_json != nullptr) {
            video_decode_av_1_profile_info_defined_ = true;
            if (video_decode_av_1_profile_info_json->isMember("stdProfile")) {
                const Json::Value &value = (*video_decode_av_1_profile_info_json)["stdProfile"];
                if (!value.isString()) return false;
                video_decode_av_1_profile_info_.stdProfile = static_cast<StdVideoAV1Profile>(VkStringToUint64(value.asString()));
            }
            if (video_decode_av_1_profile_info_json->isMember("filmGrainSupport")) {
                const Json::Value &value = (*video_decode_av_1_profile_info_json)["filmGrainSupport"];
                if (!value.isBool()) return false;
                video_decode_av_1_profile_info_.filmGrainSupport = value.asBool() ? VK_TRUE : VK_FALSE;
            }
        }
        const Json::Value *video_decode_h_264_profile_info_json = nullptr;
        if (profile_info_json.isMember("VkVideoDecodeH264ProfileInfoKHR")) {
            if (video_decode_h_264_profile_info_json != nullptr) return false;
            video_decode_h_264_profile_info_json = &profile_info_json["VkVideoDecodeH264ProfileInfoKHR"];
        }
        if (video_decode_h_264_profile_info_json != nullptr) {
            video_decode_h_264_profile_info_defined_ = true;
            if (video_decode_h_264_profile_info_json->isMember("stdProfileIdc")) {
                const Json::Value &value = (*video_decode_h_264_profile_info_json)["stdProfileIdc"];
                if (!value.isString()) return false;
                video_decode_h_264_profile_info_.stdProfileIdc = static_cast<StdVideoH264ProfileIdc>(VkStringToUint64(value.asString()));
            }
            if (video_decode_h_264_profile_info_json->isMember("pictureLayout")) {
                const Json::Value &value = (*video_decode_h_264_profile_info_json)["pictureLayout"];
                if (!value.isString()) return false;
                video_decode_h_264_profile_info_.pictureLayout = static_cast<VkVideoDecodeH264PictureLayoutFlagBitsKHR>(VkStringToUint64(value.asString()));
            }
        }
        const Json::Value *video_decode_h_265_profile_info_json = nullptr;
        if (profile_info_json.isMember("VkVideoDecodeH265ProfileInfoKHR")) {
            if (video_decode_h_265_profile_info_json != nullptr) return false;
            video_decode_h_265_profile_info_json = &profile_info_json["VkVideoDecodeH265ProfileInfoKHR"];
        }
        if (video_decode_h_265_profile_info_json != nullptr) {
            video_decode_h_265_profile_info_defined_ = true;
            if (video_decode_h_265_profile_info_json->isMember("stdProfileIdc")) {
                const Json::Value &value = (*video_decode_h_265_profile_info_json)["stdProfileIdc"];
                if (!value.isString()) return false;
                video_decode_h_265_profile_info_.stdProfileIdc = static_cast<StdVideoH265ProfileIdc>(VkStringToUint64(value.asString()));
            }
        }
        const Json::Value *video_decode_vp_9_profile_info_json = nullptr;
        if (profile_info_json.isMember("VkVideoDecodeVP9ProfileInfoKHR")) {
            if (video_decode_vp_9_profile_info_json != nullptr) return false;
            video_decode_vp_9_profile_info_json = &profile_info_json["VkVideoDecodeVP9ProfileInfoKHR"];
        }
        if (video_decode_vp_9_profile_info_json != nullptr) {
            video_decode_vp_9_profile_info_defined_ = true;
            if (video_decode_vp_9_profile_info_json->isMember("stdProfile")) {
                const Json::Value &value = (*video_decode_vp_9_profile_info_json)["stdProfile"];
                if (!value.isString()) return false;
                video_decode_vp_9_profile_info_.stdProfile = static_cast<StdVideoVP9Profile>(VkStringToUint64(value.asString()));
            }
        }
        const Json::Value *video_encode_av_1_profile_info_json = nullptr;
        if (profile_info_json.isMember("VkVideoEncodeAV1ProfileInfoKHR")) {
            if (video_encode_av_1_profile_info_json != nullptr) return false;
            video_encode_av_1_profile_info_json = &profile_info_json["VkVideoEncodeAV1ProfileInfoKHR"];
        }
        if (video_encode_av_1_profile_info_json != nullptr) {
            video_encode_av_1_profile_info_defined_ = true;
            if (video_encode_av_1_profile_info_json->isMember("stdProfile")) {
                const Json::Value &value = (*video_encode_av_1_profile_info_json)["stdProfile"];
                if (!value.isString()) return false;
                video_encode_av_1_profile_info_.stdProfile = static_cast<StdVideoAV1Profile>(VkStringToUint64(value.asString()));
            }
        }
        const Json::Value *video_encode_h_264_profile_info_json = nullptr;
        if (profile_info_json.isMember("VkVideoEncodeH264ProfileInfoKHR")) {
            if (video_encode_h_264_profile_info_json != nullptr) return false;
            video_encode_h_264_profile_info_json = &profile_info_json["VkVideoEncodeH264ProfileInfoKHR"];
        }
        if (video_encode_h_264_profile_info_json != nullptr) {
            video_encode_h_264_profile_info_defined_ = true;
            if (video_encode_h_264_profile_info_json->isMember("stdProfileIdc")) {
                const Json::Value &value = (*video_encode_h_264_profile_info_json)["stdProfileIdc"];
                if (!value.isString()) return false;
                video_encode_h_264_profile_info_.stdProfileIdc = static_cast<StdVideoH264ProfileIdc>(VkStringToUint64(value.asString()));
            }
        }
        const Json::Value *video_encode_h_265_profile_info_json = nullptr;
        if (profile_info_json.isMember("VkVideoEncodeH265ProfileInfoKHR")) {
            if (video_encode_h_265_profile_info_json != nullptr) return false;
            video_encode_h_265_profile_info_json = &profile_info_json["VkVideoEncodeH265ProfileInfoKHR"];
        }
        if (video_encode_h_265_profile_info_json != nullptr) {
            video_encode_h_265_profile_info_defined_ = true;
            if (video_encode_h_265_profile_info_json->isMember("stdProfileIdc")) {
                const Json::Value &value = (*video_encode_h_265_profile_info_json)["stdProfileIdc"];
                if (!value.isString()) return false;
                video_encode_h_265_profile_info_.stdProfileIdc = static_cast<StdVideoH265ProfileIdc>(VkStringToUint64(value.asString()));
            }
        }
        return true;
    }

  public:
    JsonVideoProfileInfo() = default;
    JsonVideoProfileInfo(const Json::Value &profile_json) {
        is_valid_ = ParseJson(profile_json);
    }

    bool IsValid() const { return is_valid_; }

    bool IsMatching(const VideoProfileInfoChain &profile_info) const {
        if (profile_info.video_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR) {
            if (video_profile_info_.videoCodecOperation.has_value() && video_profile_info_.videoCodecOperation.value() != profile_info.video_profile_info_.videoCodecOperation) return false;
            if (video_profile_info_.chromaSubsampling.has_value() && video_profile_info_.chromaSubsampling.value() != profile_info.video_profile_info_.chromaSubsampling) return false;
            if (video_profile_info_.lumaBitDepth.has_value() && video_profile_info_.lumaBitDepth.value() != profile_info.video_profile_info_.lumaBitDepth) return false;
            if (video_profile_info_.chromaBitDepth.has_value() && video_profile_info_.chromaBitDepth.value() != profile_info.video_profile_info_.chromaBitDepth) return false;
        } else {
            if (video_profile_info_defined_) return false;
        }
        if (profile_info.video_decode_av_1_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PROFILE_INFO_KHR) {
            if (video_decode_av_1_profile_info_.stdProfile.has_value() && video_decode_av_1_profile_info_.stdProfile.value() != profile_info.video_decode_av_1_profile_info_.stdProfile) return false;
            if (video_decode_av_1_profile_info_.filmGrainSupport.has_value() && video_decode_av_1_profile_info_.filmGrainSupport.value() != profile_info.video_decode_av_1_profile_info_.filmGrainSupport) return false;
        } else {
            if (video_decode_av_1_profile_info_defined_) return false;
        }
        if (profile_info.video_decode_h_264_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR) {
            if (video_decode_h_264_profile_info_.stdProfileIdc.has_value() && video_decode_h_264_profile_info_.stdProfileIdc.value() != profile_info.video_decode_h_264_profile_info_.stdProfileIdc) return false;
            if (video_decode_h_264_profile_info_.pictureLayout.has_value() && video_decode_h_264_profile_info_.pictureLayout.value() != profile_info.video_decode_h_264_profile_info_.pictureLayout) return false;
        } else {
            if (video_decode_h_264_profile_info_defined_) return false;
        }
        if (profile_info.video_decode_h_265_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR) {
            if (video_decode_h_265_profile_info_.stdProfileIdc.has_value() && video_decode_h_265_profile_info_.stdProfileIdc.value() != profile_info.video_decode_h_265_profile_info_.stdProfileIdc) return false;
        } else {
            if (video_decode_h_265_profile_info_defined_) return false;
        }
        if (profile_info.video_decode_vp_9_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_VP9_PROFILE_INFO_KHR) {
            if (video_decode_vp_9_profile_info_.stdProfile.has_value() && video_decode_vp_9_profile_info_.stdProfile.value() != profile_info.video_decode_vp_9_profile_info_.stdProfile) return false;
        } else {
            if (video_decode_vp_9_profile_info_defined_) return false;
        }
        if (profile_info.video_encode_av_1_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PROFILE_INFO_KHR) {
            if (video_encode_av_1_profile_info_.stdProfile.has_value() && video_encode_av_1_profile_info_.stdProfile.value() != profile_info.video_encode_av_1_profile_info_.stdProfile) return false;
        } else {
            if (video_encode_av_1_profile_info_defined_) return false;
        }
        if (profile_info.video_encode_h_264_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_INFO_KHR) {
            if (video_encode_h_264_profile_info_.stdProfileIdc.has_value() && video_encode_h_264_profile_info_.stdProfileIdc.value() != profile_info.video_encode_h_264_profile_info_.stdProfileIdc) return false;
        } else {
            if (video_encode_h_264_profile_info_defined_) return false;
        }
        if (profile_info.video_encode_h_265_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_INFO_KHR) {
            if (video_encode_h_265_profile_info_.stdProfileIdc.has_value() && video_encode_h_265_profile_info_.stdProfileIdc.value() != profile_info.video_encode_h_265_profile_info_.stdProfileIdc) return false;
        } else {
            if (video_encode_h_265_profile_info_defined_) return false;
        }
        return true;
    }

    bool IsComplete(const VideoProfileInfoChain &profile_info) const {
        if (profile_info.video_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR) {
            if (!video_profile_info_.videoCodecOperation.has_value()) return false;
            if (!video_profile_info_.chromaSubsampling.has_value()) return false;
            if (!video_profile_info_.lumaBitDepth.has_value()) return false;
            if (!video_profile_info_.chromaBitDepth.has_value()) return false;
        }
        if (profile_info.video_decode_av_1_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PROFILE_INFO_KHR) {
            if (!video_decode_av_1_profile_info_.stdProfile.has_value()) return false;
            if (!video_decode_av_1_profile_info_.filmGrainSupport.has_value()) return false;
        }
        if (profile_info.video_decode_h_264_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR) {
            if (!video_decode_h_264_profile_info_.stdProfileIdc.has_value()) return false;
            if (!video_decode_h_264_profile_info_.pictureLayout.has_value()) return false;
        }
        if (profile_info.video_decode_h_265_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR) {
            if (!video_decode_h_265_profile_info_.stdProfileIdc.has_value()) return false;
        }
        if (profile_info.video_decode_vp_9_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_VP9_PROFILE_INFO_KHR) {
            if (!video_decode_vp_9_profile_info_.stdProfile.has_value()) return false;
        }
        if (profile_info.video_encode_av_1_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PROFILE_INFO_KHR) {
            if (!video_encode_av_1_profile_info_.stdProfile.has_value()) return false;
        }
        if (profile_info.video_encode_h_264_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_INFO_KHR) {
            if (!video_encode_h_264_profile_info_.stdProfileIdc.has_value()) return false;
        }
        if (profile_info.video_encode_h_265_profile_info_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_INFO_KHR) {
            if (!video_encode_h_265_profile_info_.stdProfileIdc.has_value()) return false;
        }
        return true;
    }
};


struct VideoCapabilitiesChain {
    bool valid{false};
    VkVideoCapabilitiesKHR video_capabilities_{};
    VkVideoDecodeAV1CapabilitiesKHR video_decode_av_1_capabilities_{};
    VkVideoDecodeCapabilitiesKHR video_decode_capabilities_{};
    VkVideoDecodeH264CapabilitiesKHR video_decode_h_264_capabilities_{};
    VkVideoDecodeH265CapabilitiesKHR video_decode_h_265_capabilities_{};
    VkVideoDecodeVP9CapabilitiesKHR video_decode_vp_9_capabilities_{};
    VkVideoEncodeAV1CapabilitiesKHR video_encode_av_1_capabilities_{};
    VkVideoEncodeCapabilitiesKHR video_encode_capabilities_{};
    VkVideoEncodeFeedback2CapabilitiesKHR video_encode_feedback_2_capabilities_{};
    VkVideoEncodeH264CapabilitiesKHR video_encode_h_264_capabilities_{};
    VkVideoEncodeH264QuantizationMapCapabilitiesKHR video_encode_h_264_quantization_map_capabilities_{};
    VkVideoEncodeH265CapabilitiesKHR video_encode_h_265_capabilities_{};
    VkVideoEncodeH265QuantizationMapCapabilitiesKHR video_encode_h_265_quantization_map_capabilities_{};
    VkVideoEncodeIntraRefreshCapabilitiesKHR video_encode_intra_refresh_capabilities_{};
    VkVideoEncodeQuantizationMapCapabilitiesKHR video_encode_quantization_map_capabilities_{};
    VkVideoEncodeRgbConversionCapabilitiesVALVE video_encode_rgb_conversion_capabilities_{};

    VideoCapabilitiesChain() {}
    VideoCapabilitiesChain(const VideoCapabilitiesChain& caps) {
        InitFrom(&caps.video_capabilities_);
    }

    VideoCapabilitiesChain& operator=(const VideoCapabilitiesChain& rhs) {
        InitFrom(&rhs.video_capabilities_);
        return *this;
    }

    void InitFrom(const VkVideoCapabilitiesKHR *caps) {
        auto p = reinterpret_cast<const VkBaseInStructure*>(caps);
        valid = true;
        void** ppnext = nullptr;
        while (p != nullptr) {
            switch (p->sType) {
                case VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR:
                    if (ppnext != nullptr) *ppnext = &video_capabilities_;
                    video_capabilities_ = *reinterpret_cast<const VkVideoCapabilitiesKHR*>(p);
                    video_capabilities_.pNext = nullptr;
                    ppnext = &video_capabilities_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_CAPABILITIES_KHR:
                    if (ppnext != nullptr) *ppnext = &video_decode_av_1_capabilities_;
                    video_decode_av_1_capabilities_ = *reinterpret_cast<const VkVideoDecodeAV1CapabilitiesKHR*>(p);
                    video_decode_av_1_capabilities_.pNext = nullptr;
                    ppnext = &video_decode_av_1_capabilities_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR:
                    if (ppnext != nullptr) *ppnext = &video_decode_capabilities_;
                    video_decode_capabilities_ = *reinterpret_cast<const VkVideoDecodeCapabilitiesKHR*>(p);
                    video_decode_capabilities_.pNext = nullptr;
                    ppnext = &video_decode_capabilities_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR:
                    if (ppnext != nullptr) *ppnext = &video_decode_h_264_capabilities_;
                    video_decode_h_264_capabilities_ = *reinterpret_cast<const VkVideoDecodeH264CapabilitiesKHR*>(p);
                    video_decode_h_264_capabilities_.pNext = nullptr;
                    ppnext = &video_decode_h_264_capabilities_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR:
                    if (ppnext != nullptr) *ppnext = &video_decode_h_265_capabilities_;
                    video_decode_h_265_capabilities_ = *reinterpret_cast<const VkVideoDecodeH265CapabilitiesKHR*>(p);
                    video_decode_h_265_capabilities_.pNext = nullptr;
                    ppnext = &video_decode_h_265_capabilities_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_DECODE_VP9_CAPABILITIES_KHR:
                    if (ppnext != nullptr) *ppnext = &video_decode_vp_9_capabilities_;
                    video_decode_vp_9_capabilities_ = *reinterpret_cast<const VkVideoDecodeVP9CapabilitiesKHR*>(p);
                    video_decode_vp_9_capabilities_.pNext = nullptr;
                    ppnext = &video_decode_vp_9_capabilities_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_CAPABILITIES_KHR:
                    if (ppnext != nullptr) *ppnext = &video_encode_av_1_capabilities_;
                    video_encode_av_1_capabilities_ = *reinterpret_cast<const VkVideoEncodeAV1CapabilitiesKHR*>(p);
                    video_encode_av_1_capabilities_.pNext = nullptr;
                    ppnext = &video_encode_av_1_capabilities_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR:
                    if (ppnext != nullptr) *ppnext = &video_encode_capabilities_;
                    video_encode_capabilities_ = *reinterpret_cast<const VkVideoEncodeCapabilitiesKHR*>(p);
                    video_encode_capabilities_.pNext = nullptr;
                    ppnext = &video_encode_capabilities_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_FEEDBACK_2_CAPABILITIES_KHR:
                    if (ppnext != nullptr) *ppnext = &video_encode_feedback_2_capabilities_;
                    video_encode_feedback_2_capabilities_ = *reinterpret_cast<const VkVideoEncodeFeedback2CapabilitiesKHR*>(p);
                    video_encode_feedback_2_capabilities_.pNext = nullptr;
                    ppnext = &video_encode_feedback_2_capabilities_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_KHR:
                    if (ppnext != nullptr) *ppnext = &video_encode_h_264_capabilities_;
                    video_encode_h_264_capabilities_ = *reinterpret_cast<const VkVideoEncodeH264CapabilitiesKHR*>(p);
                    video_encode_h_264_capabilities_.pNext = nullptr;
                    ppnext = &video_encode_h_264_capabilities_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_QUANTIZATION_MAP_CAPABILITIES_KHR:
                    if (ppnext != nullptr) *ppnext = &video_encode_h_264_quantization_map_capabilities_;
                    video_encode_h_264_quantization_map_capabilities_ = *reinterpret_cast<const VkVideoEncodeH264QuantizationMapCapabilitiesKHR*>(p);
                    video_encode_h_264_quantization_map_capabilities_.pNext = nullptr;
                    ppnext = &video_encode_h_264_quantization_map_capabilities_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_KHR:
                    if (ppnext != nullptr) *ppnext = &video_encode_h_265_capabilities_;
                    video_encode_h_265_capabilities_ = *reinterpret_cast<const VkVideoEncodeH265CapabilitiesKHR*>(p);
                    video_encode_h_265_capabilities_.pNext = nullptr;
                    ppnext = &video_encode_h_265_capabilities_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_QUANTIZATION_MAP_CAPABILITIES_KHR:
                    if (ppnext != nullptr) *ppnext = &video_encode_h_265_quantization_map_capabilities_;
                    video_encode_h_265_quantization_map_capabilities_ = *reinterpret_cast<const VkVideoEncodeH265QuantizationMapCapabilitiesKHR*>(p);
                    video_encode_h_265_quantization_map_capabilities_.pNext = nullptr;
                    ppnext = &video_encode_h_265_quantization_map_capabilities_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_INTRA_REFRESH_CAPABILITIES_KHR:
                    if (ppnext != nullptr) *ppnext = &video_encode_intra_refresh_capabilities_;
                    video_encode_intra_refresh_capabilities_ = *reinterpret_cast<const VkVideoEncodeIntraRefreshCapabilitiesKHR*>(p);
                    video_encode_intra_refresh_capabilities_.pNext = nullptr;
                    ppnext = &video_encode_intra_refresh_capabilities_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUANTIZATION_MAP_CAPABILITIES_KHR:
                    if (ppnext != nullptr) *ppnext = &video_encode_quantization_map_capabilities_;
                    video_encode_quantization_map_capabilities_ = *reinterpret_cast<const VkVideoEncodeQuantizationMapCapabilitiesKHR*>(p);
                    video_encode_quantization_map_capabilities_.pNext = nullptr;
                    ppnext = &video_encode_quantization_map_capabilities_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RGB_CONVERSION_CAPABILITIES_VALVE:
                    if (ppnext != nullptr) *ppnext = &video_encode_rgb_conversion_capabilities_;
                    video_encode_rgb_conversion_capabilities_ = *reinterpret_cast<const VkVideoEncodeRgbConversionCapabilitiesVALVE*>(p);
                    video_encode_rgb_conversion_capabilities_.pNext = nullptr;
                    ppnext = &video_encode_rgb_conversion_capabilities_.pNext;
                    break;
                default:
                    valid = false;
                    return;
            }
            p = p->pNext;
        }
    }

    VideoCapabilitiesChain(VkVideoCodecOperationFlagBitsKHR op,
                     std::function<bool(uint32_t)> check_api_version,
                     std::function<bool(const char*)> check_extension) {
        (void)check_api_version;
        (void)check_extension;
        valid = true;
        video_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR, nullptr};
        switch (op) {
            case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR:
                if (check_extension("VK_KHR_video_decode_queue")) {
                    video_decode_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_decode_capabilities_;
                }
                if (check_extension("VK_KHR_video_decode_h264")) {
                    video_decode_h_264_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_decode_h_264_capabilities_;
                }
                break;
            case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR:
                if (check_extension("VK_KHR_video_decode_queue")) {
                    video_decode_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_decode_capabilities_;
                }
                if (check_extension("VK_KHR_video_decode_h265")) {
                    video_decode_h_265_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_decode_h_265_capabilities_;
                }
                break;
            case VK_VIDEO_CODEC_OPERATION_DECODE_VP9_BIT_KHR:
                if (check_extension("VK_KHR_video_decode_queue")) {
                    video_decode_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_decode_capabilities_;
                }
                if (check_extension("VK_KHR_video_decode_vp9")) {
                    video_decode_vp_9_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_DECODE_VP9_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_decode_vp_9_capabilities_;
                }
                break;
            case VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR:
                if (check_extension("VK_KHR_video_decode_queue")) {
                    video_decode_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_decode_capabilities_;
                }
                if (check_extension("VK_KHR_video_decode_av1")) {
                    video_decode_av_1_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_decode_av_1_capabilities_;
                }
                break;
            case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR:
                if (check_extension("VK_KHR_video_encode_queue")) {
                    video_encode_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_encode_capabilities_;
                }
                if (check_extension("VK_KHR_video_encode_quantization_map")) {
                    video_encode_quantization_map_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUANTIZATION_MAP_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_encode_quantization_map_capabilities_;
                }
                if (check_extension("VK_KHR_video_encode_intra_refresh")) {
                    video_encode_intra_refresh_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_INTRA_REFRESH_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_encode_intra_refresh_capabilities_;
                }
                if (check_extension("VK_KHR_video_encode_feedback2")) {
                    video_encode_feedback_2_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_FEEDBACK_2_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_encode_feedback_2_capabilities_;
                }
                if (check_extension("VK_VALVE_video_encode_rgb_conversion")) {
                    video_encode_rgb_conversion_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_RGB_CONVERSION_CAPABILITIES_VALVE, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_encode_rgb_conversion_capabilities_;
                }
                if (check_extension("VK_KHR_video_encode_h264")) {
                    video_encode_h_264_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_encode_h_264_capabilities_;
                }
                if (check_extension("VK_KHR_video_encode_quantization_map")) {
                    video_encode_h_264_quantization_map_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_QUANTIZATION_MAP_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_encode_h_264_quantization_map_capabilities_;
                }
                break;
            case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR:
                if (check_extension("VK_KHR_video_encode_queue")) {
                    video_encode_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_encode_capabilities_;
                }
                if (check_extension("VK_KHR_video_encode_quantization_map")) {
                    video_encode_quantization_map_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUANTIZATION_MAP_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_encode_quantization_map_capabilities_;
                }
                if (check_extension("VK_KHR_video_encode_intra_refresh")) {
                    video_encode_intra_refresh_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_INTRA_REFRESH_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_encode_intra_refresh_capabilities_;
                }
                if (check_extension("VK_KHR_video_encode_feedback2")) {
                    video_encode_feedback_2_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_FEEDBACK_2_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_encode_feedback_2_capabilities_;
                }
                if (check_extension("VK_VALVE_video_encode_rgb_conversion")) {
                    video_encode_rgb_conversion_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_RGB_CONVERSION_CAPABILITIES_VALVE, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_encode_rgb_conversion_capabilities_;
                }
                if (check_extension("VK_KHR_video_encode_h265")) {
                    video_encode_h_265_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_encode_h_265_capabilities_;
                }
                if (check_extension("VK_KHR_video_encode_quantization_map")) {
                    video_encode_h_265_quantization_map_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_QUANTIZATION_MAP_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_encode_h_265_quantization_map_capabilities_;
                }
                break;
            case VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR:
                if (check_extension("VK_KHR_video_encode_queue")) {
                    video_encode_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_encode_capabilities_;
                }
                if (check_extension("VK_KHR_video_encode_quantization_map")) {
                    video_encode_quantization_map_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUANTIZATION_MAP_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_encode_quantization_map_capabilities_;
                }
                if (check_extension("VK_KHR_video_encode_intra_refresh")) {
                    video_encode_intra_refresh_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_INTRA_REFRESH_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_encode_intra_refresh_capabilities_;
                }
                if (check_extension("VK_KHR_video_encode_feedback2")) {
                    video_encode_feedback_2_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_FEEDBACK_2_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_encode_feedback_2_capabilities_;
                }
                if (check_extension("VK_VALVE_video_encode_rgb_conversion")) {
                    video_encode_rgb_conversion_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_RGB_CONVERSION_CAPABILITIES_VALVE, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_encode_rgb_conversion_capabilities_;
                }
                if (check_extension("VK_KHR_video_encode_av1")) {
                    video_encode_av_1_capabilities_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_CAPABILITIES_KHR, video_capabilities_.pNext};
                    video_capabilities_.pNext = &video_encode_av_1_capabilities_;
                }
                break;
            default:
                valid = false;
                return;
        }
    }

    void UpdateFrom(const VideoCapabilitiesChain &source) {
        auto p = reinterpret_cast<const VkBaseInStructure*>(&source.video_capabilities_);
        void* orig_pnext = nullptr;
        while (p != nullptr) {
            switch (p->sType) {
                case VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR:
                    orig_pnext = video_capabilities_.pNext;
                    video_capabilities_ = *reinterpret_cast<const VkVideoCapabilitiesKHR*>(p);
                    video_capabilities_.pNext = orig_pnext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_CAPABILITIES_KHR:
                    orig_pnext = video_decode_av_1_capabilities_.pNext;
                    video_decode_av_1_capabilities_ = *reinterpret_cast<const VkVideoDecodeAV1CapabilitiesKHR*>(p);
                    video_decode_av_1_capabilities_.pNext = orig_pnext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR:
                    orig_pnext = video_decode_capabilities_.pNext;
                    video_decode_capabilities_ = *reinterpret_cast<const VkVideoDecodeCapabilitiesKHR*>(p);
                    video_decode_capabilities_.pNext = orig_pnext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR:
                    orig_pnext = video_decode_h_264_capabilities_.pNext;
                    video_decode_h_264_capabilities_ = *reinterpret_cast<const VkVideoDecodeH264CapabilitiesKHR*>(p);
                    video_decode_h_264_capabilities_.pNext = orig_pnext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR:
                    orig_pnext = video_decode_h_265_capabilities_.pNext;
                    video_decode_h_265_capabilities_ = *reinterpret_cast<const VkVideoDecodeH265CapabilitiesKHR*>(p);
                    video_decode_h_265_capabilities_.pNext = orig_pnext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_DECODE_VP9_CAPABILITIES_KHR:
                    orig_pnext = video_decode_vp_9_capabilities_.pNext;
                    video_decode_vp_9_capabilities_ = *reinterpret_cast<const VkVideoDecodeVP9CapabilitiesKHR*>(p);
                    video_decode_vp_9_capabilities_.pNext = orig_pnext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_CAPABILITIES_KHR:
                    orig_pnext = video_encode_av_1_capabilities_.pNext;
                    video_encode_av_1_capabilities_ = *reinterpret_cast<const VkVideoEncodeAV1CapabilitiesKHR*>(p);
                    video_encode_av_1_capabilities_.pNext = orig_pnext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR:
                    orig_pnext = video_encode_capabilities_.pNext;
                    video_encode_capabilities_ = *reinterpret_cast<const VkVideoEncodeCapabilitiesKHR*>(p);
                    video_encode_capabilities_.pNext = orig_pnext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_FEEDBACK_2_CAPABILITIES_KHR:
                    orig_pnext = video_encode_feedback_2_capabilities_.pNext;
                    video_encode_feedback_2_capabilities_ = *reinterpret_cast<const VkVideoEncodeFeedback2CapabilitiesKHR*>(p);
                    video_encode_feedback_2_capabilities_.pNext = orig_pnext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_KHR:
                    orig_pnext = video_encode_h_264_capabilities_.pNext;
                    video_encode_h_264_capabilities_ = *reinterpret_cast<const VkVideoEncodeH264CapabilitiesKHR*>(p);
                    video_encode_h_264_capabilities_.pNext = orig_pnext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_QUANTIZATION_MAP_CAPABILITIES_KHR:
                    orig_pnext = video_encode_h_264_quantization_map_capabilities_.pNext;
                    video_encode_h_264_quantization_map_capabilities_ = *reinterpret_cast<const VkVideoEncodeH264QuantizationMapCapabilitiesKHR*>(p);
                    video_encode_h_264_quantization_map_capabilities_.pNext = orig_pnext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_KHR:
                    orig_pnext = video_encode_h_265_capabilities_.pNext;
                    video_encode_h_265_capabilities_ = *reinterpret_cast<const VkVideoEncodeH265CapabilitiesKHR*>(p);
                    video_encode_h_265_capabilities_.pNext = orig_pnext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_QUANTIZATION_MAP_CAPABILITIES_KHR:
                    orig_pnext = video_encode_h_265_quantization_map_capabilities_.pNext;
                    video_encode_h_265_quantization_map_capabilities_ = *reinterpret_cast<const VkVideoEncodeH265QuantizationMapCapabilitiesKHR*>(p);
                    video_encode_h_265_quantization_map_capabilities_.pNext = orig_pnext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_INTRA_REFRESH_CAPABILITIES_KHR:
                    orig_pnext = video_encode_intra_refresh_capabilities_.pNext;
                    video_encode_intra_refresh_capabilities_ = *reinterpret_cast<const VkVideoEncodeIntraRefreshCapabilitiesKHR*>(p);
                    video_encode_intra_refresh_capabilities_.pNext = orig_pnext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUANTIZATION_MAP_CAPABILITIES_KHR:
                    orig_pnext = video_encode_quantization_map_capabilities_.pNext;
                    video_encode_quantization_map_capabilities_ = *reinterpret_cast<const VkVideoEncodeQuantizationMapCapabilitiesKHR*>(p);
                    video_encode_quantization_map_capabilities_.pNext = orig_pnext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RGB_CONVERSION_CAPABILITIES_VALVE:
                    orig_pnext = video_encode_rgb_conversion_capabilities_.pNext;
                    video_encode_rgb_conversion_capabilities_ = *reinterpret_cast<const VkVideoEncodeRgbConversionCapabilitiesVALVE*>(p);
                    video_encode_rgb_conversion_capabilities_.pNext = orig_pnext;
                    break;
                default:
                    break;
            }
            p = p->pNext;
        }
    }

    void CopyTo(VkVideoCapabilitiesKHR *caps) const {
        auto p = reinterpret_cast<const VkBaseInStructure*>(&video_capabilities_);
        void* orig_pnext = nullptr;
        while (p != nullptr) {
            auto dst = reinterpret_cast<VkBaseOutStructure*>(caps);
            while (dst != nullptr && dst->sType != p->sType) {
                dst = dst->pNext;
            }
            if (dst != nullptr) {
                switch (p->sType) {
                    case VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR: {
                        auto s = reinterpret_cast<VkVideoCapabilitiesKHR*>(dst);
                        orig_pnext = s->pNext;
                        *s = *reinterpret_cast<const VkVideoCapabilitiesKHR*>(p);
                        s->pNext = orig_pnext;
                        break;
                    }
                    case VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_CAPABILITIES_KHR: {
                        auto s = reinterpret_cast<VkVideoDecodeAV1CapabilitiesKHR*>(dst);
                        orig_pnext = s->pNext;
                        *s = *reinterpret_cast<const VkVideoDecodeAV1CapabilitiesKHR*>(p);
                        s->pNext = orig_pnext;
                        break;
                    }
                    case VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR: {
                        auto s = reinterpret_cast<VkVideoDecodeCapabilitiesKHR*>(dst);
                        orig_pnext = s->pNext;
                        *s = *reinterpret_cast<const VkVideoDecodeCapabilitiesKHR*>(p);
                        s->pNext = orig_pnext;
                        break;
                    }
                    case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR: {
                        auto s = reinterpret_cast<VkVideoDecodeH264CapabilitiesKHR*>(dst);
                        orig_pnext = s->pNext;
                        *s = *reinterpret_cast<const VkVideoDecodeH264CapabilitiesKHR*>(p);
                        s->pNext = orig_pnext;
                        break;
                    }
                    case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR: {
                        auto s = reinterpret_cast<VkVideoDecodeH265CapabilitiesKHR*>(dst);
                        orig_pnext = s->pNext;
                        *s = *reinterpret_cast<const VkVideoDecodeH265CapabilitiesKHR*>(p);
                        s->pNext = orig_pnext;
                        break;
                    }
                    case VK_STRUCTURE_TYPE_VIDEO_DECODE_VP9_CAPABILITIES_KHR: {
                        auto s = reinterpret_cast<VkVideoDecodeVP9CapabilitiesKHR*>(dst);
                        orig_pnext = s->pNext;
                        *s = *reinterpret_cast<const VkVideoDecodeVP9CapabilitiesKHR*>(p);
                        s->pNext = orig_pnext;
                        break;
                    }
                    case VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_CAPABILITIES_KHR: {
                        auto s = reinterpret_cast<VkVideoEncodeAV1CapabilitiesKHR*>(dst);
                        orig_pnext = s->pNext;
                        *s = *reinterpret_cast<const VkVideoEncodeAV1CapabilitiesKHR*>(p);
                        s->pNext = orig_pnext;
                        break;
                    }
                    case VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR: {
                        auto s = reinterpret_cast<VkVideoEncodeCapabilitiesKHR*>(dst);
                        orig_pnext = s->pNext;
                        *s = *reinterpret_cast<const VkVideoEncodeCapabilitiesKHR*>(p);
                        s->pNext = orig_pnext;
                        break;
                    }
                    case VK_STRUCTURE_TYPE_VIDEO_ENCODE_FEEDBACK_2_CAPABILITIES_KHR: {
                        auto s = reinterpret_cast<VkVideoEncodeFeedback2CapabilitiesKHR*>(dst);
                        orig_pnext = s->pNext;
                        *s = *reinterpret_cast<const VkVideoEncodeFeedback2CapabilitiesKHR*>(p);
                        s->pNext = orig_pnext;
                        break;
                    }
                    case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_KHR: {
                        auto s = reinterpret_cast<VkVideoEncodeH264CapabilitiesKHR*>(dst);
                        orig_pnext = s->pNext;
                        *s = *reinterpret_cast<const VkVideoEncodeH264CapabilitiesKHR*>(p);
                        s->pNext = orig_pnext;
                        break;
                    }
                    case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_QUANTIZATION_MAP_CAPABILITIES_KHR: {
                        auto s = reinterpret_cast<VkVideoEncodeH264QuantizationMapCapabilitiesKHR*>(dst);
                        orig_pnext = s->pNext;
                        *s = *reinterpret_cast<const VkVideoEncodeH264QuantizationMapCapabilitiesKHR*>(p);
                        s->pNext = orig_pnext;
                        break;
                    }
                    case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_KHR: {
                        auto s = reinterpret_cast<VkVideoEncodeH265CapabilitiesKHR*>(dst);
                        orig_pnext = s->pNext;
                        *s = *reinterpret_cast<const VkVideoEncodeH265CapabilitiesKHR*>(p);
                        s->pNext = orig_pnext;
                        break;
                    }
                    case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_QUANTIZATION_MAP_CAPABILITIES_KHR: {
                        auto s = reinterpret_cast<VkVideoEncodeH265QuantizationMapCapabilitiesKHR*>(dst);
                        orig_pnext = s->pNext;
                        *s = *reinterpret_cast<const VkVideoEncodeH265QuantizationMapCapabilitiesKHR*>(p);
                        s->pNext = orig_pnext;
                        break;
                    }
                    case VK_STRUCTURE_TYPE_VIDEO_ENCODE_INTRA_REFRESH_CAPABILITIES_KHR: {
                        auto s = reinterpret_cast<VkVideoEncodeIntraRefreshCapabilitiesKHR*>(dst);
                        orig_pnext = s->pNext;
                        *s = *reinterpret_cast<const VkVideoEncodeIntraRefreshCapabilitiesKHR*>(p);
                        s->pNext = orig_pnext;
                        break;
                    }
                    case VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUANTIZATION_MAP_CAPABILITIES_KHR: {
                        auto s = reinterpret_cast<VkVideoEncodeQuantizationMapCapabilitiesKHR*>(dst);
                        orig_pnext = s->pNext;
                        *s = *reinterpret_cast<const VkVideoEncodeQuantizationMapCapabilitiesKHR*>(p);
                        s->pNext = orig_pnext;
                        break;
                    }
                    case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RGB_CONVERSION_CAPABILITIES_VALVE: {
                        auto s = reinterpret_cast<VkVideoEncodeRgbConversionCapabilitiesVALVE*>(dst);
                        orig_pnext = s->pNext;
                        *s = *reinterpret_cast<const VkVideoEncodeRgbConversionCapabilitiesVALVE*>(p);
                        s->pNext = orig_pnext;
                        break;
                    }
                    default:
                        break;
                }
            }
            p = p->pNext;
        }
    }
};

class JsonVideoProfileCaps {
    bool is_valid_{false};
    struct {
        LimitFlags<VkVideoCapabilityFlagsKHR> flags{};
        LimitMin<VkDeviceSize> minBitstreamBufferOffsetAlignment{};
        LimitMin<VkDeviceSize> minBitstreamBufferSizeAlignment{};
        struct {
            LimitMin<uint32_t> width{};
            LimitMin<uint32_t> height{};
        } pictureAccessGranularity{};
        struct {
            LimitMin<uint32_t> width{};
            LimitMin<uint32_t> height{};
        } minCodedExtent{};
        struct {
            LimitMax<uint32_t> width{};
            LimitMax<uint32_t> height{};
        } maxCodedExtent{};
        LimitMax<uint32_t> maxDpbSlots{};
        LimitMax<uint32_t> maxActiveReferencePictures{};
        struct {
            LimitExact<std::string> extensionName{};
            LimitExact<uint32_t> specVersion{};
        } stdHeaderVersion{};
    } video_capabilities_{};
    struct {
        LimitMax<StdVideoAV1Level> maxLevel{};
    } video_decode_av_1_capabilities_{};
    struct {
        LimitFlags<VkVideoDecodeCapabilityFlagsKHR> flags{};
    } video_decode_capabilities_{};
    struct {
        LimitMax<StdVideoH264LevelIdc> maxLevelIdc{};
        struct {
            LimitExact<int32_t> x{};
            LimitExact<int32_t> y{};
        } fieldOffsetGranularity{};
    } video_decode_h_264_capabilities_{};
    struct {
        LimitMax<StdVideoH265LevelIdc> maxLevelIdc{};
    } video_decode_h_265_capabilities_{};
    struct {
        LimitMax<StdVideoVP9Level> maxLevel{};
    } video_decode_vp_9_capabilities_{};
    struct {
        LimitFlags<VkVideoEncodeAV1CapabilityFlagsKHR> flags{};
        LimitMax<StdVideoAV1Level> maxLevel{};
        struct {
            LimitMin<uint32_t> width{};
            LimitMin<uint32_t> height{};
        } codedPictureAlignment{};
        struct {
            LimitMax<uint32_t> width{};
            LimitMax<uint32_t> height{};
        } maxTiles{};
        struct {
            LimitMin<uint32_t> width{};
            LimitMin<uint32_t> height{};
        } minTileSize{};
        struct {
            LimitMax<uint32_t> width{};
            LimitMax<uint32_t> height{};
        } maxTileSize{};
        LimitFlags<VkVideoEncodeAV1SuperblockSizeFlagsKHR> superblockSizes{};
        LimitMax<uint32_t> maxSingleReferenceCount{};
        LimitFlags<uint32_t> singleReferenceNameMask{};
        LimitMax<uint32_t> maxUnidirectionalCompoundReferenceCount{};
        LimitMax<uint32_t> maxUnidirectionalCompoundGroup1ReferenceCount{};
        LimitFlags<uint32_t> unidirectionalCompoundReferenceNameMask{};
        LimitMax<uint32_t> maxBidirectionalCompoundReferenceCount{};
        LimitMax<uint32_t> maxBidirectionalCompoundGroup1ReferenceCount{};
        LimitMax<uint32_t> maxBidirectionalCompoundGroup2ReferenceCount{};
        LimitFlags<uint32_t> bidirectionalCompoundReferenceNameMask{};
        LimitMax<uint32_t> maxTemporalLayerCount{};
        LimitMax<uint32_t> maxSpatialLayerCount{};
        LimitMax<uint32_t> maxOperatingPoints{};
        LimitMin<uint32_t> minQIndex{};
        LimitMax<uint32_t> maxQIndex{};
        LimitMin<VkBool32> prefersGopRemainingFrames{};
        LimitMin<VkBool32> requiresGopRemainingFrames{};
        LimitFlags<VkVideoEncodeAV1StdFlagsKHR> stdSyntaxFlags{};
    } video_encode_av_1_capabilities_{};
    struct {
        LimitFlags<VkVideoEncodeCapabilityFlagsKHR> flags{};
        LimitFlags<VkVideoEncodeRateControlModeFlagsKHR> rateControlModes{};
        LimitMax<uint32_t> maxRateControlLayers{};
        LimitMax<uint64_t> maxBitrate{};
        LimitMax<uint32_t> maxQualityLevels{};
        struct {
            LimitMin<uint32_t> width{};
            LimitMin<uint32_t> height{};
        } encodeInputPictureGranularity{};
        LimitFlags<VkVideoEncodeFeedbackFlagsKHR> supportedEncodeFeedbackFlags{};
    } video_encode_capabilities_{};
    struct {
        LimitMax<uint32_t> maxPerPartitionFeedbackEntries{};
        LimitFlags<VkVideoEncodePerPartitionFeedbackFlagsKHR> supportedPerPartitionEncodeFeedbackFlags{};
    } video_encode_feedback_2_capabilities_{};
    struct {
        LimitFlags<VkVideoEncodeH264CapabilityFlagsKHR> flags{};
        LimitMax<StdVideoH264LevelIdc> maxLevelIdc{};
        LimitMax<uint32_t> maxSliceCount{};
        LimitMax<uint32_t> maxPPictureL0ReferenceCount{};
        LimitMax<uint32_t> maxBPictureL0ReferenceCount{};
        LimitMax<uint32_t> maxL1ReferenceCount{};
        LimitMax<uint32_t> maxTemporalLayerCount{};
        LimitMin<VkBool32> expectDyadicTemporalLayerPattern{};
        LimitMin<int32_t> minQp{};
        LimitMax<int32_t> maxQp{};
        LimitMin<VkBool32> prefersGopRemainingFrames{};
        LimitMin<VkBool32> requiresGopRemainingFrames{};
        LimitFlags<VkVideoEncodeH264StdFlagsKHR> stdSyntaxFlags{};
    } video_encode_h_264_capabilities_{};
    struct {
        LimitMin<int32_t> minQpDelta{};
        LimitMax<int32_t> maxQpDelta{};
    } video_encode_h_264_quantization_map_capabilities_{};
    struct {
        LimitFlags<VkVideoEncodeH265CapabilityFlagsKHR> flags{};
        LimitMax<StdVideoH265LevelIdc> maxLevelIdc{};
        LimitMax<uint32_t> maxSliceSegmentCount{};
        struct {
            LimitMax<uint32_t> width{};
            LimitMax<uint32_t> height{};
        } maxTiles{};
        LimitFlags<VkVideoEncodeH265CtbSizeFlagsKHR> ctbSizes{};
        LimitFlags<VkVideoEncodeH265TransformBlockSizeFlagsKHR> transformBlockSizes{};
        LimitMax<uint32_t> maxPPictureL0ReferenceCount{};
        LimitMax<uint32_t> maxBPictureL0ReferenceCount{};
        LimitMax<uint32_t> maxL1ReferenceCount{};
        LimitMax<uint32_t> maxSubLayerCount{};
        LimitMin<VkBool32> expectDyadicTemporalSubLayerPattern{};
        LimitMin<int32_t> minQp{};
        LimitMax<int32_t> maxQp{};
        LimitMin<VkBool32> prefersGopRemainingFrames{};
        LimitMin<VkBool32> requiresGopRemainingFrames{};
        LimitFlags<VkVideoEncodeH265StdFlagsKHR> stdSyntaxFlags{};
    } video_encode_h_265_capabilities_{};
    struct {
        LimitMin<int32_t> minQpDelta{};
        LimitMax<int32_t> maxQpDelta{};
    } video_encode_h_265_quantization_map_capabilities_{};
    struct {
        LimitFlags<VkVideoEncodeIntraRefreshModeFlagsKHR> intraRefreshModes{};
        LimitMax<uint32_t> maxIntraRefreshCycleDuration{};
        LimitMax<uint32_t> maxIntraRefreshActiveReferencePictures{};
        LimitMax<VkBool32> partitionIndependentIntraRefreshRegions{};
        LimitMax<VkBool32> nonRectangularIntraRefreshRegions{};
    } video_encode_intra_refresh_capabilities_{};
    struct {
        struct {
            LimitMax<uint32_t> width{};
            LimitMax<uint32_t> height{};
        } maxQuantizationMapExtent{};
    } video_encode_quantization_map_capabilities_{};
    struct {
        LimitFlags<VkVideoEncodeRgbModelConversionFlagsVALVE> rgbModels{};
        LimitFlags<VkVideoEncodeRgbRangeCompressionFlagsVALVE> rgbRanges{};
        LimitFlags<VkVideoEncodeRgbChromaOffsetFlagsVALVE> xChromaOffsets{};
        LimitFlags<VkVideoEncodeRgbChromaOffsetFlagsVALVE> yChromaOffsets{};
    } video_encode_rgb_conversion_capabilities_{};

    bool ParseJson(const Json::Value &profile_json) {
        if (!profile_json.isMember("capabilities")) return true;
        const Json::Value &profile_caps_json = profile_json["capabilities"];
        const Json::Value *video_capabilities_json = nullptr;
        if (profile_caps_json.isMember("VkVideoCapabilitiesKHR")) {
            if (video_capabilities_json != nullptr) return false;
            video_capabilities_json = &profile_caps_json["VkVideoCapabilitiesKHR"];
        }
        if (video_capabilities_json != nullptr) {
            if (video_capabilities_json->isMember("flags")) {
                const Json::Value &value = (*video_capabilities_json)["flags"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_capabilities_.flags.limit = static_cast<VkVideoCapabilityFlagsKHR>(mask);
            }
            if (video_capabilities_json->isMember("minBitstreamBufferOffsetAlignment")) {
                const Json::Value &value = (*video_capabilities_json)["minBitstreamBufferOffsetAlignment"];
                if (!value.isUInt64()) return false;
                video_capabilities_.minBitstreamBufferOffsetAlignment.limit = value.asUInt64();
            }
            if (video_capabilities_json->isMember("minBitstreamBufferSizeAlignment")) {
                const Json::Value &value = (*video_capabilities_json)["minBitstreamBufferSizeAlignment"];
                if (!value.isUInt64()) return false;
                video_capabilities_.minBitstreamBufferSizeAlignment.limit = value.asUInt64();
            }
            if (video_capabilities_json->isMember("pictureAccessGranularity")) {
                const Json::Value &value = (*video_capabilities_json)["pictureAccessGranularity"];
                if (!value.isObject()) return false;
                if (value.isMember("width")) {
                    const Json::Value &value_width = value["width"];
                    if (!value_width.isUInt()) return false;
                    video_capabilities_.pictureAccessGranularity.width.limit = value_width.asUInt();
                }
                if (value.isMember("height")) {
                    const Json::Value &value_height = value["height"];
                    if (!value_height.isUInt()) return false;
                    video_capabilities_.pictureAccessGranularity.height.limit = value_height.asUInt();
                }
            }
            if (video_capabilities_json->isMember("minCodedExtent")) {
                const Json::Value &value = (*video_capabilities_json)["minCodedExtent"];
                if (!value.isObject()) return false;
                if (value.isMember("width")) {
                    const Json::Value &value_width = value["width"];
                    if (!value_width.isUInt()) return false;
                    video_capabilities_.minCodedExtent.width.limit = value_width.asUInt();
                }
                if (value.isMember("height")) {
                    const Json::Value &value_height = value["height"];
                    if (!value_height.isUInt()) return false;
                    video_capabilities_.minCodedExtent.height.limit = value_height.asUInt();
                }
            }
            if (video_capabilities_json->isMember("maxCodedExtent")) {
                const Json::Value &value = (*video_capabilities_json)["maxCodedExtent"];
                if (!value.isObject()) return false;
                if (value.isMember("width")) {
                    const Json::Value &value_width = value["width"];
                    if (!value_width.isUInt()) return false;
                    video_capabilities_.maxCodedExtent.width.limit = value_width.asUInt();
                }
                if (value.isMember("height")) {
                    const Json::Value &value_height = value["height"];
                    if (!value_height.isUInt()) return false;
                    video_capabilities_.maxCodedExtent.height.limit = value_height.asUInt();
                }
            }
            if (video_capabilities_json->isMember("maxDpbSlots")) {
                const Json::Value &value = (*video_capabilities_json)["maxDpbSlots"];
                if (!value.isUInt()) return false;
                video_capabilities_.maxDpbSlots.limit = value.asUInt();
            }
            if (video_capabilities_json->isMember("maxActiveReferencePictures")) {
                const Json::Value &value = (*video_capabilities_json)["maxActiveReferencePictures"];
                if (!value.isUInt()) return false;
                video_capabilities_.maxActiveReferencePictures.limit = value.asUInt();
            }
            if (video_capabilities_json->isMember("stdHeaderVersion")) {
                const Json::Value &value = (*video_capabilities_json)["stdHeaderVersion"];
                if (!value.isObject()) return false;
                if (value.isMember("extensionName")) {
                    const Json::Value &std_header_name = value["extensionName"];
                    if (!std_header_name.isString()) return false;
                    video_capabilities_.stdHeaderVersion.extensionName.limit = std_header_name.asString();
                }
                if (value.isMember("specVersion")) {
                    const Json::Value &std_header_version = value["specVersion"];
                    if (!std_header_version.isUInt()) return false;
                    video_capabilities_.stdHeaderVersion.specVersion.limit = std_header_version.asUInt();
                }
            }
        }
        const Json::Value *video_decode_av_1_capabilities_json = nullptr;
        if (profile_caps_json.isMember("VkVideoDecodeAV1CapabilitiesKHR")) {
            if (video_decode_av_1_capabilities_json != nullptr) return false;
            video_decode_av_1_capabilities_json = &profile_caps_json["VkVideoDecodeAV1CapabilitiesKHR"];
        }
        if (video_decode_av_1_capabilities_json != nullptr) {
            if (video_decode_av_1_capabilities_json->isMember("maxLevel")) {
                const Json::Value &value = (*video_decode_av_1_capabilities_json)["maxLevel"];
                if (!value.isString()) return false;
                video_decode_av_1_capabilities_.maxLevel.limit = static_cast<StdVideoAV1Level>(VkStringToUint64(value.asString()));
            }
        }
        const Json::Value *video_decode_capabilities_json = nullptr;
        if (profile_caps_json.isMember("VkVideoDecodeCapabilitiesKHR")) {
            if (video_decode_capabilities_json != nullptr) return false;
            video_decode_capabilities_json = &profile_caps_json["VkVideoDecodeCapabilitiesKHR"];
        }
        if (video_decode_capabilities_json != nullptr) {
            if (video_decode_capabilities_json->isMember("flags")) {
                const Json::Value &value = (*video_decode_capabilities_json)["flags"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_decode_capabilities_.flags.limit = static_cast<VkVideoDecodeCapabilityFlagsKHR>(mask);
            }
        }
        const Json::Value *video_decode_h_264_capabilities_json = nullptr;
        if (profile_caps_json.isMember("VkVideoDecodeH264CapabilitiesKHR")) {
            if (video_decode_h_264_capabilities_json != nullptr) return false;
            video_decode_h_264_capabilities_json = &profile_caps_json["VkVideoDecodeH264CapabilitiesKHR"];
        }
        if (video_decode_h_264_capabilities_json != nullptr) {
            if (video_decode_h_264_capabilities_json->isMember("maxLevelIdc")) {
                const Json::Value &value = (*video_decode_h_264_capabilities_json)["maxLevelIdc"];
                if (!value.isString()) return false;
                video_decode_h_264_capabilities_.maxLevelIdc.limit = static_cast<StdVideoH264LevelIdc>(VkStringToUint64(value.asString()));
            }
            if (video_decode_h_264_capabilities_json->isMember("fieldOffsetGranularity")) {
                const Json::Value &value = (*video_decode_h_264_capabilities_json)["fieldOffsetGranularity"];
                if (!value.isObject()) return false;
                if (value.isMember("x")) {
                    const Json::Value &value_x = value["x"];
                    if (!value_x.isInt()) return false;
                    video_decode_h_264_capabilities_.fieldOffsetGranularity.x.limit = value_x.asInt();
                }
                if (value.isMember("y")) {
                    const Json::Value &value_y = value["y"];
                    if (!value_y.isInt()) return false;
                    video_decode_h_264_capabilities_.fieldOffsetGranularity.y.limit = value_y.asInt();
                }
            }
        }
        const Json::Value *video_decode_h_265_capabilities_json = nullptr;
        if (profile_caps_json.isMember("VkVideoDecodeH265CapabilitiesKHR")) {
            if (video_decode_h_265_capabilities_json != nullptr) return false;
            video_decode_h_265_capabilities_json = &profile_caps_json["VkVideoDecodeH265CapabilitiesKHR"];
        }
        if (video_decode_h_265_capabilities_json != nullptr) {
            if (video_decode_h_265_capabilities_json->isMember("maxLevelIdc")) {
                const Json::Value &value = (*video_decode_h_265_capabilities_json)["maxLevelIdc"];
                if (!value.isString()) return false;
                video_decode_h_265_capabilities_.maxLevelIdc.limit = static_cast<StdVideoH265LevelIdc>(VkStringToUint64(value.asString()));
            }
        }
        const Json::Value *video_decode_vp_9_capabilities_json = nullptr;
        if (profile_caps_json.isMember("VkVideoDecodeVP9CapabilitiesKHR")) {
            if (video_decode_vp_9_capabilities_json != nullptr) return false;
            video_decode_vp_9_capabilities_json = &profile_caps_json["VkVideoDecodeVP9CapabilitiesKHR"];
        }
        if (video_decode_vp_9_capabilities_json != nullptr) {
            if (video_decode_vp_9_capabilities_json->isMember("maxLevel")) {
                const Json::Value &value = (*video_decode_vp_9_capabilities_json)["maxLevel"];
                if (!value.isString()) return false;
                video_decode_vp_9_capabilities_.maxLevel.limit = static_cast<StdVideoVP9Level>(VkStringToUint64(value.asString()));
            }
        }
        const Json::Value *video_encode_av_1_capabilities_json = nullptr;
        if (profile_caps_json.isMember("VkVideoEncodeAV1CapabilitiesKHR")) {
            if (video_encode_av_1_capabilities_json != nullptr) return false;
            video_encode_av_1_capabilities_json = &profile_caps_json["VkVideoEncodeAV1CapabilitiesKHR"];
        }
        if (video_encode_av_1_capabilities_json != nullptr) {
            if (video_encode_av_1_capabilities_json->isMember("flags")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["flags"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_encode_av_1_capabilities_.flags.limit = static_cast<VkVideoEncodeAV1CapabilityFlagsKHR>(mask);
            }
            if (video_encode_av_1_capabilities_json->isMember("maxLevel")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["maxLevel"];
                if (!value.isString()) return false;
                video_encode_av_1_capabilities_.maxLevel.limit = static_cast<StdVideoAV1Level>(VkStringToUint64(value.asString()));
            }
            if (video_encode_av_1_capabilities_json->isMember("codedPictureAlignment")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["codedPictureAlignment"];
                if (!value.isObject()) return false;
                if (value.isMember("width")) {
                    const Json::Value &value_width = value["width"];
                    if (!value_width.isUInt()) return false;
                    video_encode_av_1_capabilities_.codedPictureAlignment.width.limit = value_width.asUInt();
                }
                if (value.isMember("height")) {
                    const Json::Value &value_height = value["height"];
                    if (!value_height.isUInt()) return false;
                    video_encode_av_1_capabilities_.codedPictureAlignment.height.limit = value_height.asUInt();
                }
            }
            if (video_encode_av_1_capabilities_json->isMember("maxTiles")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["maxTiles"];
                if (!value.isObject()) return false;
                if (value.isMember("width")) {
                    const Json::Value &value_width = value["width"];
                    if (!value_width.isUInt()) return false;
                    video_encode_av_1_capabilities_.maxTiles.width.limit = value_width.asUInt();
                }
                if (value.isMember("height")) {
                    const Json::Value &value_height = value["height"];
                    if (!value_height.isUInt()) return false;
                    video_encode_av_1_capabilities_.maxTiles.height.limit = value_height.asUInt();
                }
            }
            if (video_encode_av_1_capabilities_json->isMember("minTileSize")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["minTileSize"];
                if (!value.isObject()) return false;
                if (value.isMember("width")) {
                    const Json::Value &value_width = value["width"];
                    if (!value_width.isUInt()) return false;
                    video_encode_av_1_capabilities_.minTileSize.width.limit = value_width.asUInt();
                }
                if (value.isMember("height")) {
                    const Json::Value &value_height = value["height"];
                    if (!value_height.isUInt()) return false;
                    video_encode_av_1_capabilities_.minTileSize.height.limit = value_height.asUInt();
                }
            }
            if (video_encode_av_1_capabilities_json->isMember("maxTileSize")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["maxTileSize"];
                if (!value.isObject()) return false;
                if (value.isMember("width")) {
                    const Json::Value &value_width = value["width"];
                    if (!value_width.isUInt()) return false;
                    video_encode_av_1_capabilities_.maxTileSize.width.limit = value_width.asUInt();
                }
                if (value.isMember("height")) {
                    const Json::Value &value_height = value["height"];
                    if (!value_height.isUInt()) return false;
                    video_encode_av_1_capabilities_.maxTileSize.height.limit = value_height.asUInt();
                }
            }
            if (video_encode_av_1_capabilities_json->isMember("superblockSizes")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["superblockSizes"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_encode_av_1_capabilities_.superblockSizes.limit = static_cast<VkVideoEncodeAV1SuperblockSizeFlagsKHR>(mask);
            }
            if (video_encode_av_1_capabilities_json->isMember("maxSingleReferenceCount")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["maxSingleReferenceCount"];
                if (!value.isUInt()) return false;
                video_encode_av_1_capabilities_.maxSingleReferenceCount.limit = value.asUInt();
            }
            if (video_encode_av_1_capabilities_json->isMember("singleReferenceNameMask")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["singleReferenceNameMask"];
                if (!value.isUInt()) return false;
                video_encode_av_1_capabilities_.singleReferenceNameMask.limit = value.asUInt();
            }
            if (video_encode_av_1_capabilities_json->isMember("maxUnidirectionalCompoundReferenceCount")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["maxUnidirectionalCompoundReferenceCount"];
                if (!value.isUInt()) return false;
                video_encode_av_1_capabilities_.maxUnidirectionalCompoundReferenceCount.limit = value.asUInt();
            }
            if (video_encode_av_1_capabilities_json->isMember("maxUnidirectionalCompoundGroup1ReferenceCount")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["maxUnidirectionalCompoundGroup1ReferenceCount"];
                if (!value.isUInt()) return false;
                video_encode_av_1_capabilities_.maxUnidirectionalCompoundGroup1ReferenceCount.limit = value.asUInt();
            }
            if (video_encode_av_1_capabilities_json->isMember("unidirectionalCompoundReferenceNameMask")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["unidirectionalCompoundReferenceNameMask"];
                if (!value.isUInt()) return false;
                video_encode_av_1_capabilities_.unidirectionalCompoundReferenceNameMask.limit = value.asUInt();
            }
            if (video_encode_av_1_capabilities_json->isMember("maxBidirectionalCompoundReferenceCount")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["maxBidirectionalCompoundReferenceCount"];
                if (!value.isUInt()) return false;
                video_encode_av_1_capabilities_.maxBidirectionalCompoundReferenceCount.limit = value.asUInt();
            }
            if (video_encode_av_1_capabilities_json->isMember("maxBidirectionalCompoundGroup1ReferenceCount")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["maxBidirectionalCompoundGroup1ReferenceCount"];
                if (!value.isUInt()) return false;
                video_encode_av_1_capabilities_.maxBidirectionalCompoundGroup1ReferenceCount.limit = value.asUInt();
            }
            if (video_encode_av_1_capabilities_json->isMember("maxBidirectionalCompoundGroup2ReferenceCount")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["maxBidirectionalCompoundGroup2ReferenceCount"];
                if (!value.isUInt()) return false;
                video_encode_av_1_capabilities_.maxBidirectionalCompoundGroup2ReferenceCount.limit = value.asUInt();
            }
            if (video_encode_av_1_capabilities_json->isMember("bidirectionalCompoundReferenceNameMask")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["bidirectionalCompoundReferenceNameMask"];
                if (!value.isUInt()) return false;
                video_encode_av_1_capabilities_.bidirectionalCompoundReferenceNameMask.limit = value.asUInt();
            }
            if (video_encode_av_1_capabilities_json->isMember("maxTemporalLayerCount")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["maxTemporalLayerCount"];
                if (!value.isUInt()) return false;
                video_encode_av_1_capabilities_.maxTemporalLayerCount.limit = value.asUInt();
            }
            if (video_encode_av_1_capabilities_json->isMember("maxSpatialLayerCount")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["maxSpatialLayerCount"];
                if (!value.isUInt()) return false;
                video_encode_av_1_capabilities_.maxSpatialLayerCount.limit = value.asUInt();
            }
            if (video_encode_av_1_capabilities_json->isMember("maxOperatingPoints")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["maxOperatingPoints"];
                if (!value.isUInt()) return false;
                video_encode_av_1_capabilities_.maxOperatingPoints.limit = value.asUInt();
            }
            if (video_encode_av_1_capabilities_json->isMember("minQIndex")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["minQIndex"];
                if (!value.isUInt()) return false;
                video_encode_av_1_capabilities_.minQIndex.limit = value.asUInt();
            }
            if (video_encode_av_1_capabilities_json->isMember("maxQIndex")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["maxQIndex"];
                if (!value.isUInt()) return false;
                video_encode_av_1_capabilities_.maxQIndex.limit = value.asUInt();
            }
            if (video_encode_av_1_capabilities_json->isMember("prefersGopRemainingFrames")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["prefersGopRemainingFrames"];
                if (!value.isBool()) return false;
                video_encode_av_1_capabilities_.prefersGopRemainingFrames.limit = value.asBool() ? VK_TRUE : VK_FALSE;
            }
            if (video_encode_av_1_capabilities_json->isMember("requiresGopRemainingFrames")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["requiresGopRemainingFrames"];
                if (!value.isBool()) return false;
                video_encode_av_1_capabilities_.requiresGopRemainingFrames.limit = value.asBool() ? VK_TRUE : VK_FALSE;
            }
            if (video_encode_av_1_capabilities_json->isMember("stdSyntaxFlags")) {
                const Json::Value &value = (*video_encode_av_1_capabilities_json)["stdSyntaxFlags"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_encode_av_1_capabilities_.stdSyntaxFlags.limit = static_cast<VkVideoEncodeAV1StdFlagsKHR>(mask);
            }
        }
        const Json::Value *video_encode_capabilities_json = nullptr;
        if (profile_caps_json.isMember("VkVideoEncodeCapabilitiesKHR")) {
            if (video_encode_capabilities_json != nullptr) return false;
            video_encode_capabilities_json = &profile_caps_json["VkVideoEncodeCapabilitiesKHR"];
        }
        if (video_encode_capabilities_json != nullptr) {
            if (video_encode_capabilities_json->isMember("flags")) {
                const Json::Value &value = (*video_encode_capabilities_json)["flags"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_encode_capabilities_.flags.limit = static_cast<VkVideoEncodeCapabilityFlagsKHR>(mask);
            }
            if (video_encode_capabilities_json->isMember("rateControlModes")) {
                const Json::Value &value = (*video_encode_capabilities_json)["rateControlModes"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_encode_capabilities_.rateControlModes.limit = static_cast<VkVideoEncodeRateControlModeFlagsKHR>(mask);
            }
            if (video_encode_capabilities_json->isMember("maxRateControlLayers")) {
                const Json::Value &value = (*video_encode_capabilities_json)["maxRateControlLayers"];
                if (!value.isUInt()) return false;
                video_encode_capabilities_.maxRateControlLayers.limit = value.asUInt();
            }
            if (video_encode_capabilities_json->isMember("maxBitrate")) {
                const Json::Value &value = (*video_encode_capabilities_json)["maxBitrate"];
                if (!value.isUInt64()) return false;
                video_encode_capabilities_.maxBitrate.limit = value.asUInt64();
            }
            if (video_encode_capabilities_json->isMember("maxQualityLevels")) {
                const Json::Value &value = (*video_encode_capabilities_json)["maxQualityLevels"];
                if (!value.isUInt()) return false;
                video_encode_capabilities_.maxQualityLevels.limit = value.asUInt();
            }
            if (video_encode_capabilities_json->isMember("encodeInputPictureGranularity")) {
                const Json::Value &value = (*video_encode_capabilities_json)["encodeInputPictureGranularity"];
                if (!value.isObject()) return false;
                if (value.isMember("width")) {
                    const Json::Value &value_width = value["width"];
                    if (!value_width.isUInt()) return false;
                    video_encode_capabilities_.encodeInputPictureGranularity.width.limit = value_width.asUInt();
                }
                if (value.isMember("height")) {
                    const Json::Value &value_height = value["height"];
                    if (!value_height.isUInt()) return false;
                    video_encode_capabilities_.encodeInputPictureGranularity.height.limit = value_height.asUInt();
                }
            }
            if (video_encode_capabilities_json->isMember("supportedEncodeFeedbackFlags")) {
                const Json::Value &value = (*video_encode_capabilities_json)["supportedEncodeFeedbackFlags"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_encode_capabilities_.supportedEncodeFeedbackFlags.limit = static_cast<VkVideoEncodeFeedbackFlagsKHR>(mask);
            }
        }
        const Json::Value *video_encode_feedback_2_capabilities_json = nullptr;
        if (profile_caps_json.isMember("VkVideoEncodeFeedback2CapabilitiesKHR")) {
            if (video_encode_feedback_2_capabilities_json != nullptr) return false;
            video_encode_feedback_2_capabilities_json = &profile_caps_json["VkVideoEncodeFeedback2CapabilitiesKHR"];
        }
        if (video_encode_feedback_2_capabilities_json != nullptr) {
            if (video_encode_feedback_2_capabilities_json->isMember("maxPerPartitionFeedbackEntries")) {
                const Json::Value &value = (*video_encode_feedback_2_capabilities_json)["maxPerPartitionFeedbackEntries"];
                if (!value.isUInt()) return false;
                video_encode_feedback_2_capabilities_.maxPerPartitionFeedbackEntries.limit = value.asUInt();
            }
            if (video_encode_feedback_2_capabilities_json->isMember("supportedPerPartitionEncodeFeedbackFlags")) {
                const Json::Value &value = (*video_encode_feedback_2_capabilities_json)["supportedPerPartitionEncodeFeedbackFlags"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_encode_feedback_2_capabilities_.supportedPerPartitionEncodeFeedbackFlags.limit = static_cast<VkVideoEncodePerPartitionFeedbackFlagsKHR>(mask);
            }
        }
        const Json::Value *video_encode_h_264_capabilities_json = nullptr;
        if (profile_caps_json.isMember("VkVideoEncodeH264CapabilitiesKHR")) {
            if (video_encode_h_264_capabilities_json != nullptr) return false;
            video_encode_h_264_capabilities_json = &profile_caps_json["VkVideoEncodeH264CapabilitiesKHR"];
        }
        if (video_encode_h_264_capabilities_json != nullptr) {
            if (video_encode_h_264_capabilities_json->isMember("flags")) {
                const Json::Value &value = (*video_encode_h_264_capabilities_json)["flags"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_encode_h_264_capabilities_.flags.limit = static_cast<VkVideoEncodeH264CapabilityFlagsKHR>(mask);
            }
            if (video_encode_h_264_capabilities_json->isMember("maxLevelIdc")) {
                const Json::Value &value = (*video_encode_h_264_capabilities_json)["maxLevelIdc"];
                if (!value.isString()) return false;
                video_encode_h_264_capabilities_.maxLevelIdc.limit = static_cast<StdVideoH264LevelIdc>(VkStringToUint64(value.asString()));
            }
            if (video_encode_h_264_capabilities_json->isMember("maxSliceCount")) {
                const Json::Value &value = (*video_encode_h_264_capabilities_json)["maxSliceCount"];
                if (!value.isUInt()) return false;
                video_encode_h_264_capabilities_.maxSliceCount.limit = value.asUInt();
            }
            if (video_encode_h_264_capabilities_json->isMember("maxPPictureL0ReferenceCount")) {
                const Json::Value &value = (*video_encode_h_264_capabilities_json)["maxPPictureL0ReferenceCount"];
                if (!value.isUInt()) return false;
                video_encode_h_264_capabilities_.maxPPictureL0ReferenceCount.limit = value.asUInt();
            }
            if (video_encode_h_264_capabilities_json->isMember("maxBPictureL0ReferenceCount")) {
                const Json::Value &value = (*video_encode_h_264_capabilities_json)["maxBPictureL0ReferenceCount"];
                if (!value.isUInt()) return false;
                video_encode_h_264_capabilities_.maxBPictureL0ReferenceCount.limit = value.asUInt();
            }
            if (video_encode_h_264_capabilities_json->isMember("maxL1ReferenceCount")) {
                const Json::Value &value = (*video_encode_h_264_capabilities_json)["maxL1ReferenceCount"];
                if (!value.isUInt()) return false;
                video_encode_h_264_capabilities_.maxL1ReferenceCount.limit = value.asUInt();
            }
            if (video_encode_h_264_capabilities_json->isMember("maxTemporalLayerCount")) {
                const Json::Value &value = (*video_encode_h_264_capabilities_json)["maxTemporalLayerCount"];
                if (!value.isUInt()) return false;
                video_encode_h_264_capabilities_.maxTemporalLayerCount.limit = value.asUInt();
            }
            if (video_encode_h_264_capabilities_json->isMember("expectDyadicTemporalLayerPattern")) {
                const Json::Value &value = (*video_encode_h_264_capabilities_json)["expectDyadicTemporalLayerPattern"];
                if (!value.isBool()) return false;
                video_encode_h_264_capabilities_.expectDyadicTemporalLayerPattern.limit = value.asBool() ? VK_TRUE : VK_FALSE;
            }
            if (video_encode_h_264_capabilities_json->isMember("minQp")) {
                const Json::Value &value = (*video_encode_h_264_capabilities_json)["minQp"];
                if (!value.isInt()) return false;
                video_encode_h_264_capabilities_.minQp.limit = value.asInt();
            }
            if (video_encode_h_264_capabilities_json->isMember("maxQp")) {
                const Json::Value &value = (*video_encode_h_264_capabilities_json)["maxQp"];
                if (!value.isInt()) return false;
                video_encode_h_264_capabilities_.maxQp.limit = value.asInt();
            }
            if (video_encode_h_264_capabilities_json->isMember("prefersGopRemainingFrames")) {
                const Json::Value &value = (*video_encode_h_264_capabilities_json)["prefersGopRemainingFrames"];
                if (!value.isBool()) return false;
                video_encode_h_264_capabilities_.prefersGopRemainingFrames.limit = value.asBool() ? VK_TRUE : VK_FALSE;
            }
            if (video_encode_h_264_capabilities_json->isMember("requiresGopRemainingFrames")) {
                const Json::Value &value = (*video_encode_h_264_capabilities_json)["requiresGopRemainingFrames"];
                if (!value.isBool()) return false;
                video_encode_h_264_capabilities_.requiresGopRemainingFrames.limit = value.asBool() ? VK_TRUE : VK_FALSE;
            }
            if (video_encode_h_264_capabilities_json->isMember("stdSyntaxFlags")) {
                const Json::Value &value = (*video_encode_h_264_capabilities_json)["stdSyntaxFlags"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_encode_h_264_capabilities_.stdSyntaxFlags.limit = static_cast<VkVideoEncodeH264StdFlagsKHR>(mask);
            }
        }
        const Json::Value *video_encode_h_264_quantization_map_capabilities_json = nullptr;
        if (profile_caps_json.isMember("VkVideoEncodeH264QuantizationMapCapabilitiesKHR")) {
            if (video_encode_h_264_quantization_map_capabilities_json != nullptr) return false;
            video_encode_h_264_quantization_map_capabilities_json = &profile_caps_json["VkVideoEncodeH264QuantizationMapCapabilitiesKHR"];
        }
        if (video_encode_h_264_quantization_map_capabilities_json != nullptr) {
            if (video_encode_h_264_quantization_map_capabilities_json->isMember("minQpDelta")) {
                const Json::Value &value = (*video_encode_h_264_quantization_map_capabilities_json)["minQpDelta"];
                if (!value.isInt()) return false;
                video_encode_h_264_quantization_map_capabilities_.minQpDelta.limit = value.asInt();
            }
            if (video_encode_h_264_quantization_map_capabilities_json->isMember("maxQpDelta")) {
                const Json::Value &value = (*video_encode_h_264_quantization_map_capabilities_json)["maxQpDelta"];
                if (!value.isInt()) return false;
                video_encode_h_264_quantization_map_capabilities_.maxQpDelta.limit = value.asInt();
            }
        }
        const Json::Value *video_encode_h_265_capabilities_json = nullptr;
        if (profile_caps_json.isMember("VkVideoEncodeH265CapabilitiesKHR")) {
            if (video_encode_h_265_capabilities_json != nullptr) return false;
            video_encode_h_265_capabilities_json = &profile_caps_json["VkVideoEncodeH265CapabilitiesKHR"];
        }
        if (video_encode_h_265_capabilities_json != nullptr) {
            if (video_encode_h_265_capabilities_json->isMember("flags")) {
                const Json::Value &value = (*video_encode_h_265_capabilities_json)["flags"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_encode_h_265_capabilities_.flags.limit = static_cast<VkVideoEncodeH265CapabilityFlagsKHR>(mask);
            }
            if (video_encode_h_265_capabilities_json->isMember("maxLevelIdc")) {
                const Json::Value &value = (*video_encode_h_265_capabilities_json)["maxLevelIdc"];
                if (!value.isString()) return false;
                video_encode_h_265_capabilities_.maxLevelIdc.limit = static_cast<StdVideoH265LevelIdc>(VkStringToUint64(value.asString()));
            }
            if (video_encode_h_265_capabilities_json->isMember("maxSliceSegmentCount")) {
                const Json::Value &value = (*video_encode_h_265_capabilities_json)["maxSliceSegmentCount"];
                if (!value.isUInt()) return false;
                video_encode_h_265_capabilities_.maxSliceSegmentCount.limit = value.asUInt();
            }
            if (video_encode_h_265_capabilities_json->isMember("maxTiles")) {
                const Json::Value &value = (*video_encode_h_265_capabilities_json)["maxTiles"];
                if (!value.isObject()) return false;
                if (value.isMember("width")) {
                    const Json::Value &value_width = value["width"];
                    if (!value_width.isUInt()) return false;
                    video_encode_h_265_capabilities_.maxTiles.width.limit = value_width.asUInt();
                }
                if (value.isMember("height")) {
                    const Json::Value &value_height = value["height"];
                    if (!value_height.isUInt()) return false;
                    video_encode_h_265_capabilities_.maxTiles.height.limit = value_height.asUInt();
                }
            }
            if (video_encode_h_265_capabilities_json->isMember("ctbSizes")) {
                const Json::Value &value = (*video_encode_h_265_capabilities_json)["ctbSizes"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_encode_h_265_capabilities_.ctbSizes.limit = static_cast<VkVideoEncodeH265CtbSizeFlagsKHR>(mask);
            }
            if (video_encode_h_265_capabilities_json->isMember("transformBlockSizes")) {
                const Json::Value &value = (*video_encode_h_265_capabilities_json)["transformBlockSizes"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_encode_h_265_capabilities_.transformBlockSizes.limit = static_cast<VkVideoEncodeH265TransformBlockSizeFlagsKHR>(mask);
            }
            if (video_encode_h_265_capabilities_json->isMember("maxPPictureL0ReferenceCount")) {
                const Json::Value &value = (*video_encode_h_265_capabilities_json)["maxPPictureL0ReferenceCount"];
                if (!value.isUInt()) return false;
                video_encode_h_265_capabilities_.maxPPictureL0ReferenceCount.limit = value.asUInt();
            }
            if (video_encode_h_265_capabilities_json->isMember("maxBPictureL0ReferenceCount")) {
                const Json::Value &value = (*video_encode_h_265_capabilities_json)["maxBPictureL0ReferenceCount"];
                if (!value.isUInt()) return false;
                video_encode_h_265_capabilities_.maxBPictureL0ReferenceCount.limit = value.asUInt();
            }
            if (video_encode_h_265_capabilities_json->isMember("maxL1ReferenceCount")) {
                const Json::Value &value = (*video_encode_h_265_capabilities_json)["maxL1ReferenceCount"];
                if (!value.isUInt()) return false;
                video_encode_h_265_capabilities_.maxL1ReferenceCount.limit = value.asUInt();
            }
            if (video_encode_h_265_capabilities_json->isMember("maxSubLayerCount")) {
                const Json::Value &value = (*video_encode_h_265_capabilities_json)["maxSubLayerCount"];
                if (!value.isUInt()) return false;
                video_encode_h_265_capabilities_.maxSubLayerCount.limit = value.asUInt();
            }
            if (video_encode_h_265_capabilities_json->isMember("expectDyadicTemporalSubLayerPattern")) {
                const Json::Value &value = (*video_encode_h_265_capabilities_json)["expectDyadicTemporalSubLayerPattern"];
                if (!value.isBool()) return false;
                video_encode_h_265_capabilities_.expectDyadicTemporalSubLayerPattern.limit = value.asBool() ? VK_TRUE : VK_FALSE;
            }
            if (video_encode_h_265_capabilities_json->isMember("minQp")) {
                const Json::Value &value = (*video_encode_h_265_capabilities_json)["minQp"];
                if (!value.isInt()) return false;
                video_encode_h_265_capabilities_.minQp.limit = value.asInt();
            }
            if (video_encode_h_265_capabilities_json->isMember("maxQp")) {
                const Json::Value &value = (*video_encode_h_265_capabilities_json)["maxQp"];
                if (!value.isInt()) return false;
                video_encode_h_265_capabilities_.maxQp.limit = value.asInt();
            }
            if (video_encode_h_265_capabilities_json->isMember("prefersGopRemainingFrames")) {
                const Json::Value &value = (*video_encode_h_265_capabilities_json)["prefersGopRemainingFrames"];
                if (!value.isBool()) return false;
                video_encode_h_265_capabilities_.prefersGopRemainingFrames.limit = value.asBool() ? VK_TRUE : VK_FALSE;
            }
            if (video_encode_h_265_capabilities_json->isMember("requiresGopRemainingFrames")) {
                const Json::Value &value = (*video_encode_h_265_capabilities_json)["requiresGopRemainingFrames"];
                if (!value.isBool()) return false;
                video_encode_h_265_capabilities_.requiresGopRemainingFrames.limit = value.asBool() ? VK_TRUE : VK_FALSE;
            }
            if (video_encode_h_265_capabilities_json->isMember("stdSyntaxFlags")) {
                const Json::Value &value = (*video_encode_h_265_capabilities_json)["stdSyntaxFlags"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_encode_h_265_capabilities_.stdSyntaxFlags.limit = static_cast<VkVideoEncodeH265StdFlagsKHR>(mask);
            }
        }
        const Json::Value *video_encode_h_265_quantization_map_capabilities_json = nullptr;
        if (profile_caps_json.isMember("VkVideoEncodeH265QuantizationMapCapabilitiesKHR")) {
            if (video_encode_h_265_quantization_map_capabilities_json != nullptr) return false;
            video_encode_h_265_quantization_map_capabilities_json = &profile_caps_json["VkVideoEncodeH265QuantizationMapCapabilitiesKHR"];
        }
        if (video_encode_h_265_quantization_map_capabilities_json != nullptr) {
            if (video_encode_h_265_quantization_map_capabilities_json->isMember("minQpDelta")) {
                const Json::Value &value = (*video_encode_h_265_quantization_map_capabilities_json)["minQpDelta"];
                if (!value.isInt()) return false;
                video_encode_h_265_quantization_map_capabilities_.minQpDelta.limit = value.asInt();
            }
            if (video_encode_h_265_quantization_map_capabilities_json->isMember("maxQpDelta")) {
                const Json::Value &value = (*video_encode_h_265_quantization_map_capabilities_json)["maxQpDelta"];
                if (!value.isInt()) return false;
                video_encode_h_265_quantization_map_capabilities_.maxQpDelta.limit = value.asInt();
            }
        }
        const Json::Value *video_encode_intra_refresh_capabilities_json = nullptr;
        if (profile_caps_json.isMember("VkVideoEncodeIntraRefreshCapabilitiesKHR")) {
            if (video_encode_intra_refresh_capabilities_json != nullptr) return false;
            video_encode_intra_refresh_capabilities_json = &profile_caps_json["VkVideoEncodeIntraRefreshCapabilitiesKHR"];
        }
        if (video_encode_intra_refresh_capabilities_json != nullptr) {
            if (video_encode_intra_refresh_capabilities_json->isMember("intraRefreshModes")) {
                const Json::Value &value = (*video_encode_intra_refresh_capabilities_json)["intraRefreshModes"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_encode_intra_refresh_capabilities_.intraRefreshModes.limit = static_cast<VkVideoEncodeIntraRefreshModeFlagsKHR>(mask);
            }
            if (video_encode_intra_refresh_capabilities_json->isMember("maxIntraRefreshCycleDuration")) {
                const Json::Value &value = (*video_encode_intra_refresh_capabilities_json)["maxIntraRefreshCycleDuration"];
                if (!value.isUInt()) return false;
                video_encode_intra_refresh_capabilities_.maxIntraRefreshCycleDuration.limit = value.asUInt();
            }
            if (video_encode_intra_refresh_capabilities_json->isMember("maxIntraRefreshActiveReferencePictures")) {
                const Json::Value &value = (*video_encode_intra_refresh_capabilities_json)["maxIntraRefreshActiveReferencePictures"];
                if (!value.isUInt()) return false;
                video_encode_intra_refresh_capabilities_.maxIntraRefreshActiveReferencePictures.limit = value.asUInt();
            }
            if (video_encode_intra_refresh_capabilities_json->isMember("partitionIndependentIntraRefreshRegions")) {
                const Json::Value &value = (*video_encode_intra_refresh_capabilities_json)["partitionIndependentIntraRefreshRegions"];
                if (!value.isBool()) return false;
                video_encode_intra_refresh_capabilities_.partitionIndependentIntraRefreshRegions.limit = value.asBool() ? VK_TRUE : VK_FALSE;
            }
            if (video_encode_intra_refresh_capabilities_json->isMember("nonRectangularIntraRefreshRegions")) {
                const Json::Value &value = (*video_encode_intra_refresh_capabilities_json)["nonRectangularIntraRefreshRegions"];
                if (!value.isBool()) return false;
                video_encode_intra_refresh_capabilities_.nonRectangularIntraRefreshRegions.limit = value.asBool() ? VK_TRUE : VK_FALSE;
            }
        }
        const Json::Value *video_encode_quantization_map_capabilities_json = nullptr;
        if (profile_caps_json.isMember("VkVideoEncodeQuantizationMapCapabilitiesKHR")) {
            if (video_encode_quantization_map_capabilities_json != nullptr) return false;
            video_encode_quantization_map_capabilities_json = &profile_caps_json["VkVideoEncodeQuantizationMapCapabilitiesKHR"];
        }
        if (video_encode_quantization_map_capabilities_json != nullptr) {
            if (video_encode_quantization_map_capabilities_json->isMember("maxQuantizationMapExtent")) {
                const Json::Value &value = (*video_encode_quantization_map_capabilities_json)["maxQuantizationMapExtent"];
                if (!value.isObject()) return false;
                if (value.isMember("width")) {
                    const Json::Value &value_width = value["width"];
                    if (!value_width.isUInt()) return false;
                    video_encode_quantization_map_capabilities_.maxQuantizationMapExtent.width.limit = value_width.asUInt();
                }
                if (value.isMember("height")) {
                    const Json::Value &value_height = value["height"];
                    if (!value_height.isUInt()) return false;
                    video_encode_quantization_map_capabilities_.maxQuantizationMapExtent.height.limit = value_height.asUInt();
                }
            }
        }
        const Json::Value *video_encode_rgb_conversion_capabilities_json = nullptr;
        if (profile_caps_json.isMember("VkVideoEncodeRgbConversionCapabilitiesVALVE")) {
            if (video_encode_rgb_conversion_capabilities_json != nullptr) return false;
            video_encode_rgb_conversion_capabilities_json = &profile_caps_json["VkVideoEncodeRgbConversionCapabilitiesVALVE"];
        }
        if (video_encode_rgb_conversion_capabilities_json != nullptr) {
            if (video_encode_rgb_conversion_capabilities_json->isMember("rgbModels")) {
                const Json::Value &value = (*video_encode_rgb_conversion_capabilities_json)["rgbModels"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_encode_rgb_conversion_capabilities_.rgbModels.limit = static_cast<VkVideoEncodeRgbModelConversionFlagsVALVE>(mask);
            }
            if (video_encode_rgb_conversion_capabilities_json->isMember("rgbRanges")) {
                const Json::Value &value = (*video_encode_rgb_conversion_capabilities_json)["rgbRanges"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_encode_rgb_conversion_capabilities_.rgbRanges.limit = static_cast<VkVideoEncodeRgbRangeCompressionFlagsVALVE>(mask);
            }
            if (video_encode_rgb_conversion_capabilities_json->isMember("xChromaOffsets")) {
                const Json::Value &value = (*video_encode_rgb_conversion_capabilities_json)["xChromaOffsets"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_encode_rgb_conversion_capabilities_.xChromaOffsets.limit = static_cast<VkVideoEncodeRgbChromaOffsetFlagsVALVE>(mask);
            }
            if (video_encode_rgb_conversion_capabilities_json->isMember("yChromaOffsets")) {
                const Json::Value &value = (*video_encode_rgb_conversion_capabilities_json)["yChromaOffsets"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_encode_rgb_conversion_capabilities_.yChromaOffsets.limit = static_cast<VkVideoEncodeRgbChromaOffsetFlagsVALVE>(mask);
            }
        }
        return true;
    }

  public:
    JsonVideoProfileCaps() = default;
    JsonVideoProfileCaps(const Json::Value &profile_json) {
        is_valid_ = ParseJson(profile_json);
    }

    bool IsValid() const { return is_valid_; }

    bool Combine(ProfileLayerSettings *layer_settings, const JsonVideoProfileCaps &caps) {
        const char *error_msg = "Conflicting video capability defined in the profile for %s\n";
        bool result = true;
        if (caps.video_capabilities_.flags.limit.has_value() && !video_capabilities_.flags.Combine(caps.video_capabilities_.flags.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoCapabilitiesKHR::flags");
            result = false;
        }
        if (caps.video_capabilities_.minBitstreamBufferOffsetAlignment.limit.has_value() && !video_capabilities_.minBitstreamBufferOffsetAlignment.Combine(caps.video_capabilities_.minBitstreamBufferOffsetAlignment.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoCapabilitiesKHR::minBitstreamBufferOffsetAlignment");
            result = false;
        }
        if (caps.video_capabilities_.minBitstreamBufferSizeAlignment.limit.has_value() && !video_capabilities_.minBitstreamBufferSizeAlignment.Combine(caps.video_capabilities_.minBitstreamBufferSizeAlignment.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoCapabilitiesKHR::minBitstreamBufferSizeAlignment");
            result = false;
        }
        if (caps.video_capabilities_.pictureAccessGranularity.width.limit.has_value() && !video_capabilities_.pictureAccessGranularity.width.Combine(caps.video_capabilities_.pictureAccessGranularity.width.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoCapabilitiesKHR::VkExtent2D::width");
            result = false;
        }
        if (caps.video_capabilities_.pictureAccessGranularity.height.limit.has_value() && !video_capabilities_.pictureAccessGranularity.height.Combine(caps.video_capabilities_.pictureAccessGranularity.height.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoCapabilitiesKHR::VkExtent2D::height");
            result = false;
        }
        if (caps.video_capabilities_.minCodedExtent.width.limit.has_value() && !video_capabilities_.minCodedExtent.width.Combine(caps.video_capabilities_.minCodedExtent.width.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoCapabilitiesKHR::VkExtent2D::width");
            result = false;
        }
        if (caps.video_capabilities_.minCodedExtent.height.limit.has_value() && !video_capabilities_.minCodedExtent.height.Combine(caps.video_capabilities_.minCodedExtent.height.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoCapabilitiesKHR::VkExtent2D::height");
            result = false;
        }
        if (caps.video_capabilities_.maxCodedExtent.width.limit.has_value() && !video_capabilities_.maxCodedExtent.width.Combine(caps.video_capabilities_.maxCodedExtent.width.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoCapabilitiesKHR::VkExtent2D::width");
            result = false;
        }
        if (caps.video_capabilities_.maxCodedExtent.height.limit.has_value() && !video_capabilities_.maxCodedExtent.height.Combine(caps.video_capabilities_.maxCodedExtent.height.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoCapabilitiesKHR::VkExtent2D::height");
            result = false;
        }
        if (caps.video_capabilities_.maxDpbSlots.limit.has_value() && !video_capabilities_.maxDpbSlots.Combine(caps.video_capabilities_.maxDpbSlots.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoCapabilitiesKHR::maxDpbSlots");
            result = false;
        }
        if (caps.video_capabilities_.maxActiveReferencePictures.limit.has_value() && !video_capabilities_.maxActiveReferencePictures.Combine(caps.video_capabilities_.maxActiveReferencePictures.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoCapabilitiesKHR::maxActiveReferencePictures");
            result = false;
        }
        if (caps.video_capabilities_.stdHeaderVersion.extensionName.limit.has_value() && !video_capabilities_.stdHeaderVersion.extensionName.Combine(caps.video_capabilities_.stdHeaderVersion.extensionName.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoCapabilitiesKHR::VkExtensionProperties::extensionName");
            result = false;
        }
        if (caps.video_capabilities_.stdHeaderVersion.specVersion.limit.has_value() && !video_capabilities_.stdHeaderVersion.specVersion.Combine(caps.video_capabilities_.stdHeaderVersion.specVersion.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoCapabilitiesKHR::VkExtensionProperties::specVersion");
            result = false;
        }
        if (caps.video_decode_av_1_capabilities_.maxLevel.limit.has_value() && !video_decode_av_1_capabilities_.maxLevel.Combine(caps.video_decode_av_1_capabilities_.maxLevel.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoDecodeAV1CapabilitiesKHR::maxLevel");
            result = false;
        }
        if (caps.video_decode_capabilities_.flags.limit.has_value() && !video_decode_capabilities_.flags.Combine(caps.video_decode_capabilities_.flags.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoDecodeCapabilitiesKHR::flags");
            result = false;
        }
        if (caps.video_decode_h_264_capabilities_.maxLevelIdc.limit.has_value() && !video_decode_h_264_capabilities_.maxLevelIdc.Combine(caps.video_decode_h_264_capabilities_.maxLevelIdc.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoDecodeH264CapabilitiesKHR::maxLevelIdc");
            result = false;
        }
        if (caps.video_decode_h_264_capabilities_.fieldOffsetGranularity.x.limit.has_value() && !video_decode_h_264_capabilities_.fieldOffsetGranularity.x.Combine(caps.video_decode_h_264_capabilities_.fieldOffsetGranularity.x.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoDecodeH264CapabilitiesKHR::VkOffset2D::x");
            result = false;
        }
        if (caps.video_decode_h_264_capabilities_.fieldOffsetGranularity.y.limit.has_value() && !video_decode_h_264_capabilities_.fieldOffsetGranularity.y.Combine(caps.video_decode_h_264_capabilities_.fieldOffsetGranularity.y.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoDecodeH264CapabilitiesKHR::VkOffset2D::y");
            result = false;
        }
        if (caps.video_decode_h_265_capabilities_.maxLevelIdc.limit.has_value() && !video_decode_h_265_capabilities_.maxLevelIdc.Combine(caps.video_decode_h_265_capabilities_.maxLevelIdc.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoDecodeH265CapabilitiesKHR::maxLevelIdc");
            result = false;
        }
        if (caps.video_decode_vp_9_capabilities_.maxLevel.limit.has_value() && !video_decode_vp_9_capabilities_.maxLevel.Combine(caps.video_decode_vp_9_capabilities_.maxLevel.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoDecodeVP9CapabilitiesKHR::maxLevel");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.flags.limit.has_value() && !video_encode_av_1_capabilities_.flags.Combine(caps.video_encode_av_1_capabilities_.flags.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::flags");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.maxLevel.limit.has_value() && !video_encode_av_1_capabilities_.maxLevel.Combine(caps.video_encode_av_1_capabilities_.maxLevel.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxLevel");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.codedPictureAlignment.width.limit.has_value() && !video_encode_av_1_capabilities_.codedPictureAlignment.width.Combine(caps.video_encode_av_1_capabilities_.codedPictureAlignment.width.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::VkExtent2D::width");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.codedPictureAlignment.height.limit.has_value() && !video_encode_av_1_capabilities_.codedPictureAlignment.height.Combine(caps.video_encode_av_1_capabilities_.codedPictureAlignment.height.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::VkExtent2D::height");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.maxTiles.width.limit.has_value() && !video_encode_av_1_capabilities_.maxTiles.width.Combine(caps.video_encode_av_1_capabilities_.maxTiles.width.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::VkExtent2D::width");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.maxTiles.height.limit.has_value() && !video_encode_av_1_capabilities_.maxTiles.height.Combine(caps.video_encode_av_1_capabilities_.maxTiles.height.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::VkExtent2D::height");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.minTileSize.width.limit.has_value() && !video_encode_av_1_capabilities_.minTileSize.width.Combine(caps.video_encode_av_1_capabilities_.minTileSize.width.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::VkExtent2D::width");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.minTileSize.height.limit.has_value() && !video_encode_av_1_capabilities_.minTileSize.height.Combine(caps.video_encode_av_1_capabilities_.minTileSize.height.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::VkExtent2D::height");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.maxTileSize.width.limit.has_value() && !video_encode_av_1_capabilities_.maxTileSize.width.Combine(caps.video_encode_av_1_capabilities_.maxTileSize.width.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::VkExtent2D::width");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.maxTileSize.height.limit.has_value() && !video_encode_av_1_capabilities_.maxTileSize.height.Combine(caps.video_encode_av_1_capabilities_.maxTileSize.height.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::VkExtent2D::height");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.superblockSizes.limit.has_value() && !video_encode_av_1_capabilities_.superblockSizes.Combine(caps.video_encode_av_1_capabilities_.superblockSizes.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::superblockSizes");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.maxSingleReferenceCount.limit.has_value() && !video_encode_av_1_capabilities_.maxSingleReferenceCount.Combine(caps.video_encode_av_1_capabilities_.maxSingleReferenceCount.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxSingleReferenceCount");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.singleReferenceNameMask.limit.has_value() && !video_encode_av_1_capabilities_.singleReferenceNameMask.Combine(caps.video_encode_av_1_capabilities_.singleReferenceNameMask.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::singleReferenceNameMask");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.maxUnidirectionalCompoundReferenceCount.limit.has_value() && !video_encode_av_1_capabilities_.maxUnidirectionalCompoundReferenceCount.Combine(caps.video_encode_av_1_capabilities_.maxUnidirectionalCompoundReferenceCount.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxUnidirectionalCompoundReferenceCount");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.maxUnidirectionalCompoundGroup1ReferenceCount.limit.has_value() && !video_encode_av_1_capabilities_.maxUnidirectionalCompoundGroup1ReferenceCount.Combine(caps.video_encode_av_1_capabilities_.maxUnidirectionalCompoundGroup1ReferenceCount.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxUnidirectionalCompoundGroup1ReferenceCount");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.unidirectionalCompoundReferenceNameMask.limit.has_value() && !video_encode_av_1_capabilities_.unidirectionalCompoundReferenceNameMask.Combine(caps.video_encode_av_1_capabilities_.unidirectionalCompoundReferenceNameMask.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::unidirectionalCompoundReferenceNameMask");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.maxBidirectionalCompoundReferenceCount.limit.has_value() && !video_encode_av_1_capabilities_.maxBidirectionalCompoundReferenceCount.Combine(caps.video_encode_av_1_capabilities_.maxBidirectionalCompoundReferenceCount.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxBidirectionalCompoundReferenceCount");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.maxBidirectionalCompoundGroup1ReferenceCount.limit.has_value() && !video_encode_av_1_capabilities_.maxBidirectionalCompoundGroup1ReferenceCount.Combine(caps.video_encode_av_1_capabilities_.maxBidirectionalCompoundGroup1ReferenceCount.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxBidirectionalCompoundGroup1ReferenceCount");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.maxBidirectionalCompoundGroup2ReferenceCount.limit.has_value() && !video_encode_av_1_capabilities_.maxBidirectionalCompoundGroup2ReferenceCount.Combine(caps.video_encode_av_1_capabilities_.maxBidirectionalCompoundGroup2ReferenceCount.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxBidirectionalCompoundGroup2ReferenceCount");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.bidirectionalCompoundReferenceNameMask.limit.has_value() && !video_encode_av_1_capabilities_.bidirectionalCompoundReferenceNameMask.Combine(caps.video_encode_av_1_capabilities_.bidirectionalCompoundReferenceNameMask.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::bidirectionalCompoundReferenceNameMask");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.maxTemporalLayerCount.limit.has_value() && !video_encode_av_1_capabilities_.maxTemporalLayerCount.Combine(caps.video_encode_av_1_capabilities_.maxTemporalLayerCount.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxTemporalLayerCount");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.maxSpatialLayerCount.limit.has_value() && !video_encode_av_1_capabilities_.maxSpatialLayerCount.Combine(caps.video_encode_av_1_capabilities_.maxSpatialLayerCount.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxSpatialLayerCount");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.maxOperatingPoints.limit.has_value() && !video_encode_av_1_capabilities_.maxOperatingPoints.Combine(caps.video_encode_av_1_capabilities_.maxOperatingPoints.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxOperatingPoints");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.minQIndex.limit.has_value() && !video_encode_av_1_capabilities_.minQIndex.Combine(caps.video_encode_av_1_capabilities_.minQIndex.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::minQIndex");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.maxQIndex.limit.has_value() && !video_encode_av_1_capabilities_.maxQIndex.Combine(caps.video_encode_av_1_capabilities_.maxQIndex.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxQIndex");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.prefersGopRemainingFrames.limit.has_value() && !video_encode_av_1_capabilities_.prefersGopRemainingFrames.Combine(caps.video_encode_av_1_capabilities_.prefersGopRemainingFrames.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::prefersGopRemainingFrames");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.requiresGopRemainingFrames.limit.has_value() && !video_encode_av_1_capabilities_.requiresGopRemainingFrames.Combine(caps.video_encode_av_1_capabilities_.requiresGopRemainingFrames.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::requiresGopRemainingFrames");
            result = false;
        }
        if (caps.video_encode_av_1_capabilities_.stdSyntaxFlags.limit.has_value() && !video_encode_av_1_capabilities_.stdSyntaxFlags.Combine(caps.video_encode_av_1_capabilities_.stdSyntaxFlags.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeAV1CapabilitiesKHR::stdSyntaxFlags");
            result = false;
        }
        if (caps.video_encode_capabilities_.flags.limit.has_value() && !video_encode_capabilities_.flags.Combine(caps.video_encode_capabilities_.flags.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeCapabilitiesKHR::flags");
            result = false;
        }
        if (caps.video_encode_capabilities_.rateControlModes.limit.has_value() && !video_encode_capabilities_.rateControlModes.Combine(caps.video_encode_capabilities_.rateControlModes.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeCapabilitiesKHR::rateControlModes");
            result = false;
        }
        if (caps.video_encode_capabilities_.maxRateControlLayers.limit.has_value() && !video_encode_capabilities_.maxRateControlLayers.Combine(caps.video_encode_capabilities_.maxRateControlLayers.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeCapabilitiesKHR::maxRateControlLayers");
            result = false;
        }
        if (caps.video_encode_capabilities_.maxBitrate.limit.has_value() && !video_encode_capabilities_.maxBitrate.Combine(caps.video_encode_capabilities_.maxBitrate.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeCapabilitiesKHR::maxBitrate");
            result = false;
        }
        if (caps.video_encode_capabilities_.maxQualityLevels.limit.has_value() && !video_encode_capabilities_.maxQualityLevels.Combine(caps.video_encode_capabilities_.maxQualityLevels.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeCapabilitiesKHR::maxQualityLevels");
            result = false;
        }
        if (caps.video_encode_capabilities_.encodeInputPictureGranularity.width.limit.has_value() && !video_encode_capabilities_.encodeInputPictureGranularity.width.Combine(caps.video_encode_capabilities_.encodeInputPictureGranularity.width.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeCapabilitiesKHR::VkExtent2D::width");
            result = false;
        }
        if (caps.video_encode_capabilities_.encodeInputPictureGranularity.height.limit.has_value() && !video_encode_capabilities_.encodeInputPictureGranularity.height.Combine(caps.video_encode_capabilities_.encodeInputPictureGranularity.height.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeCapabilitiesKHR::VkExtent2D::height");
            result = false;
        }
        if (caps.video_encode_capabilities_.supportedEncodeFeedbackFlags.limit.has_value() && !video_encode_capabilities_.supportedEncodeFeedbackFlags.Combine(caps.video_encode_capabilities_.supportedEncodeFeedbackFlags.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeCapabilitiesKHR::supportedEncodeFeedbackFlags");
            result = false;
        }
        if (caps.video_encode_feedback_2_capabilities_.maxPerPartitionFeedbackEntries.limit.has_value() && !video_encode_feedback_2_capabilities_.maxPerPartitionFeedbackEntries.Combine(caps.video_encode_feedback_2_capabilities_.maxPerPartitionFeedbackEntries.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeFeedback2CapabilitiesKHR::maxPerPartitionFeedbackEntries");
            result = false;
        }
        if (caps.video_encode_feedback_2_capabilities_.supportedPerPartitionEncodeFeedbackFlags.limit.has_value() && !video_encode_feedback_2_capabilities_.supportedPerPartitionEncodeFeedbackFlags.Combine(caps.video_encode_feedback_2_capabilities_.supportedPerPartitionEncodeFeedbackFlags.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeFeedback2CapabilitiesKHR::supportedPerPartitionEncodeFeedbackFlags");
            result = false;
        }
        if (caps.video_encode_h_264_capabilities_.flags.limit.has_value() && !video_encode_h_264_capabilities_.flags.Combine(caps.video_encode_h_264_capabilities_.flags.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH264CapabilitiesKHR::flags");
            result = false;
        }
        if (caps.video_encode_h_264_capabilities_.maxLevelIdc.limit.has_value() && !video_encode_h_264_capabilities_.maxLevelIdc.Combine(caps.video_encode_h_264_capabilities_.maxLevelIdc.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH264CapabilitiesKHR::maxLevelIdc");
            result = false;
        }
        if (caps.video_encode_h_264_capabilities_.maxSliceCount.limit.has_value() && !video_encode_h_264_capabilities_.maxSliceCount.Combine(caps.video_encode_h_264_capabilities_.maxSliceCount.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH264CapabilitiesKHR::maxSliceCount");
            result = false;
        }
        if (caps.video_encode_h_264_capabilities_.maxPPictureL0ReferenceCount.limit.has_value() && !video_encode_h_264_capabilities_.maxPPictureL0ReferenceCount.Combine(caps.video_encode_h_264_capabilities_.maxPPictureL0ReferenceCount.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH264CapabilitiesKHR::maxPPictureL0ReferenceCount");
            result = false;
        }
        if (caps.video_encode_h_264_capabilities_.maxBPictureL0ReferenceCount.limit.has_value() && !video_encode_h_264_capabilities_.maxBPictureL0ReferenceCount.Combine(caps.video_encode_h_264_capabilities_.maxBPictureL0ReferenceCount.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH264CapabilitiesKHR::maxBPictureL0ReferenceCount");
            result = false;
        }
        if (caps.video_encode_h_264_capabilities_.maxL1ReferenceCount.limit.has_value() && !video_encode_h_264_capabilities_.maxL1ReferenceCount.Combine(caps.video_encode_h_264_capabilities_.maxL1ReferenceCount.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH264CapabilitiesKHR::maxL1ReferenceCount");
            result = false;
        }
        if (caps.video_encode_h_264_capabilities_.maxTemporalLayerCount.limit.has_value() && !video_encode_h_264_capabilities_.maxTemporalLayerCount.Combine(caps.video_encode_h_264_capabilities_.maxTemporalLayerCount.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH264CapabilitiesKHR::maxTemporalLayerCount");
            result = false;
        }
        if (caps.video_encode_h_264_capabilities_.expectDyadicTemporalLayerPattern.limit.has_value() && !video_encode_h_264_capabilities_.expectDyadicTemporalLayerPattern.Combine(caps.video_encode_h_264_capabilities_.expectDyadicTemporalLayerPattern.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH264CapabilitiesKHR::expectDyadicTemporalLayerPattern");
            result = false;
        }
        if (caps.video_encode_h_264_capabilities_.minQp.limit.has_value() && !video_encode_h_264_capabilities_.minQp.Combine(caps.video_encode_h_264_capabilities_.minQp.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH264CapabilitiesKHR::minQp");
            result = false;
        }
        if (caps.video_encode_h_264_capabilities_.maxQp.limit.has_value() && !video_encode_h_264_capabilities_.maxQp.Combine(caps.video_encode_h_264_capabilities_.maxQp.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH264CapabilitiesKHR::maxQp");
            result = false;
        }
        if (caps.video_encode_h_264_capabilities_.prefersGopRemainingFrames.limit.has_value() && !video_encode_h_264_capabilities_.prefersGopRemainingFrames.Combine(caps.video_encode_h_264_capabilities_.prefersGopRemainingFrames.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH264CapabilitiesKHR::prefersGopRemainingFrames");
            result = false;
        }
        if (caps.video_encode_h_264_capabilities_.requiresGopRemainingFrames.limit.has_value() && !video_encode_h_264_capabilities_.requiresGopRemainingFrames.Combine(caps.video_encode_h_264_capabilities_.requiresGopRemainingFrames.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH264CapabilitiesKHR::requiresGopRemainingFrames");
            result = false;
        }
        if (caps.video_encode_h_264_capabilities_.stdSyntaxFlags.limit.has_value() && !video_encode_h_264_capabilities_.stdSyntaxFlags.Combine(caps.video_encode_h_264_capabilities_.stdSyntaxFlags.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH264CapabilitiesKHR::stdSyntaxFlags");
            result = false;
        }
        if (caps.video_encode_h_264_quantization_map_capabilities_.minQpDelta.limit.has_value() && !video_encode_h_264_quantization_map_capabilities_.minQpDelta.Combine(caps.video_encode_h_264_quantization_map_capabilities_.minQpDelta.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH264QuantizationMapCapabilitiesKHR::minQpDelta");
            result = false;
        }
        if (caps.video_encode_h_264_quantization_map_capabilities_.maxQpDelta.limit.has_value() && !video_encode_h_264_quantization_map_capabilities_.maxQpDelta.Combine(caps.video_encode_h_264_quantization_map_capabilities_.maxQpDelta.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH264QuantizationMapCapabilitiesKHR::maxQpDelta");
            result = false;
        }
        if (caps.video_encode_h_265_capabilities_.flags.limit.has_value() && !video_encode_h_265_capabilities_.flags.Combine(caps.video_encode_h_265_capabilities_.flags.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH265CapabilitiesKHR::flags");
            result = false;
        }
        if (caps.video_encode_h_265_capabilities_.maxLevelIdc.limit.has_value() && !video_encode_h_265_capabilities_.maxLevelIdc.Combine(caps.video_encode_h_265_capabilities_.maxLevelIdc.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH265CapabilitiesKHR::maxLevelIdc");
            result = false;
        }
        if (caps.video_encode_h_265_capabilities_.maxSliceSegmentCount.limit.has_value() && !video_encode_h_265_capabilities_.maxSliceSegmentCount.Combine(caps.video_encode_h_265_capabilities_.maxSliceSegmentCount.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH265CapabilitiesKHR::maxSliceSegmentCount");
            result = false;
        }
        if (caps.video_encode_h_265_capabilities_.maxTiles.width.limit.has_value() && !video_encode_h_265_capabilities_.maxTiles.width.Combine(caps.video_encode_h_265_capabilities_.maxTiles.width.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH265CapabilitiesKHR::VkExtent2D::width");
            result = false;
        }
        if (caps.video_encode_h_265_capabilities_.maxTiles.height.limit.has_value() && !video_encode_h_265_capabilities_.maxTiles.height.Combine(caps.video_encode_h_265_capabilities_.maxTiles.height.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH265CapabilitiesKHR::VkExtent2D::height");
            result = false;
        }
        if (caps.video_encode_h_265_capabilities_.ctbSizes.limit.has_value() && !video_encode_h_265_capabilities_.ctbSizes.Combine(caps.video_encode_h_265_capabilities_.ctbSizes.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH265CapabilitiesKHR::ctbSizes");
            result = false;
        }
        if (caps.video_encode_h_265_capabilities_.transformBlockSizes.limit.has_value() && !video_encode_h_265_capabilities_.transformBlockSizes.Combine(caps.video_encode_h_265_capabilities_.transformBlockSizes.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH265CapabilitiesKHR::transformBlockSizes");
            result = false;
        }
        if (caps.video_encode_h_265_capabilities_.maxPPictureL0ReferenceCount.limit.has_value() && !video_encode_h_265_capabilities_.maxPPictureL0ReferenceCount.Combine(caps.video_encode_h_265_capabilities_.maxPPictureL0ReferenceCount.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH265CapabilitiesKHR::maxPPictureL0ReferenceCount");
            result = false;
        }
        if (caps.video_encode_h_265_capabilities_.maxBPictureL0ReferenceCount.limit.has_value() && !video_encode_h_265_capabilities_.maxBPictureL0ReferenceCount.Combine(caps.video_encode_h_265_capabilities_.maxBPictureL0ReferenceCount.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH265CapabilitiesKHR::maxBPictureL0ReferenceCount");
            result = false;
        }
        if (caps.video_encode_h_265_capabilities_.maxL1ReferenceCount.limit.has_value() && !video_encode_h_265_capabilities_.maxL1ReferenceCount.Combine(caps.video_encode_h_265_capabilities_.maxL1ReferenceCount.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH265CapabilitiesKHR::maxL1ReferenceCount");
            result = false;
        }
        if (caps.video_encode_h_265_capabilities_.maxSubLayerCount.limit.has_value() && !video_encode_h_265_capabilities_.maxSubLayerCount.Combine(caps.video_encode_h_265_capabilities_.maxSubLayerCount.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH265CapabilitiesKHR::maxSubLayerCount");
            result = false;
        }
        if (caps.video_encode_h_265_capabilities_.expectDyadicTemporalSubLayerPattern.limit.has_value() && !video_encode_h_265_capabilities_.expectDyadicTemporalSubLayerPattern.Combine(caps.video_encode_h_265_capabilities_.expectDyadicTemporalSubLayerPattern.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH265CapabilitiesKHR::expectDyadicTemporalSubLayerPattern");
            result = false;
        }
        if (caps.video_encode_h_265_capabilities_.minQp.limit.has_value() && !video_encode_h_265_capabilities_.minQp.Combine(caps.video_encode_h_265_capabilities_.minQp.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH265CapabilitiesKHR::minQp");
            result = false;
        }
        if (caps.video_encode_h_265_capabilities_.maxQp.limit.has_value() && !video_encode_h_265_capabilities_.maxQp.Combine(caps.video_encode_h_265_capabilities_.maxQp.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH265CapabilitiesKHR::maxQp");
            result = false;
        }
        if (caps.video_encode_h_265_capabilities_.prefersGopRemainingFrames.limit.has_value() && !video_encode_h_265_capabilities_.prefersGopRemainingFrames.Combine(caps.video_encode_h_265_capabilities_.prefersGopRemainingFrames.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH265CapabilitiesKHR::prefersGopRemainingFrames");
            result = false;
        }
        if (caps.video_encode_h_265_capabilities_.requiresGopRemainingFrames.limit.has_value() && !video_encode_h_265_capabilities_.requiresGopRemainingFrames.Combine(caps.video_encode_h_265_capabilities_.requiresGopRemainingFrames.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH265CapabilitiesKHR::requiresGopRemainingFrames");
            result = false;
        }
        if (caps.video_encode_h_265_capabilities_.stdSyntaxFlags.limit.has_value() && !video_encode_h_265_capabilities_.stdSyntaxFlags.Combine(caps.video_encode_h_265_capabilities_.stdSyntaxFlags.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH265CapabilitiesKHR::stdSyntaxFlags");
            result = false;
        }
        if (caps.video_encode_h_265_quantization_map_capabilities_.minQpDelta.limit.has_value() && !video_encode_h_265_quantization_map_capabilities_.minQpDelta.Combine(caps.video_encode_h_265_quantization_map_capabilities_.minQpDelta.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH265QuantizationMapCapabilitiesKHR::minQpDelta");
            result = false;
        }
        if (caps.video_encode_h_265_quantization_map_capabilities_.maxQpDelta.limit.has_value() && !video_encode_h_265_quantization_map_capabilities_.maxQpDelta.Combine(caps.video_encode_h_265_quantization_map_capabilities_.maxQpDelta.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeH265QuantizationMapCapabilitiesKHR::maxQpDelta");
            result = false;
        }
        if (caps.video_encode_intra_refresh_capabilities_.intraRefreshModes.limit.has_value() && !video_encode_intra_refresh_capabilities_.intraRefreshModes.Combine(caps.video_encode_intra_refresh_capabilities_.intraRefreshModes.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeIntraRefreshCapabilitiesKHR::intraRefreshModes");
            result = false;
        }
        if (caps.video_encode_intra_refresh_capabilities_.maxIntraRefreshCycleDuration.limit.has_value() && !video_encode_intra_refresh_capabilities_.maxIntraRefreshCycleDuration.Combine(caps.video_encode_intra_refresh_capabilities_.maxIntraRefreshCycleDuration.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeIntraRefreshCapabilitiesKHR::maxIntraRefreshCycleDuration");
            result = false;
        }
        if (caps.video_encode_intra_refresh_capabilities_.maxIntraRefreshActiveReferencePictures.limit.has_value() && !video_encode_intra_refresh_capabilities_.maxIntraRefreshActiveReferencePictures.Combine(caps.video_encode_intra_refresh_capabilities_.maxIntraRefreshActiveReferencePictures.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeIntraRefreshCapabilitiesKHR::maxIntraRefreshActiveReferencePictures");
            result = false;
        }
        if (caps.video_encode_intra_refresh_capabilities_.partitionIndependentIntraRefreshRegions.limit.has_value() && !video_encode_intra_refresh_capabilities_.partitionIndependentIntraRefreshRegions.Combine(caps.video_encode_intra_refresh_capabilities_.partitionIndependentIntraRefreshRegions.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeIntraRefreshCapabilitiesKHR::partitionIndependentIntraRefreshRegions");
            result = false;
        }
        if (caps.video_encode_intra_refresh_capabilities_.nonRectangularIntraRefreshRegions.limit.has_value() && !video_encode_intra_refresh_capabilities_.nonRectangularIntraRefreshRegions.Combine(caps.video_encode_intra_refresh_capabilities_.nonRectangularIntraRefreshRegions.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeIntraRefreshCapabilitiesKHR::nonRectangularIntraRefreshRegions");
            result = false;
        }
        if (caps.video_encode_quantization_map_capabilities_.maxQuantizationMapExtent.width.limit.has_value() && !video_encode_quantization_map_capabilities_.maxQuantizationMapExtent.width.Combine(caps.video_encode_quantization_map_capabilities_.maxQuantizationMapExtent.width.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeQuantizationMapCapabilitiesKHR::VkExtent2D::width");
            result = false;
        }
        if (caps.video_encode_quantization_map_capabilities_.maxQuantizationMapExtent.height.limit.has_value() && !video_encode_quantization_map_capabilities_.maxQuantizationMapExtent.height.Combine(caps.video_encode_quantization_map_capabilities_.maxQuantizationMapExtent.height.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeQuantizationMapCapabilitiesKHR::VkExtent2D::height");
            result = false;
        }
        if (caps.video_encode_rgb_conversion_capabilities_.rgbModels.limit.has_value() && !video_encode_rgb_conversion_capabilities_.rgbModels.Combine(caps.video_encode_rgb_conversion_capabilities_.rgbModels.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeRgbConversionCapabilitiesVALVE::rgbModels");
            result = false;
        }
        if (caps.video_encode_rgb_conversion_capabilities_.rgbRanges.limit.has_value() && !video_encode_rgb_conversion_capabilities_.rgbRanges.Combine(caps.video_encode_rgb_conversion_capabilities_.rgbRanges.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeRgbConversionCapabilitiesVALVE::rgbRanges");
            result = false;
        }
        if (caps.video_encode_rgb_conversion_capabilities_.xChromaOffsets.limit.has_value() && !video_encode_rgb_conversion_capabilities_.xChromaOffsets.Combine(caps.video_encode_rgb_conversion_capabilities_.xChromaOffsets.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeRgbConversionCapabilitiesVALVE::xChromaOffsets");
            result = false;
        }
        if (caps.video_encode_rgb_conversion_capabilities_.yChromaOffsets.limit.has_value() && !video_encode_rgb_conversion_capabilities_.yChromaOffsets.Combine(caps.video_encode_rgb_conversion_capabilities_.yChromaOffsets.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoEncodeRgbConversionCapabilitiesVALVE::yChromaOffsets");
            result = false;
        }
        return result;
    }

    bool Override(ProfileLayerSettings *layer_settings, VideoCapabilitiesChain &caps, const char *name, bool enable_warnings) const {
        const char *warn_msg = "Simulating video capability %s that is not supported by the device for video profile '%s'\n";
        bool result = true;
        if (caps.video_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR) {
            if (!video_capabilities_.flags.Override(caps.video_capabilities_.flags)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoCapabilitiesKHR::flags", name);
                    result = false;
                }
            }
            if (!video_capabilities_.minBitstreamBufferOffsetAlignment.Override(caps.video_capabilities_.minBitstreamBufferOffsetAlignment)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoCapabilitiesKHR::minBitstreamBufferOffsetAlignment", name);
                    result = false;
                }
            }
            if (!video_capabilities_.minBitstreamBufferSizeAlignment.Override(caps.video_capabilities_.minBitstreamBufferSizeAlignment)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoCapabilitiesKHR::minBitstreamBufferSizeAlignment", name);
                    result = false;
                }
            }
            if (!video_capabilities_.pictureAccessGranularity.width.Override(caps.video_capabilities_.pictureAccessGranularity.width)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoCapabilitiesKHR::VkExtent2D::width", name);
                    result = false;
                }
            }
            if (!video_capabilities_.pictureAccessGranularity.height.Override(caps.video_capabilities_.pictureAccessGranularity.height)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoCapabilitiesKHR::VkExtent2D::height", name);
                    result = false;
                }
            }
            if (!video_capabilities_.minCodedExtent.width.Override(caps.video_capabilities_.minCodedExtent.width)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoCapabilitiesKHR::VkExtent2D::width", name);
                    result = false;
                }
            }
            if (!video_capabilities_.minCodedExtent.height.Override(caps.video_capabilities_.minCodedExtent.height)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoCapabilitiesKHR::VkExtent2D::height", name);
                    result = false;
                }
            }
            if (!video_capabilities_.maxCodedExtent.width.Override(caps.video_capabilities_.maxCodedExtent.width)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoCapabilitiesKHR::VkExtent2D::width", name);
                    result = false;
                }
            }
            if (!video_capabilities_.maxCodedExtent.height.Override(caps.video_capabilities_.maxCodedExtent.height)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoCapabilitiesKHR::VkExtent2D::height", name);
                    result = false;
                }
            }
            if (!video_capabilities_.maxDpbSlots.Override(caps.video_capabilities_.maxDpbSlots)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoCapabilitiesKHR::maxDpbSlots", name);
                    result = false;
                }
            }
            if (!video_capabilities_.maxActiveReferencePictures.Override(caps.video_capabilities_.maxActiveReferencePictures)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoCapabilitiesKHR::maxActiveReferencePictures", name);
                    result = false;
                }
            }
            if (video_capabilities_.stdHeaderVersion.extensionName.limit.has_value() && strncmp(video_capabilities_.stdHeaderVersion.extensionName.limit.value().c_str(), caps.video_capabilities_.stdHeaderVersion.extensionName, VK_MAX_EXTENSION_NAME_SIZE - 1) != 0) {
                memset(caps.video_capabilities_.stdHeaderVersion.extensionName, 0, VK_MAX_EXTENSION_NAME_SIZE - 1);
                strncpy(caps.video_capabilities_.stdHeaderVersion.extensionName, video_capabilities_.stdHeaderVersion.extensionName.limit.value().c_str(), VK_MAX_EXTENSION_NAME_SIZE - 1);
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoCapabilitiesKHR::stdHeaderVersion::extensionName", name);
                    result = false;
                }
            }
            if (!video_capabilities_.stdHeaderVersion.specVersion.Override(caps.video_capabilities_.stdHeaderVersion.specVersion)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoCapabilitiesKHR::VkExtensionProperties::specVersion", name);
                    result = false;
                }
            }
        }
        if (caps.video_decode_av_1_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_CAPABILITIES_KHR) {
            if (!video_decode_av_1_capabilities_.maxLevel.Override(caps.video_decode_av_1_capabilities_.maxLevel)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoDecodeAV1CapabilitiesKHR::maxLevel", name);
                    result = false;
                }
            }
        }
        if (caps.video_decode_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR) {
            if (!video_decode_capabilities_.flags.Override(caps.video_decode_capabilities_.flags)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoDecodeCapabilitiesKHR::flags", name);
                    result = false;
                }
            }
        }
        if (caps.video_decode_h_264_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR) {
            if (!video_decode_h_264_capabilities_.maxLevelIdc.Override(caps.video_decode_h_264_capabilities_.maxLevelIdc)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoDecodeH264CapabilitiesKHR::maxLevelIdc", name);
                    result = false;
                }
            }
            if (!video_decode_h_264_capabilities_.fieldOffsetGranularity.x.Override(caps.video_decode_h_264_capabilities_.fieldOffsetGranularity.x)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoDecodeH264CapabilitiesKHR::VkOffset2D::x", name);
                    result = false;
                }
            }
            if (!video_decode_h_264_capabilities_.fieldOffsetGranularity.y.Override(caps.video_decode_h_264_capabilities_.fieldOffsetGranularity.y)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoDecodeH264CapabilitiesKHR::VkOffset2D::y", name);
                    result = false;
                }
            }
        }
        if (caps.video_decode_h_265_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR) {
            if (!video_decode_h_265_capabilities_.maxLevelIdc.Override(caps.video_decode_h_265_capabilities_.maxLevelIdc)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoDecodeH265CapabilitiesKHR::maxLevelIdc", name);
                    result = false;
                }
            }
        }
        if (caps.video_decode_vp_9_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_VP9_CAPABILITIES_KHR) {
            if (!video_decode_vp_9_capabilities_.maxLevel.Override(caps.video_decode_vp_9_capabilities_.maxLevel)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoDecodeVP9CapabilitiesKHR::maxLevel", name);
                    result = false;
                }
            }
        }
        if (caps.video_encode_av_1_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_CAPABILITIES_KHR) {
            if (!video_encode_av_1_capabilities_.flags.Override(caps.video_encode_av_1_capabilities_.flags)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::flags", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.maxLevel.Override(caps.video_encode_av_1_capabilities_.maxLevel)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxLevel", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.codedPictureAlignment.width.Override(caps.video_encode_av_1_capabilities_.codedPictureAlignment.width)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::VkExtent2D::width", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.codedPictureAlignment.height.Override(caps.video_encode_av_1_capabilities_.codedPictureAlignment.height)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::VkExtent2D::height", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.maxTiles.width.Override(caps.video_encode_av_1_capabilities_.maxTiles.width)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::VkExtent2D::width", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.maxTiles.height.Override(caps.video_encode_av_1_capabilities_.maxTiles.height)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::VkExtent2D::height", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.minTileSize.width.Override(caps.video_encode_av_1_capabilities_.minTileSize.width)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::VkExtent2D::width", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.minTileSize.height.Override(caps.video_encode_av_1_capabilities_.minTileSize.height)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::VkExtent2D::height", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.maxTileSize.width.Override(caps.video_encode_av_1_capabilities_.maxTileSize.width)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::VkExtent2D::width", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.maxTileSize.height.Override(caps.video_encode_av_1_capabilities_.maxTileSize.height)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::VkExtent2D::height", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.superblockSizes.Override(caps.video_encode_av_1_capabilities_.superblockSizes)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::superblockSizes", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.maxSingleReferenceCount.Override(caps.video_encode_av_1_capabilities_.maxSingleReferenceCount)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxSingleReferenceCount", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.singleReferenceNameMask.Override(caps.video_encode_av_1_capabilities_.singleReferenceNameMask)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::singleReferenceNameMask", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.maxUnidirectionalCompoundReferenceCount.Override(caps.video_encode_av_1_capabilities_.maxUnidirectionalCompoundReferenceCount)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxUnidirectionalCompoundReferenceCount", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.maxUnidirectionalCompoundGroup1ReferenceCount.Override(caps.video_encode_av_1_capabilities_.maxUnidirectionalCompoundGroup1ReferenceCount)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxUnidirectionalCompoundGroup1ReferenceCount", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.unidirectionalCompoundReferenceNameMask.Override(caps.video_encode_av_1_capabilities_.unidirectionalCompoundReferenceNameMask)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::unidirectionalCompoundReferenceNameMask", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.maxBidirectionalCompoundReferenceCount.Override(caps.video_encode_av_1_capabilities_.maxBidirectionalCompoundReferenceCount)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxBidirectionalCompoundReferenceCount", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.maxBidirectionalCompoundGroup1ReferenceCount.Override(caps.video_encode_av_1_capabilities_.maxBidirectionalCompoundGroup1ReferenceCount)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxBidirectionalCompoundGroup1ReferenceCount", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.maxBidirectionalCompoundGroup2ReferenceCount.Override(caps.video_encode_av_1_capabilities_.maxBidirectionalCompoundGroup2ReferenceCount)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxBidirectionalCompoundGroup2ReferenceCount", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.bidirectionalCompoundReferenceNameMask.Override(caps.video_encode_av_1_capabilities_.bidirectionalCompoundReferenceNameMask)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::bidirectionalCompoundReferenceNameMask", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.maxTemporalLayerCount.Override(caps.video_encode_av_1_capabilities_.maxTemporalLayerCount)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxTemporalLayerCount", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.maxSpatialLayerCount.Override(caps.video_encode_av_1_capabilities_.maxSpatialLayerCount)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxSpatialLayerCount", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.maxOperatingPoints.Override(caps.video_encode_av_1_capabilities_.maxOperatingPoints)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxOperatingPoints", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.minQIndex.Override(caps.video_encode_av_1_capabilities_.minQIndex)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::minQIndex", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.maxQIndex.Override(caps.video_encode_av_1_capabilities_.maxQIndex)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::maxQIndex", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.prefersGopRemainingFrames.Override(caps.video_encode_av_1_capabilities_.prefersGopRemainingFrames)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::prefersGopRemainingFrames", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.requiresGopRemainingFrames.Override(caps.video_encode_av_1_capabilities_.requiresGopRemainingFrames)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::requiresGopRemainingFrames", name);
                    result = false;
                }
            }
            if (!video_encode_av_1_capabilities_.stdSyntaxFlags.Override(caps.video_encode_av_1_capabilities_.stdSyntaxFlags)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeAV1CapabilitiesKHR::stdSyntaxFlags", name);
                    result = false;
                }
            }
        }
        if (caps.video_encode_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR) {
            if (!video_encode_capabilities_.flags.Override(caps.video_encode_capabilities_.flags)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeCapabilitiesKHR::flags", name);
                    result = false;
                }
            }
            if (!video_encode_capabilities_.rateControlModes.Override(caps.video_encode_capabilities_.rateControlModes)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeCapabilitiesKHR::rateControlModes", name);
                    result = false;
                }
            }
            if (!video_encode_capabilities_.maxRateControlLayers.Override(caps.video_encode_capabilities_.maxRateControlLayers)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeCapabilitiesKHR::maxRateControlLayers", name);
                    result = false;
                }
            }
            if (!video_encode_capabilities_.maxBitrate.Override(caps.video_encode_capabilities_.maxBitrate)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeCapabilitiesKHR::maxBitrate", name);
                    result = false;
                }
            }
            if (!video_encode_capabilities_.maxQualityLevels.Override(caps.video_encode_capabilities_.maxQualityLevels)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeCapabilitiesKHR::maxQualityLevels", name);
                    result = false;
                }
            }
            if (!video_encode_capabilities_.encodeInputPictureGranularity.width.Override(caps.video_encode_capabilities_.encodeInputPictureGranularity.width)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeCapabilitiesKHR::VkExtent2D::width", name);
                    result = false;
                }
            }
            if (!video_encode_capabilities_.encodeInputPictureGranularity.height.Override(caps.video_encode_capabilities_.encodeInputPictureGranularity.height)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeCapabilitiesKHR::VkExtent2D::height", name);
                    result = false;
                }
            }
            if (!video_encode_capabilities_.supportedEncodeFeedbackFlags.Override(caps.video_encode_capabilities_.supportedEncodeFeedbackFlags)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeCapabilitiesKHR::supportedEncodeFeedbackFlags", name);
                    result = false;
                }
            }
        }
        if (caps.video_encode_feedback_2_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_FEEDBACK_2_CAPABILITIES_KHR) {
            if (!video_encode_feedback_2_capabilities_.maxPerPartitionFeedbackEntries.Override(caps.video_encode_feedback_2_capabilities_.maxPerPartitionFeedbackEntries)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeFeedback2CapabilitiesKHR::maxPerPartitionFeedbackEntries", name);
                    result = false;
                }
            }
            if (!video_encode_feedback_2_capabilities_.supportedPerPartitionEncodeFeedbackFlags.Override(caps.video_encode_feedback_2_capabilities_.supportedPerPartitionEncodeFeedbackFlags)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeFeedback2CapabilitiesKHR::supportedPerPartitionEncodeFeedbackFlags", name);
                    result = false;
                }
            }
        }
        if (caps.video_encode_h_264_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_KHR) {
            if (!video_encode_h_264_capabilities_.flags.Override(caps.video_encode_h_264_capabilities_.flags)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH264CapabilitiesKHR::flags", name);
                    result = false;
                }
            }
            if (!video_encode_h_264_capabilities_.maxLevelIdc.Override(caps.video_encode_h_264_capabilities_.maxLevelIdc)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH264CapabilitiesKHR::maxLevelIdc", name);
                    result = false;
                }
            }
            if (!video_encode_h_264_capabilities_.maxSliceCount.Override(caps.video_encode_h_264_capabilities_.maxSliceCount)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH264CapabilitiesKHR::maxSliceCount", name);
                    result = false;
                }
            }
            if (!video_encode_h_264_capabilities_.maxPPictureL0ReferenceCount.Override(caps.video_encode_h_264_capabilities_.maxPPictureL0ReferenceCount)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH264CapabilitiesKHR::maxPPictureL0ReferenceCount", name);
                    result = false;
                }
            }
            if (!video_encode_h_264_capabilities_.maxBPictureL0ReferenceCount.Override(caps.video_encode_h_264_capabilities_.maxBPictureL0ReferenceCount)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH264CapabilitiesKHR::maxBPictureL0ReferenceCount", name);
                    result = false;
                }
            }
            if (!video_encode_h_264_capabilities_.maxL1ReferenceCount.Override(caps.video_encode_h_264_capabilities_.maxL1ReferenceCount)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH264CapabilitiesKHR::maxL1ReferenceCount", name);
                    result = false;
                }
            }
            if (!video_encode_h_264_capabilities_.maxTemporalLayerCount.Override(caps.video_encode_h_264_capabilities_.maxTemporalLayerCount)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH264CapabilitiesKHR::maxTemporalLayerCount", name);
                    result = false;
                }
            }
            if (!video_encode_h_264_capabilities_.expectDyadicTemporalLayerPattern.Override(caps.video_encode_h_264_capabilities_.expectDyadicTemporalLayerPattern)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH264CapabilitiesKHR::expectDyadicTemporalLayerPattern", name);
                    result = false;
                }
            }
            if (!video_encode_h_264_capabilities_.minQp.Override(caps.video_encode_h_264_capabilities_.minQp)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH264CapabilitiesKHR::minQp", name);
                    result = false;
                }
            }
            if (!video_encode_h_264_capabilities_.maxQp.Override(caps.video_encode_h_264_capabilities_.maxQp)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH264CapabilitiesKHR::maxQp", name);
                    result = false;
                }
            }
            if (!video_encode_h_264_capabilities_.prefersGopRemainingFrames.Override(caps.video_encode_h_264_capabilities_.prefersGopRemainingFrames)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH264CapabilitiesKHR::prefersGopRemainingFrames", name);
                    result = false;
                }
            }
            if (!video_encode_h_264_capabilities_.requiresGopRemainingFrames.Override(caps.video_encode_h_264_capabilities_.requiresGopRemainingFrames)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH264CapabilitiesKHR::requiresGopRemainingFrames", name);
                    result = false;
                }
            }
            if (!video_encode_h_264_capabilities_.stdSyntaxFlags.Override(caps.video_encode_h_264_capabilities_.stdSyntaxFlags)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH264CapabilitiesKHR::stdSyntaxFlags", name);
                    result = false;
                }
            }
        }
        if (caps.video_encode_h_264_quantization_map_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_QUANTIZATION_MAP_CAPABILITIES_KHR) {
            if (!video_encode_h_264_quantization_map_capabilities_.minQpDelta.Override(caps.video_encode_h_264_quantization_map_capabilities_.minQpDelta)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH264QuantizationMapCapabilitiesKHR::minQpDelta", name);
                    result = false;
                }
            }
            if (!video_encode_h_264_quantization_map_capabilities_.maxQpDelta.Override(caps.video_encode_h_264_quantization_map_capabilities_.maxQpDelta)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH264QuantizationMapCapabilitiesKHR::maxQpDelta", name);
                    result = false;
                }
            }
        }
        if (caps.video_encode_h_265_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_KHR) {
            if (!video_encode_h_265_capabilities_.flags.Override(caps.video_encode_h_265_capabilities_.flags)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH265CapabilitiesKHR::flags", name);
                    result = false;
                }
            }
            if (!video_encode_h_265_capabilities_.maxLevelIdc.Override(caps.video_encode_h_265_capabilities_.maxLevelIdc)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH265CapabilitiesKHR::maxLevelIdc", name);
                    result = false;
                }
            }
            if (!video_encode_h_265_capabilities_.maxSliceSegmentCount.Override(caps.video_encode_h_265_capabilities_.maxSliceSegmentCount)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH265CapabilitiesKHR::maxSliceSegmentCount", name);
                    result = false;
                }
            }
            if (!video_encode_h_265_capabilities_.maxTiles.width.Override(caps.video_encode_h_265_capabilities_.maxTiles.width)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH265CapabilitiesKHR::VkExtent2D::width", name);
                    result = false;
                }
            }
            if (!video_encode_h_265_capabilities_.maxTiles.height.Override(caps.video_encode_h_265_capabilities_.maxTiles.height)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH265CapabilitiesKHR::VkExtent2D::height", name);
                    result = false;
                }
            }
            if (!video_encode_h_265_capabilities_.ctbSizes.Override(caps.video_encode_h_265_capabilities_.ctbSizes)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH265CapabilitiesKHR::ctbSizes", name);
                    result = false;
                }
            }
            if (!video_encode_h_265_capabilities_.transformBlockSizes.Override(caps.video_encode_h_265_capabilities_.transformBlockSizes)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH265CapabilitiesKHR::transformBlockSizes", name);
                    result = false;
                }
            }
            if (!video_encode_h_265_capabilities_.maxPPictureL0ReferenceCount.Override(caps.video_encode_h_265_capabilities_.maxPPictureL0ReferenceCount)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH265CapabilitiesKHR::maxPPictureL0ReferenceCount", name);
                    result = false;
                }
            }
            if (!video_encode_h_265_capabilities_.maxBPictureL0ReferenceCount.Override(caps.video_encode_h_265_capabilities_.maxBPictureL0ReferenceCount)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH265CapabilitiesKHR::maxBPictureL0ReferenceCount", name);
                    result = false;
                }
            }
            if (!video_encode_h_265_capabilities_.maxL1ReferenceCount.Override(caps.video_encode_h_265_capabilities_.maxL1ReferenceCount)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH265CapabilitiesKHR::maxL1ReferenceCount", name);
                    result = false;
                }
            }
            if (!video_encode_h_265_capabilities_.maxSubLayerCount.Override(caps.video_encode_h_265_capabilities_.maxSubLayerCount)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH265CapabilitiesKHR::maxSubLayerCount", name);
                    result = false;
                }
            }
            if (!video_encode_h_265_capabilities_.expectDyadicTemporalSubLayerPattern.Override(caps.video_encode_h_265_capabilities_.expectDyadicTemporalSubLayerPattern)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH265CapabilitiesKHR::expectDyadicTemporalSubLayerPattern", name);
                    result = false;
                }
            }
            if (!video_encode_h_265_capabilities_.minQp.Override(caps.video_encode_h_265_capabilities_.minQp)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH265CapabilitiesKHR::minQp", name);
                    result = false;
                }
            }
            if (!video_encode_h_265_capabilities_.maxQp.Override(caps.video_encode_h_265_capabilities_.maxQp)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH265CapabilitiesKHR::maxQp", name);
                    result = false;
                }
            }
            if (!video_encode_h_265_capabilities_.prefersGopRemainingFrames.Override(caps.video_encode_h_265_capabilities_.prefersGopRemainingFrames)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH265CapabilitiesKHR::prefersGopRemainingFrames", name);
                    result = false;
                }
            }
            if (!video_encode_h_265_capabilities_.requiresGopRemainingFrames.Override(caps.video_encode_h_265_capabilities_.requiresGopRemainingFrames)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH265CapabilitiesKHR::requiresGopRemainingFrames", name);
                    result = false;
                }
            }
            if (!video_encode_h_265_capabilities_.stdSyntaxFlags.Override(caps.video_encode_h_265_capabilities_.stdSyntaxFlags)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH265CapabilitiesKHR::stdSyntaxFlags", name);
                    result = false;
                }
            }
        }
        if (caps.video_encode_h_265_quantization_map_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_QUANTIZATION_MAP_CAPABILITIES_KHR) {
            if (!video_encode_h_265_quantization_map_capabilities_.minQpDelta.Override(caps.video_encode_h_265_quantization_map_capabilities_.minQpDelta)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH265QuantizationMapCapabilitiesKHR::minQpDelta", name);
                    result = false;
                }
            }
            if (!video_encode_h_265_quantization_map_capabilities_.maxQpDelta.Override(caps.video_encode_h_265_quantization_map_capabilities_.maxQpDelta)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeH265QuantizationMapCapabilitiesKHR::maxQpDelta", name);
                    result = false;
                }
            }
        }
        if (caps.video_encode_intra_refresh_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_INTRA_REFRESH_CAPABILITIES_KHR) {
            if (!video_encode_intra_refresh_capabilities_.intraRefreshModes.Override(caps.video_encode_intra_refresh_capabilities_.intraRefreshModes)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeIntraRefreshCapabilitiesKHR::intraRefreshModes", name);
                    result = false;
                }
            }
            if (!video_encode_intra_refresh_capabilities_.maxIntraRefreshCycleDuration.Override(caps.video_encode_intra_refresh_capabilities_.maxIntraRefreshCycleDuration)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeIntraRefreshCapabilitiesKHR::maxIntraRefreshCycleDuration", name);
                    result = false;
                }
            }
            if (!video_encode_intra_refresh_capabilities_.maxIntraRefreshActiveReferencePictures.Override(caps.video_encode_intra_refresh_capabilities_.maxIntraRefreshActiveReferencePictures)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeIntraRefreshCapabilitiesKHR::maxIntraRefreshActiveReferencePictures", name);
                    result = false;
                }
            }
            if (!video_encode_intra_refresh_capabilities_.partitionIndependentIntraRefreshRegions.Override(caps.video_encode_intra_refresh_capabilities_.partitionIndependentIntraRefreshRegions)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeIntraRefreshCapabilitiesKHR::partitionIndependentIntraRefreshRegions", name);
                    result = false;
                }
            }
            if (!video_encode_intra_refresh_capabilities_.nonRectangularIntraRefreshRegions.Override(caps.video_encode_intra_refresh_capabilities_.nonRectangularIntraRefreshRegions)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeIntraRefreshCapabilitiesKHR::nonRectangularIntraRefreshRegions", name);
                    result = false;
                }
            }
        }
        if (caps.video_encode_quantization_map_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUANTIZATION_MAP_CAPABILITIES_KHR) {
            if (!video_encode_quantization_map_capabilities_.maxQuantizationMapExtent.width.Override(caps.video_encode_quantization_map_capabilities_.maxQuantizationMapExtent.width)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeQuantizationMapCapabilitiesKHR::VkExtent2D::width", name);
                    result = false;
                }
            }
            if (!video_encode_quantization_map_capabilities_.maxQuantizationMapExtent.height.Override(caps.video_encode_quantization_map_capabilities_.maxQuantizationMapExtent.height)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeQuantizationMapCapabilitiesKHR::VkExtent2D::height", name);
                    result = false;
                }
            }
        }
        if (caps.video_encode_rgb_conversion_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_RGB_CONVERSION_CAPABILITIES_VALVE) {
            if (!video_encode_rgb_conversion_capabilities_.rgbModels.Override(caps.video_encode_rgb_conversion_capabilities_.rgbModels)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeRgbConversionCapabilitiesVALVE::rgbModels", name);
                    result = false;
                }
            }
            if (!video_encode_rgb_conversion_capabilities_.rgbRanges.Override(caps.video_encode_rgb_conversion_capabilities_.rgbRanges)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeRgbConversionCapabilitiesVALVE::rgbRanges", name);
                    result = false;
                }
            }
            if (!video_encode_rgb_conversion_capabilities_.xChromaOffsets.Override(caps.video_encode_rgb_conversion_capabilities_.xChromaOffsets)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeRgbConversionCapabilitiesVALVE::xChromaOffsets", name);
                    result = false;
                }
            }
            if (!video_encode_rgb_conversion_capabilities_.yChromaOffsets.Override(caps.video_encode_rgb_conversion_capabilities_.yChromaOffsets)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoEncodeRgbConversionCapabilitiesVALVE::yChromaOffsets", name);
                    result = false;
                }
            }
        }
        return result;
    }

    void CopyTo(VideoCapabilitiesChain &caps) const {
        if (caps.video_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR) {
            caps.video_capabilities_ = {caps.video_capabilities_.sType, caps.video_capabilities_.pNext};
            if (video_capabilities_.flags.limit.has_value()) caps.video_capabilities_.flags = video_capabilities_.flags.limit.value();
            if (video_capabilities_.minBitstreamBufferOffsetAlignment.limit.has_value()) caps.video_capabilities_.minBitstreamBufferOffsetAlignment = video_capabilities_.minBitstreamBufferOffsetAlignment.limit.value();
            if (video_capabilities_.minBitstreamBufferSizeAlignment.limit.has_value()) caps.video_capabilities_.minBitstreamBufferSizeAlignment = video_capabilities_.minBitstreamBufferSizeAlignment.limit.value();
            if (video_capabilities_.pictureAccessGranularity.width.limit.has_value()) caps.video_capabilities_.pictureAccessGranularity.width = video_capabilities_.pictureAccessGranularity.width.limit.value();
            if (video_capabilities_.pictureAccessGranularity.height.limit.has_value()) caps.video_capabilities_.pictureAccessGranularity.height = video_capabilities_.pictureAccessGranularity.height.limit.value();
            if (video_capabilities_.minCodedExtent.width.limit.has_value()) caps.video_capabilities_.minCodedExtent.width = video_capabilities_.minCodedExtent.width.limit.value();
            if (video_capabilities_.minCodedExtent.height.limit.has_value()) caps.video_capabilities_.minCodedExtent.height = video_capabilities_.minCodedExtent.height.limit.value();
            if (video_capabilities_.maxCodedExtent.width.limit.has_value()) caps.video_capabilities_.maxCodedExtent.width = video_capabilities_.maxCodedExtent.width.limit.value();
            if (video_capabilities_.maxCodedExtent.height.limit.has_value()) caps.video_capabilities_.maxCodedExtent.height = video_capabilities_.maxCodedExtent.height.limit.value();
            if (video_capabilities_.maxDpbSlots.limit.has_value()) caps.video_capabilities_.maxDpbSlots = video_capabilities_.maxDpbSlots.limit.value();
            if (video_capabilities_.maxActiveReferencePictures.limit.has_value()) caps.video_capabilities_.maxActiveReferencePictures = video_capabilities_.maxActiveReferencePictures.limit.value();
            if (video_capabilities_.stdHeaderVersion.extensionName.limit.has_value()) {
                memset(caps.video_capabilities_.stdHeaderVersion.extensionName, 0, VK_MAX_EXTENSION_NAME_SIZE - 1);
                strncpy(caps.video_capabilities_.stdHeaderVersion.extensionName, video_capabilities_.stdHeaderVersion.extensionName.limit.value().c_str(), VK_MAX_EXTENSION_NAME_SIZE - 1);
            }
            if (video_capabilities_.stdHeaderVersion.specVersion.limit.has_value()) caps.video_capabilities_.stdHeaderVersion.specVersion = video_capabilities_.stdHeaderVersion.specVersion.limit.value();
        }
        if (caps.video_decode_av_1_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_CAPABILITIES_KHR) {
            caps.video_decode_av_1_capabilities_ = {caps.video_decode_av_1_capabilities_.sType, caps.video_decode_av_1_capabilities_.pNext};
            if (video_decode_av_1_capabilities_.maxLevel.limit.has_value()) caps.video_decode_av_1_capabilities_.maxLevel = video_decode_av_1_capabilities_.maxLevel.limit.value();
        }
        if (caps.video_decode_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR) {
            caps.video_decode_capabilities_ = {caps.video_decode_capabilities_.sType, caps.video_decode_capabilities_.pNext};
            if (video_decode_capabilities_.flags.limit.has_value()) caps.video_decode_capabilities_.flags = video_decode_capabilities_.flags.limit.value();
        }
        if (caps.video_decode_h_264_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR) {
            caps.video_decode_h_264_capabilities_ = {caps.video_decode_h_264_capabilities_.sType, caps.video_decode_h_264_capabilities_.pNext};
            if (video_decode_h_264_capabilities_.maxLevelIdc.limit.has_value()) caps.video_decode_h_264_capabilities_.maxLevelIdc = video_decode_h_264_capabilities_.maxLevelIdc.limit.value();
            if (video_decode_h_264_capabilities_.fieldOffsetGranularity.x.limit.has_value()) caps.video_decode_h_264_capabilities_.fieldOffsetGranularity.x = video_decode_h_264_capabilities_.fieldOffsetGranularity.x.limit.value();
            if (video_decode_h_264_capabilities_.fieldOffsetGranularity.y.limit.has_value()) caps.video_decode_h_264_capabilities_.fieldOffsetGranularity.y = video_decode_h_264_capabilities_.fieldOffsetGranularity.y.limit.value();
        }
        if (caps.video_decode_h_265_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR) {
            caps.video_decode_h_265_capabilities_ = {caps.video_decode_h_265_capabilities_.sType, caps.video_decode_h_265_capabilities_.pNext};
            if (video_decode_h_265_capabilities_.maxLevelIdc.limit.has_value()) caps.video_decode_h_265_capabilities_.maxLevelIdc = video_decode_h_265_capabilities_.maxLevelIdc.limit.value();
        }
        if (caps.video_decode_vp_9_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_DECODE_VP9_CAPABILITIES_KHR) {
            caps.video_decode_vp_9_capabilities_ = {caps.video_decode_vp_9_capabilities_.sType, caps.video_decode_vp_9_capabilities_.pNext};
            if (video_decode_vp_9_capabilities_.maxLevel.limit.has_value()) caps.video_decode_vp_9_capabilities_.maxLevel = video_decode_vp_9_capabilities_.maxLevel.limit.value();
        }
        if (caps.video_encode_av_1_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_CAPABILITIES_KHR) {
            caps.video_encode_av_1_capabilities_ = {caps.video_encode_av_1_capabilities_.sType, caps.video_encode_av_1_capabilities_.pNext};
            if (video_encode_av_1_capabilities_.flags.limit.has_value()) caps.video_encode_av_1_capabilities_.flags = video_encode_av_1_capabilities_.flags.limit.value();
            if (video_encode_av_1_capabilities_.maxLevel.limit.has_value()) caps.video_encode_av_1_capabilities_.maxLevel = video_encode_av_1_capabilities_.maxLevel.limit.value();
            if (video_encode_av_1_capabilities_.codedPictureAlignment.width.limit.has_value()) caps.video_encode_av_1_capabilities_.codedPictureAlignment.width = video_encode_av_1_capabilities_.codedPictureAlignment.width.limit.value();
            if (video_encode_av_1_capabilities_.codedPictureAlignment.height.limit.has_value()) caps.video_encode_av_1_capabilities_.codedPictureAlignment.height = video_encode_av_1_capabilities_.codedPictureAlignment.height.limit.value();
            if (video_encode_av_1_capabilities_.maxTiles.width.limit.has_value()) caps.video_encode_av_1_capabilities_.maxTiles.width = video_encode_av_1_capabilities_.maxTiles.width.limit.value();
            if (video_encode_av_1_capabilities_.maxTiles.height.limit.has_value()) caps.video_encode_av_1_capabilities_.maxTiles.height = video_encode_av_1_capabilities_.maxTiles.height.limit.value();
            if (video_encode_av_1_capabilities_.minTileSize.width.limit.has_value()) caps.video_encode_av_1_capabilities_.minTileSize.width = video_encode_av_1_capabilities_.minTileSize.width.limit.value();
            if (video_encode_av_1_capabilities_.minTileSize.height.limit.has_value()) caps.video_encode_av_1_capabilities_.minTileSize.height = video_encode_av_1_capabilities_.minTileSize.height.limit.value();
            if (video_encode_av_1_capabilities_.maxTileSize.width.limit.has_value()) caps.video_encode_av_1_capabilities_.maxTileSize.width = video_encode_av_1_capabilities_.maxTileSize.width.limit.value();
            if (video_encode_av_1_capabilities_.maxTileSize.height.limit.has_value()) caps.video_encode_av_1_capabilities_.maxTileSize.height = video_encode_av_1_capabilities_.maxTileSize.height.limit.value();
            if (video_encode_av_1_capabilities_.superblockSizes.limit.has_value()) caps.video_encode_av_1_capabilities_.superblockSizes = video_encode_av_1_capabilities_.superblockSizes.limit.value();
            if (video_encode_av_1_capabilities_.maxSingleReferenceCount.limit.has_value()) caps.video_encode_av_1_capabilities_.maxSingleReferenceCount = video_encode_av_1_capabilities_.maxSingleReferenceCount.limit.value();
            if (video_encode_av_1_capabilities_.singleReferenceNameMask.limit.has_value()) caps.video_encode_av_1_capabilities_.singleReferenceNameMask = video_encode_av_1_capabilities_.singleReferenceNameMask.limit.value();
            if (video_encode_av_1_capabilities_.maxUnidirectionalCompoundReferenceCount.limit.has_value()) caps.video_encode_av_1_capabilities_.maxUnidirectionalCompoundReferenceCount = video_encode_av_1_capabilities_.maxUnidirectionalCompoundReferenceCount.limit.value();
            if (video_encode_av_1_capabilities_.maxUnidirectionalCompoundGroup1ReferenceCount.limit.has_value()) caps.video_encode_av_1_capabilities_.maxUnidirectionalCompoundGroup1ReferenceCount = video_encode_av_1_capabilities_.maxUnidirectionalCompoundGroup1ReferenceCount.limit.value();
            if (video_encode_av_1_capabilities_.unidirectionalCompoundReferenceNameMask.limit.has_value()) caps.video_encode_av_1_capabilities_.unidirectionalCompoundReferenceNameMask = video_encode_av_1_capabilities_.unidirectionalCompoundReferenceNameMask.limit.value();
            if (video_encode_av_1_capabilities_.maxBidirectionalCompoundReferenceCount.limit.has_value()) caps.video_encode_av_1_capabilities_.maxBidirectionalCompoundReferenceCount = video_encode_av_1_capabilities_.maxBidirectionalCompoundReferenceCount.limit.value();
            if (video_encode_av_1_capabilities_.maxBidirectionalCompoundGroup1ReferenceCount.limit.has_value()) caps.video_encode_av_1_capabilities_.maxBidirectionalCompoundGroup1ReferenceCount = video_encode_av_1_capabilities_.maxBidirectionalCompoundGroup1ReferenceCount.limit.value();
            if (video_encode_av_1_capabilities_.maxBidirectionalCompoundGroup2ReferenceCount.limit.has_value()) caps.video_encode_av_1_capabilities_.maxBidirectionalCompoundGroup2ReferenceCount = video_encode_av_1_capabilities_.maxBidirectionalCompoundGroup2ReferenceCount.limit.value();
            if (video_encode_av_1_capabilities_.bidirectionalCompoundReferenceNameMask.limit.has_value()) caps.video_encode_av_1_capabilities_.bidirectionalCompoundReferenceNameMask = video_encode_av_1_capabilities_.bidirectionalCompoundReferenceNameMask.limit.value();
            if (video_encode_av_1_capabilities_.maxTemporalLayerCount.limit.has_value()) caps.video_encode_av_1_capabilities_.maxTemporalLayerCount = video_encode_av_1_capabilities_.maxTemporalLayerCount.limit.value();
            if (video_encode_av_1_capabilities_.maxSpatialLayerCount.limit.has_value()) caps.video_encode_av_1_capabilities_.maxSpatialLayerCount = video_encode_av_1_capabilities_.maxSpatialLayerCount.limit.value();
            if (video_encode_av_1_capabilities_.maxOperatingPoints.limit.has_value()) caps.video_encode_av_1_capabilities_.maxOperatingPoints = video_encode_av_1_capabilities_.maxOperatingPoints.limit.value();
            if (video_encode_av_1_capabilities_.minQIndex.limit.has_value()) caps.video_encode_av_1_capabilities_.minQIndex = video_encode_av_1_capabilities_.minQIndex.limit.value();
            if (video_encode_av_1_capabilities_.maxQIndex.limit.has_value()) caps.video_encode_av_1_capabilities_.maxQIndex = video_encode_av_1_capabilities_.maxQIndex.limit.value();
            if (video_encode_av_1_capabilities_.prefersGopRemainingFrames.limit.has_value()) caps.video_encode_av_1_capabilities_.prefersGopRemainingFrames = video_encode_av_1_capabilities_.prefersGopRemainingFrames.limit.value();
            if (video_encode_av_1_capabilities_.requiresGopRemainingFrames.limit.has_value()) caps.video_encode_av_1_capabilities_.requiresGopRemainingFrames = video_encode_av_1_capabilities_.requiresGopRemainingFrames.limit.value();
            if (video_encode_av_1_capabilities_.stdSyntaxFlags.limit.has_value()) caps.video_encode_av_1_capabilities_.stdSyntaxFlags = video_encode_av_1_capabilities_.stdSyntaxFlags.limit.value();
        }
        if (caps.video_encode_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR) {
            caps.video_encode_capabilities_ = {caps.video_encode_capabilities_.sType, caps.video_encode_capabilities_.pNext};
            if (video_encode_capabilities_.flags.limit.has_value()) caps.video_encode_capabilities_.flags = video_encode_capabilities_.flags.limit.value();
            if (video_encode_capabilities_.rateControlModes.limit.has_value()) caps.video_encode_capabilities_.rateControlModes = video_encode_capabilities_.rateControlModes.limit.value();
            if (video_encode_capabilities_.maxRateControlLayers.limit.has_value()) caps.video_encode_capabilities_.maxRateControlLayers = video_encode_capabilities_.maxRateControlLayers.limit.value();
            if (video_encode_capabilities_.maxBitrate.limit.has_value()) caps.video_encode_capabilities_.maxBitrate = video_encode_capabilities_.maxBitrate.limit.value();
            if (video_encode_capabilities_.maxQualityLevels.limit.has_value()) caps.video_encode_capabilities_.maxQualityLevels = video_encode_capabilities_.maxQualityLevels.limit.value();
            if (video_encode_capabilities_.encodeInputPictureGranularity.width.limit.has_value()) caps.video_encode_capabilities_.encodeInputPictureGranularity.width = video_encode_capabilities_.encodeInputPictureGranularity.width.limit.value();
            if (video_encode_capabilities_.encodeInputPictureGranularity.height.limit.has_value()) caps.video_encode_capabilities_.encodeInputPictureGranularity.height = video_encode_capabilities_.encodeInputPictureGranularity.height.limit.value();
            if (video_encode_capabilities_.supportedEncodeFeedbackFlags.limit.has_value()) caps.video_encode_capabilities_.supportedEncodeFeedbackFlags = video_encode_capabilities_.supportedEncodeFeedbackFlags.limit.value();
        }
        if (caps.video_encode_feedback_2_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_FEEDBACK_2_CAPABILITIES_KHR) {
            caps.video_encode_feedback_2_capabilities_ = {caps.video_encode_feedback_2_capabilities_.sType, caps.video_encode_feedback_2_capabilities_.pNext};
            if (video_encode_feedback_2_capabilities_.maxPerPartitionFeedbackEntries.limit.has_value()) caps.video_encode_feedback_2_capabilities_.maxPerPartitionFeedbackEntries = video_encode_feedback_2_capabilities_.maxPerPartitionFeedbackEntries.limit.value();
            if (video_encode_feedback_2_capabilities_.supportedPerPartitionEncodeFeedbackFlags.limit.has_value()) caps.video_encode_feedback_2_capabilities_.supportedPerPartitionEncodeFeedbackFlags = video_encode_feedback_2_capabilities_.supportedPerPartitionEncodeFeedbackFlags.limit.value();
        }
        if (caps.video_encode_h_264_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_KHR) {
            caps.video_encode_h_264_capabilities_ = {caps.video_encode_h_264_capabilities_.sType, caps.video_encode_h_264_capabilities_.pNext};
            if (video_encode_h_264_capabilities_.flags.limit.has_value()) caps.video_encode_h_264_capabilities_.flags = video_encode_h_264_capabilities_.flags.limit.value();
            if (video_encode_h_264_capabilities_.maxLevelIdc.limit.has_value()) caps.video_encode_h_264_capabilities_.maxLevelIdc = video_encode_h_264_capabilities_.maxLevelIdc.limit.value();
            if (video_encode_h_264_capabilities_.maxSliceCount.limit.has_value()) caps.video_encode_h_264_capabilities_.maxSliceCount = video_encode_h_264_capabilities_.maxSliceCount.limit.value();
            if (video_encode_h_264_capabilities_.maxPPictureL0ReferenceCount.limit.has_value()) caps.video_encode_h_264_capabilities_.maxPPictureL0ReferenceCount = video_encode_h_264_capabilities_.maxPPictureL0ReferenceCount.limit.value();
            if (video_encode_h_264_capabilities_.maxBPictureL0ReferenceCount.limit.has_value()) caps.video_encode_h_264_capabilities_.maxBPictureL0ReferenceCount = video_encode_h_264_capabilities_.maxBPictureL0ReferenceCount.limit.value();
            if (video_encode_h_264_capabilities_.maxL1ReferenceCount.limit.has_value()) caps.video_encode_h_264_capabilities_.maxL1ReferenceCount = video_encode_h_264_capabilities_.maxL1ReferenceCount.limit.value();
            if (video_encode_h_264_capabilities_.maxTemporalLayerCount.limit.has_value()) caps.video_encode_h_264_capabilities_.maxTemporalLayerCount = video_encode_h_264_capabilities_.maxTemporalLayerCount.limit.value();
            if (video_encode_h_264_capabilities_.expectDyadicTemporalLayerPattern.limit.has_value()) caps.video_encode_h_264_capabilities_.expectDyadicTemporalLayerPattern = video_encode_h_264_capabilities_.expectDyadicTemporalLayerPattern.limit.value();
            if (video_encode_h_264_capabilities_.minQp.limit.has_value()) caps.video_encode_h_264_capabilities_.minQp = video_encode_h_264_capabilities_.minQp.limit.value();
            if (video_encode_h_264_capabilities_.maxQp.limit.has_value()) caps.video_encode_h_264_capabilities_.maxQp = video_encode_h_264_capabilities_.maxQp.limit.value();
            if (video_encode_h_264_capabilities_.prefersGopRemainingFrames.limit.has_value()) caps.video_encode_h_264_capabilities_.prefersGopRemainingFrames = video_encode_h_264_capabilities_.prefersGopRemainingFrames.limit.value();
            if (video_encode_h_264_capabilities_.requiresGopRemainingFrames.limit.has_value()) caps.video_encode_h_264_capabilities_.requiresGopRemainingFrames = video_encode_h_264_capabilities_.requiresGopRemainingFrames.limit.value();
            if (video_encode_h_264_capabilities_.stdSyntaxFlags.limit.has_value()) caps.video_encode_h_264_capabilities_.stdSyntaxFlags = video_encode_h_264_capabilities_.stdSyntaxFlags.limit.value();
        }
        if (caps.video_encode_h_264_quantization_map_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_QUANTIZATION_MAP_CAPABILITIES_KHR) {
            caps.video_encode_h_264_quantization_map_capabilities_ = {caps.video_encode_h_264_quantization_map_capabilities_.sType, caps.video_encode_h_264_quantization_map_capabilities_.pNext};
            if (video_encode_h_264_quantization_map_capabilities_.minQpDelta.limit.has_value()) caps.video_encode_h_264_quantization_map_capabilities_.minQpDelta = video_encode_h_264_quantization_map_capabilities_.minQpDelta.limit.value();
            if (video_encode_h_264_quantization_map_capabilities_.maxQpDelta.limit.has_value()) caps.video_encode_h_264_quantization_map_capabilities_.maxQpDelta = video_encode_h_264_quantization_map_capabilities_.maxQpDelta.limit.value();
        }
        if (caps.video_encode_h_265_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_KHR) {
            caps.video_encode_h_265_capabilities_ = {caps.video_encode_h_265_capabilities_.sType, caps.video_encode_h_265_capabilities_.pNext};
            if (video_encode_h_265_capabilities_.flags.limit.has_value()) caps.video_encode_h_265_capabilities_.flags = video_encode_h_265_capabilities_.flags.limit.value();
            if (video_encode_h_265_capabilities_.maxLevelIdc.limit.has_value()) caps.video_encode_h_265_capabilities_.maxLevelIdc = video_encode_h_265_capabilities_.maxLevelIdc.limit.value();
            if (video_encode_h_265_capabilities_.maxSliceSegmentCount.limit.has_value()) caps.video_encode_h_265_capabilities_.maxSliceSegmentCount = video_encode_h_265_capabilities_.maxSliceSegmentCount.limit.value();
            if (video_encode_h_265_capabilities_.maxTiles.width.limit.has_value()) caps.video_encode_h_265_capabilities_.maxTiles.width = video_encode_h_265_capabilities_.maxTiles.width.limit.value();
            if (video_encode_h_265_capabilities_.maxTiles.height.limit.has_value()) caps.video_encode_h_265_capabilities_.maxTiles.height = video_encode_h_265_capabilities_.maxTiles.height.limit.value();
            if (video_encode_h_265_capabilities_.ctbSizes.limit.has_value()) caps.video_encode_h_265_capabilities_.ctbSizes = video_encode_h_265_capabilities_.ctbSizes.limit.value();
            if (video_encode_h_265_capabilities_.transformBlockSizes.limit.has_value()) caps.video_encode_h_265_capabilities_.transformBlockSizes = video_encode_h_265_capabilities_.transformBlockSizes.limit.value();
            if (video_encode_h_265_capabilities_.maxPPictureL0ReferenceCount.limit.has_value()) caps.video_encode_h_265_capabilities_.maxPPictureL0ReferenceCount = video_encode_h_265_capabilities_.maxPPictureL0ReferenceCount.limit.value();
            if (video_encode_h_265_capabilities_.maxBPictureL0ReferenceCount.limit.has_value()) caps.video_encode_h_265_capabilities_.maxBPictureL0ReferenceCount = video_encode_h_265_capabilities_.maxBPictureL0ReferenceCount.limit.value();
            if (video_encode_h_265_capabilities_.maxL1ReferenceCount.limit.has_value()) caps.video_encode_h_265_capabilities_.maxL1ReferenceCount = video_encode_h_265_capabilities_.maxL1ReferenceCount.limit.value();
            if (video_encode_h_265_capabilities_.maxSubLayerCount.limit.has_value()) caps.video_encode_h_265_capabilities_.maxSubLayerCount = video_encode_h_265_capabilities_.maxSubLayerCount.limit.value();
            if (video_encode_h_265_capabilities_.expectDyadicTemporalSubLayerPattern.limit.has_value()) caps.video_encode_h_265_capabilities_.expectDyadicTemporalSubLayerPattern = video_encode_h_265_capabilities_.expectDyadicTemporalSubLayerPattern.limit.value();
            if (video_encode_h_265_capabilities_.minQp.limit.has_value()) caps.video_encode_h_265_capabilities_.minQp = video_encode_h_265_capabilities_.minQp.limit.value();
            if (video_encode_h_265_capabilities_.maxQp.limit.has_value()) caps.video_encode_h_265_capabilities_.maxQp = video_encode_h_265_capabilities_.maxQp.limit.value();
            if (video_encode_h_265_capabilities_.prefersGopRemainingFrames.limit.has_value()) caps.video_encode_h_265_capabilities_.prefersGopRemainingFrames = video_encode_h_265_capabilities_.prefersGopRemainingFrames.limit.value();
            if (video_encode_h_265_capabilities_.requiresGopRemainingFrames.limit.has_value()) caps.video_encode_h_265_capabilities_.requiresGopRemainingFrames = video_encode_h_265_capabilities_.requiresGopRemainingFrames.limit.value();
            if (video_encode_h_265_capabilities_.stdSyntaxFlags.limit.has_value()) caps.video_encode_h_265_capabilities_.stdSyntaxFlags = video_encode_h_265_capabilities_.stdSyntaxFlags.limit.value();
        }
        if (caps.video_encode_h_265_quantization_map_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_QUANTIZATION_MAP_CAPABILITIES_KHR) {
            caps.video_encode_h_265_quantization_map_capabilities_ = {caps.video_encode_h_265_quantization_map_capabilities_.sType, caps.video_encode_h_265_quantization_map_capabilities_.pNext};
            if (video_encode_h_265_quantization_map_capabilities_.minQpDelta.limit.has_value()) caps.video_encode_h_265_quantization_map_capabilities_.minQpDelta = video_encode_h_265_quantization_map_capabilities_.minQpDelta.limit.value();
            if (video_encode_h_265_quantization_map_capabilities_.maxQpDelta.limit.has_value()) caps.video_encode_h_265_quantization_map_capabilities_.maxQpDelta = video_encode_h_265_quantization_map_capabilities_.maxQpDelta.limit.value();
        }
        if (caps.video_encode_intra_refresh_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_INTRA_REFRESH_CAPABILITIES_KHR) {
            caps.video_encode_intra_refresh_capabilities_ = {caps.video_encode_intra_refresh_capabilities_.sType, caps.video_encode_intra_refresh_capabilities_.pNext};
            if (video_encode_intra_refresh_capabilities_.intraRefreshModes.limit.has_value()) caps.video_encode_intra_refresh_capabilities_.intraRefreshModes = video_encode_intra_refresh_capabilities_.intraRefreshModes.limit.value();
            if (video_encode_intra_refresh_capabilities_.maxIntraRefreshCycleDuration.limit.has_value()) caps.video_encode_intra_refresh_capabilities_.maxIntraRefreshCycleDuration = video_encode_intra_refresh_capabilities_.maxIntraRefreshCycleDuration.limit.value();
            if (video_encode_intra_refresh_capabilities_.maxIntraRefreshActiveReferencePictures.limit.has_value()) caps.video_encode_intra_refresh_capabilities_.maxIntraRefreshActiveReferencePictures = video_encode_intra_refresh_capabilities_.maxIntraRefreshActiveReferencePictures.limit.value();
            if (video_encode_intra_refresh_capabilities_.partitionIndependentIntraRefreshRegions.limit.has_value()) caps.video_encode_intra_refresh_capabilities_.partitionIndependentIntraRefreshRegions = video_encode_intra_refresh_capabilities_.partitionIndependentIntraRefreshRegions.limit.value();
            if (video_encode_intra_refresh_capabilities_.nonRectangularIntraRefreshRegions.limit.has_value()) caps.video_encode_intra_refresh_capabilities_.nonRectangularIntraRefreshRegions = video_encode_intra_refresh_capabilities_.nonRectangularIntraRefreshRegions.limit.value();
        }
        if (caps.video_encode_quantization_map_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUANTIZATION_MAP_CAPABILITIES_KHR) {
            caps.video_encode_quantization_map_capabilities_ = {caps.video_encode_quantization_map_capabilities_.sType, caps.video_encode_quantization_map_capabilities_.pNext};
            if (video_encode_quantization_map_capabilities_.maxQuantizationMapExtent.width.limit.has_value()) caps.video_encode_quantization_map_capabilities_.maxQuantizationMapExtent.width = video_encode_quantization_map_capabilities_.maxQuantizationMapExtent.width.limit.value();
            if (video_encode_quantization_map_capabilities_.maxQuantizationMapExtent.height.limit.has_value()) caps.video_encode_quantization_map_capabilities_.maxQuantizationMapExtent.height = video_encode_quantization_map_capabilities_.maxQuantizationMapExtent.height.limit.value();
        }
        if (caps.video_encode_rgb_conversion_capabilities_.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_RGB_CONVERSION_CAPABILITIES_VALVE) {
            caps.video_encode_rgb_conversion_capabilities_ = {caps.video_encode_rgb_conversion_capabilities_.sType, caps.video_encode_rgb_conversion_capabilities_.pNext};
            if (video_encode_rgb_conversion_capabilities_.rgbModels.limit.has_value()) caps.video_encode_rgb_conversion_capabilities_.rgbModels = video_encode_rgb_conversion_capabilities_.rgbModels.limit.value();
            if (video_encode_rgb_conversion_capabilities_.rgbRanges.limit.has_value()) caps.video_encode_rgb_conversion_capabilities_.rgbRanges = video_encode_rgb_conversion_capabilities_.rgbRanges.limit.value();
            if (video_encode_rgb_conversion_capabilities_.xChromaOffsets.limit.has_value()) caps.video_encode_rgb_conversion_capabilities_.xChromaOffsets = video_encode_rgb_conversion_capabilities_.xChromaOffsets.limit.value();
            if (video_encode_rgb_conversion_capabilities_.yChromaOffsets.limit.has_value()) caps.video_encode_rgb_conversion_capabilities_.yChromaOffsets = video_encode_rgb_conversion_capabilities_.yChromaOffsets.limit.value();
        }
    }
};

struct VideoFormatPropertiesChain {
    bool valid{false};
    VkVideoFormatPropertiesKHR video_format_properties_{};
    VkVideoFormatAV1QuantizationMapPropertiesKHR video_format_av_1_quantization_map_properties_{};
    VkVideoFormatH265QuantizationMapPropertiesKHR video_format_h_265_quantization_map_properties_{};
    VkVideoFormatQuantizationMapPropertiesKHR video_format_quantization_map_properties_{};

    VideoFormatPropertiesChain() {}
    VideoFormatPropertiesChain(const VideoFormatPropertiesChain& format) {
        InitFrom(&format.video_format_properties_);
    }

    VideoFormatPropertiesChain& operator=(const VideoFormatPropertiesChain& rhs) {
        InitFrom(&rhs.video_format_properties_);
        return *this;
    }

    void InitFrom(const VkVideoFormatPropertiesKHR *props) {
        auto p = reinterpret_cast<const VkBaseInStructure*>(props);
        valid = true;
        void** ppnext = nullptr;
        while (p != nullptr) {
            switch (p->sType) {
                case VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR:
                    if (ppnext != nullptr) *ppnext = &video_format_properties_;
                    video_format_properties_ = *reinterpret_cast<const VkVideoFormatPropertiesKHR*>(p);
                    video_format_properties_.pNext = nullptr;
                    ppnext = &video_format_properties_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_FORMAT_AV1_QUANTIZATION_MAP_PROPERTIES_KHR:
                    if (ppnext != nullptr) *ppnext = &video_format_av_1_quantization_map_properties_;
                    video_format_av_1_quantization_map_properties_ = *reinterpret_cast<const VkVideoFormatAV1QuantizationMapPropertiesKHR*>(p);
                    video_format_av_1_quantization_map_properties_.pNext = nullptr;
                    ppnext = &video_format_av_1_quantization_map_properties_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_FORMAT_H265_QUANTIZATION_MAP_PROPERTIES_KHR:
                    if (ppnext != nullptr) *ppnext = &video_format_h_265_quantization_map_properties_;
                    video_format_h_265_quantization_map_properties_ = *reinterpret_cast<const VkVideoFormatH265QuantizationMapPropertiesKHR*>(p);
                    video_format_h_265_quantization_map_properties_.pNext = nullptr;
                    ppnext = &video_format_h_265_quantization_map_properties_.pNext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR:
                    if (ppnext != nullptr) *ppnext = &video_format_quantization_map_properties_;
                    video_format_quantization_map_properties_ = *reinterpret_cast<const VkVideoFormatQuantizationMapPropertiesKHR*>(p);
                    video_format_quantization_map_properties_.pNext = nullptr;
                    ppnext = &video_format_quantization_map_properties_.pNext;
                    break;
                default:
                    valid = false;
                    return;
            }
            p = p->pNext;
        }
    }

    VideoFormatPropertiesChain(VkVideoCodecOperationFlagBitsKHR op,
                       VkImageUsageFlags usage,
                       std::function<bool(uint32_t)> check_api_version,
                       std::function<bool(const char*)> check_extension) {
        (void)check_api_version;
        (void)check_extension;
        valid = true;
        video_format_properties_ = {VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR, nullptr};
        switch (op) {
            case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR:
                switch (usage) {
                    case VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR:
                        break;
                    case VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR:
                        break;
                    default:
                        valid = false;
                        return;
                }
                break;
            case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR:
                switch (usage) {
                    case VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR:
                        break;
                    case VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR:
                        break;
                    default:
                        valid = false;
                        return;
                }
                break;
            case VK_VIDEO_CODEC_OPERATION_DECODE_VP9_BIT_KHR:
                switch (usage) {
                    case VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR:
                        break;
                    case VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR:
                        break;
                    default:
                        valid = false;
                        return;
                }
                break;
            case VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR:
                switch (usage) {
                    case VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR:
                        break;
                    case VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR:
                        break;
                    default:
                        valid = false;
                        return;
                }
                break;
            case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR:
                switch (usage) {
                    case VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR:
                        break;
                    case VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR:
                        break;
                    case VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR:
                        if (check_extension("VK_KHR_video_encode_quantization_map")) {
                            video_format_quantization_map_properties_ = {VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR, video_format_properties_.pNext};
                            video_format_properties_.pNext = &video_format_quantization_map_properties_;
                        }
                        break;
                    case VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR:
                        if (check_extension("VK_KHR_video_encode_quantization_map")) {
                            video_format_quantization_map_properties_ = {VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR, video_format_properties_.pNext};
                            video_format_properties_.pNext = &video_format_quantization_map_properties_;
                        }
                        break;
                    default:
                        valid = false;
                        return;
                }
                break;
            case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR:
                switch (usage) {
                    case VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR:
                        break;
                    case VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR:
                        break;
                    case VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR:
                        if (check_extension("VK_KHR_video_encode_quantization_map")) {
                            video_format_quantization_map_properties_ = {VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR, video_format_properties_.pNext};
                            video_format_properties_.pNext = &video_format_quantization_map_properties_;
                        }
                        if (check_extension("VK_KHR_video_encode_quantization_map")) {
                            video_format_h_265_quantization_map_properties_ = {VK_STRUCTURE_TYPE_VIDEO_FORMAT_H265_QUANTIZATION_MAP_PROPERTIES_KHR, video_format_properties_.pNext};
                            video_format_properties_.pNext = &video_format_h_265_quantization_map_properties_;
                        }
                        break;
                    case VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR:
                        if (check_extension("VK_KHR_video_encode_quantization_map")) {
                            video_format_quantization_map_properties_ = {VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR, video_format_properties_.pNext};
                            video_format_properties_.pNext = &video_format_quantization_map_properties_;
                        }
                        if (check_extension("VK_KHR_video_encode_quantization_map")) {
                            video_format_h_265_quantization_map_properties_ = {VK_STRUCTURE_TYPE_VIDEO_FORMAT_H265_QUANTIZATION_MAP_PROPERTIES_KHR, video_format_properties_.pNext};
                            video_format_properties_.pNext = &video_format_h_265_quantization_map_properties_;
                        }
                        break;
                    default:
                        valid = false;
                        return;
                }
                break;
            case VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR:
                switch (usage) {
                    case VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR:
                        break;
                    case VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR:
                        break;
                    case VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR:
                        if (check_extension("VK_KHR_video_encode_quantization_map")) {
                            video_format_quantization_map_properties_ = {VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR, video_format_properties_.pNext};
                            video_format_properties_.pNext = &video_format_quantization_map_properties_;
                        }
                        if (check_extension("VK_KHR_video_encode_quantization_map")) {
                            video_format_av_1_quantization_map_properties_ = {VK_STRUCTURE_TYPE_VIDEO_FORMAT_AV1_QUANTIZATION_MAP_PROPERTIES_KHR, video_format_properties_.pNext};
                            video_format_properties_.pNext = &video_format_av_1_quantization_map_properties_;
                        }
                        break;
                    case VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR:
                        if (check_extension("VK_KHR_video_encode_quantization_map")) {
                            video_format_quantization_map_properties_ = {VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR, video_format_properties_.pNext};
                            video_format_properties_.pNext = &video_format_quantization_map_properties_;
                        }
                        if (check_extension("VK_KHR_video_encode_quantization_map")) {
                            video_format_av_1_quantization_map_properties_ = {VK_STRUCTURE_TYPE_VIDEO_FORMAT_AV1_QUANTIZATION_MAP_PROPERTIES_KHR, video_format_properties_.pNext};
                            video_format_properties_.pNext = &video_format_av_1_quantization_map_properties_;
                        }
                        break;
                    default:
                        valid = false;
                        return;
                }
                break;
            default:
                valid = false;
                return;
        }
    }

    void UpdateFrom(const VideoFormatPropertiesChain &source) {
        auto p = reinterpret_cast<const VkBaseInStructure*>(&source.video_format_properties_);
        void* orig_pnext = nullptr;
        while (p != nullptr) {
            switch (p->sType) {
                case VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR:
                    orig_pnext = video_format_properties_.pNext;
                    video_format_properties_ = *reinterpret_cast<const VkVideoFormatPropertiesKHR*>(p);
                    video_format_properties_.pNext = orig_pnext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_FORMAT_AV1_QUANTIZATION_MAP_PROPERTIES_KHR:
                    orig_pnext = video_format_av_1_quantization_map_properties_.pNext;
                    video_format_av_1_quantization_map_properties_ = *reinterpret_cast<const VkVideoFormatAV1QuantizationMapPropertiesKHR*>(p);
                    video_format_av_1_quantization_map_properties_.pNext = orig_pnext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_FORMAT_H265_QUANTIZATION_MAP_PROPERTIES_KHR:
                    orig_pnext = video_format_h_265_quantization_map_properties_.pNext;
                    video_format_h_265_quantization_map_properties_ = *reinterpret_cast<const VkVideoFormatH265QuantizationMapPropertiesKHR*>(p);
                    video_format_h_265_quantization_map_properties_.pNext = orig_pnext;
                    break;
                case VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR:
                    orig_pnext = video_format_quantization_map_properties_.pNext;
                    video_format_quantization_map_properties_ = *reinterpret_cast<const VkVideoFormatQuantizationMapPropertiesKHR*>(p);
                    video_format_quantization_map_properties_.pNext = orig_pnext;
                    break;
                default:
                    break;
            }
            p = p->pNext;
        }
    }

    void CopyTo(VkVideoFormatPropertiesKHR *props) const {
        auto p = reinterpret_cast<const VkBaseInStructure*>(&video_format_properties_);
        void* orig_pnext = nullptr;
        while (p != nullptr) {
            auto dst = reinterpret_cast<VkBaseOutStructure*>(props);
            while (dst != nullptr && dst->sType != p->sType) {
                dst = dst->pNext;
            }
            if (dst != nullptr) {
                switch (p->sType) {
                    case VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR: {
                        auto s = reinterpret_cast<VkVideoFormatPropertiesKHR*>(dst);
                        orig_pnext = s->pNext;
                        *s = *reinterpret_cast<const VkVideoFormatPropertiesKHR*>(p);
                        s->pNext = orig_pnext;
                        break;
                    }
                    case VK_STRUCTURE_TYPE_VIDEO_FORMAT_AV1_QUANTIZATION_MAP_PROPERTIES_KHR: {
                        auto s = reinterpret_cast<VkVideoFormatAV1QuantizationMapPropertiesKHR*>(dst);
                        orig_pnext = s->pNext;
                        *s = *reinterpret_cast<const VkVideoFormatAV1QuantizationMapPropertiesKHR*>(p);
                        s->pNext = orig_pnext;
                        break;
                    }
                    case VK_STRUCTURE_TYPE_VIDEO_FORMAT_H265_QUANTIZATION_MAP_PROPERTIES_KHR: {
                        auto s = reinterpret_cast<VkVideoFormatH265QuantizationMapPropertiesKHR*>(dst);
                        orig_pnext = s->pNext;
                        *s = *reinterpret_cast<const VkVideoFormatH265QuantizationMapPropertiesKHR*>(p);
                        s->pNext = orig_pnext;
                        break;
                    }
                    case VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR: {
                        auto s = reinterpret_cast<VkVideoFormatQuantizationMapPropertiesKHR*>(dst);
                        orig_pnext = s->pNext;
                        *s = *reinterpret_cast<const VkVideoFormatQuantizationMapPropertiesKHR*>(p);
                        s->pNext = orig_pnext;
                        break;
                    }
                    default:
                        break;
                }
            }
            p = p->pNext;
        }
    }

    bool operator==(const VideoFormatPropertiesChain &rhs) const {
        if (video_format_properties_.format != rhs.video_format_properties_.format) return false;
        if (video_format_properties_.componentMapping != rhs.video_format_properties_.componentMapping) return false;
        if (video_format_properties_.imageType != rhs.video_format_properties_.imageType) return false;
        if (video_format_properties_.imageTiling != rhs.video_format_properties_.imageTiling) return false;
        if (video_format_quantization_map_properties_.quantizationMapTexelSize != rhs.video_format_quantization_map_properties_.quantizationMapTexelSize) return false;
        return true;
    }

    struct hash {
        std::size_t operator()(const VideoFormatPropertiesChain& key) const {
            const std::size_t kMagic = 0x9e3779b97f4a7c16UL;
            std::size_t h = 0;
            if (key.video_format_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR) {
                h ^= std::hash<decltype(key.video_format_properties_.format)>{}(key.video_format_properties_.format) + kMagic + (h << 6) + (h >> 2);
                h ^= std::hash<decltype(key.video_format_properties_.componentMapping)>{}(key.video_format_properties_.componentMapping) + kMagic + (h << 6) + (h >> 2);
                h ^= std::hash<decltype(key.video_format_properties_.imageType)>{}(key.video_format_properties_.imageType) + kMagic + (h << 6) + (h >> 2);
                h ^= std::hash<decltype(key.video_format_properties_.imageTiling)>{}(key.video_format_properties_.imageTiling) + kMagic + (h << 6) + (h >> 2);
            }
            if (key.video_format_av_1_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_AV1_QUANTIZATION_MAP_PROPERTIES_KHR) {
            }
            if (key.video_format_h_265_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_H265_QUANTIZATION_MAP_PROPERTIES_KHR) {
            }
            if (key.video_format_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR) {
                h ^= std::hash<decltype(key.video_format_quantization_map_properties_.quantizationMapTexelSize)>{}(key.video_format_quantization_map_properties_.quantizationMapTexelSize) + kMagic + (h << 6) + (h >> 2);
            }
            return h;
        }
    };

    void IntersectWith(const VideoFormatPropertiesChain &source) {
        if (video_format_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR && source.video_format_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR) {
            video_format_properties_.imageCreateFlags &= source.video_format_properties_.imageCreateFlags;
            video_format_properties_.imageUsageFlags &= source.video_format_properties_.imageUsageFlags;
        }
        if (video_format_av_1_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_AV1_QUANTIZATION_MAP_PROPERTIES_KHR && source.video_format_av_1_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_AV1_QUANTIZATION_MAP_PROPERTIES_KHR) {
            video_format_av_1_quantization_map_properties_.compatibleSuperblockSizes &= source.video_format_av_1_quantization_map_properties_.compatibleSuperblockSizes;
        }
        if (video_format_h_265_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_H265_QUANTIZATION_MAP_PROPERTIES_KHR && source.video_format_h_265_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_H265_QUANTIZATION_MAP_PROPERTIES_KHR) {
            video_format_h_265_quantization_map_properties_.compatibleCtbSizes &= source.video_format_h_265_quantization_map_properties_.compatibleCtbSizes;
        }
        if (video_format_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR && source.video_format_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR) {
        }
    }
};

template <> struct std::hash<VideoFormatPropertiesChain> : VideoFormatPropertiesChain::hash {};
typedef std::unordered_set<VideoFormatPropertiesChain> SetOfVideoProfileFormats;

class JsonVideoProfileFormat {
    bool is_valid_{false};
    bool video_format_properties_defined_{false};
    struct {
        LimitExact<VkFormat> format{};
        struct {
            LimitExact<VkComponentSwizzle> r{};
            LimitExact<VkComponentSwizzle> g{};
            LimitExact<VkComponentSwizzle> b{};
            LimitExact<VkComponentSwizzle> a{};
        } componentMapping{};
        LimitFlags<VkImageCreateFlags> imageCreateFlags{};
        LimitExact<VkImageType> imageType{};
        LimitExact<VkImageTiling> imageTiling{};
        LimitFlags<VkImageUsageFlags> imageUsageFlags{};
    } video_format_properties_{};
    bool video_format_av_1_quantization_map_properties_defined_{false};
    struct {
        LimitFlags<VkVideoEncodeAV1SuperblockSizeFlagsKHR> compatibleSuperblockSizes{};
    } video_format_av_1_quantization_map_properties_{};
    bool video_format_h_265_quantization_map_properties_defined_{false};
    struct {
        LimitFlags<VkVideoEncodeH265CtbSizeFlagsKHR> compatibleCtbSizes{};
    } video_format_h_265_quantization_map_properties_{};
    bool video_format_quantization_map_properties_defined_{false};
    struct {
        struct {
            LimitExact<uint32_t> width{};
            LimitExact<uint32_t> height{};
        } quantizationMapTexelSize{};
    } video_format_quantization_map_properties_{};

    bool ParseJson(const Json::Value &format_json) {
        const Json::Value *video_format_properties_json = nullptr;
        if (format_json.isMember("VkVideoFormatPropertiesKHR")) {
            if (video_format_properties_json != nullptr) return false;
            video_format_properties_json = &format_json["VkVideoFormatPropertiesKHR"];
        }
        if (video_format_properties_json != nullptr) {
            if (video_format_properties_json->isMember("format")) {
                const Json::Value &value = (*video_format_properties_json)["format"];
                if (!value.isString()) return false;
                video_format_properties_.format.limit = static_cast<VkFormat>(VkStringToUint64(value.asString()));
            }
            if (video_format_properties_json->isMember("componentMapping")) {
                const Json::Value &value = (*video_format_properties_json)["componentMapping"];
                if (!value.isObject()) return false;
                if (value.isMember("r")) {
                    const Json::Value &value_r = value["r"];
                    if (!value_r.isString()) return false;
                    video_format_properties_.componentMapping.r.limit = static_cast<VkComponentSwizzle>(VkStringToUint64(value_r.asString()));
                }
                if (value.isMember("g")) {
                    const Json::Value &value_g = value["g"];
                    if (!value_g.isString()) return false;
                    video_format_properties_.componentMapping.g.limit = static_cast<VkComponentSwizzle>(VkStringToUint64(value_g.asString()));
                }
                if (value.isMember("b")) {
                    const Json::Value &value_b = value["b"];
                    if (!value_b.isString()) return false;
                    video_format_properties_.componentMapping.b.limit = static_cast<VkComponentSwizzle>(VkStringToUint64(value_b.asString()));
                }
                if (value.isMember("a")) {
                    const Json::Value &value_a = value["a"];
                    if (!value_a.isString()) return false;
                    video_format_properties_.componentMapping.a.limit = static_cast<VkComponentSwizzle>(VkStringToUint64(value_a.asString()));
                }
            }
            if (video_format_properties_json->isMember("imageCreateFlags")) {
                const Json::Value &value = (*video_format_properties_json)["imageCreateFlags"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_format_properties_.imageCreateFlags.limit = static_cast<VkImageCreateFlags>(mask);
            }
            if (video_format_properties_json->isMember("imageType")) {
                const Json::Value &value = (*video_format_properties_json)["imageType"];
                if (!value.isString()) return false;
                video_format_properties_.imageType.limit = static_cast<VkImageType>(VkStringToUint64(value.asString()));
            }
            if (video_format_properties_json->isMember("imageTiling")) {
                const Json::Value &value = (*video_format_properties_json)["imageTiling"];
                if (!value.isString()) return false;
                video_format_properties_.imageTiling.limit = static_cast<VkImageTiling>(VkStringToUint64(value.asString()));
            }
            if (video_format_properties_json->isMember("imageUsageFlags")) {
                const Json::Value &value = (*video_format_properties_json)["imageUsageFlags"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_format_properties_.imageUsageFlags.limit = static_cast<VkImageUsageFlags>(mask);
            }
        }
        const Json::Value *video_format_av_1_quantization_map_properties_json = nullptr;
        if (format_json.isMember("VkVideoFormatAV1QuantizationMapPropertiesKHR")) {
            if (video_format_av_1_quantization_map_properties_json != nullptr) return false;
            video_format_av_1_quantization_map_properties_json = &format_json["VkVideoFormatAV1QuantizationMapPropertiesKHR"];
        }
        if (video_format_av_1_quantization_map_properties_json != nullptr) {
            if (video_format_av_1_quantization_map_properties_json->isMember("compatibleSuperblockSizes")) {
                const Json::Value &value = (*video_format_av_1_quantization_map_properties_json)["compatibleSuperblockSizes"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_format_av_1_quantization_map_properties_.compatibleSuperblockSizes.limit = static_cast<VkVideoEncodeAV1SuperblockSizeFlagsKHR>(mask);
            }
        }
        const Json::Value *video_format_h_265_quantization_map_properties_json = nullptr;
        if (format_json.isMember("VkVideoFormatH265QuantizationMapPropertiesKHR")) {
            if (video_format_h_265_quantization_map_properties_json != nullptr) return false;
            video_format_h_265_quantization_map_properties_json = &format_json["VkVideoFormatH265QuantizationMapPropertiesKHR"];
        }
        if (video_format_h_265_quantization_map_properties_json != nullptr) {
            if (video_format_h_265_quantization_map_properties_json->isMember("compatibleCtbSizes")) {
                const Json::Value &value = (*video_format_h_265_quantization_map_properties_json)["compatibleCtbSizes"];
                if (!value.isArray()) return false;
                uint64_t mask = 0;
                for (const auto &entry : value) {
                    mask |= VkStringToUint64(entry.asString());
                }
                video_format_h_265_quantization_map_properties_.compatibleCtbSizes.limit = static_cast<VkVideoEncodeH265CtbSizeFlagsKHR>(mask);
            }
        }
        const Json::Value *video_format_quantization_map_properties_json = nullptr;
        if (format_json.isMember("VkVideoFormatQuantizationMapPropertiesKHR")) {
            if (video_format_quantization_map_properties_json != nullptr) return false;
            video_format_quantization_map_properties_json = &format_json["VkVideoFormatQuantizationMapPropertiesKHR"];
        }
        if (video_format_quantization_map_properties_json != nullptr) {
            if (video_format_quantization_map_properties_json->isMember("quantizationMapTexelSize")) {
                const Json::Value &value = (*video_format_quantization_map_properties_json)["quantizationMapTexelSize"];
                if (!value.isObject()) return false;
                if (value.isMember("width")) {
                    const Json::Value &value_width = value["width"];
                    if (!value_width.isUInt()) return false;
                    video_format_quantization_map_properties_.quantizationMapTexelSize.width.limit = value_width.asUInt();
                }
                if (value.isMember("height")) {
                    const Json::Value &value_height = value["height"];
                    if (!value_height.isUInt()) return false;
                    video_format_quantization_map_properties_.quantizationMapTexelSize.height.limit = value_height.asUInt();
                }
            }
        }
        return true;
    }

  public:
    JsonVideoProfileFormat() = default;
    JsonVideoProfileFormat(const Json::Value &format_json) {
        is_valid_ = ParseJson(format_json);
    }

    bool IsValid() const { return is_valid_; }

    bool IsMatchingUsage(VkImageUsageFlags usage) const {
        return video_format_properties_.imageUsageFlags.limit.has_value()
            && (video_format_properties_.imageUsageFlags.limit.value() & usage) == usage;
    }

    bool IsMatching(const VideoFormatPropertiesChain &format) const {
        if (format.video_format_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR) {
            if (video_format_properties_.format.limit.has_value() && video_format_properties_.format.limit.value() != format.video_format_properties_.format) return false;
            if (video_format_properties_.componentMapping.r.limit.has_value() && video_format_properties_.componentMapping.r.limit.value() != format.video_format_properties_.componentMapping.r) return false;
            if (video_format_properties_.componentMapping.g.limit.has_value() && video_format_properties_.componentMapping.g.limit.value() != format.video_format_properties_.componentMapping.g) return false;
            if (video_format_properties_.componentMapping.b.limit.has_value() && video_format_properties_.componentMapping.b.limit.value() != format.video_format_properties_.componentMapping.b) return false;
            if (video_format_properties_.componentMapping.a.limit.has_value() && video_format_properties_.componentMapping.a.limit.value() != format.video_format_properties_.componentMapping.a) return false;
            if (video_format_properties_.imageType.limit.has_value() && video_format_properties_.imageType.limit.value() != format.video_format_properties_.imageType) return false;
            if (video_format_properties_.imageTiling.limit.has_value() && video_format_properties_.imageTiling.limit.value() != format.video_format_properties_.imageTiling) return false;
        } else {
            if (video_format_properties_defined_) return false;
        }
        if (format.video_format_av_1_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_AV1_QUANTIZATION_MAP_PROPERTIES_KHR) {
        } else {
            if (video_format_av_1_quantization_map_properties_defined_) return false;
        }
        if (format.video_format_h_265_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_H265_QUANTIZATION_MAP_PROPERTIES_KHR) {
        } else {
            if (video_format_h_265_quantization_map_properties_defined_) return false;
        }
        if (format.video_format_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR) {
            if (video_format_quantization_map_properties_.quantizationMapTexelSize.width.limit.has_value() && video_format_quantization_map_properties_.quantizationMapTexelSize.width.limit.value() != format.video_format_quantization_map_properties_.quantizationMapTexelSize.width) return false;
            if (video_format_quantization_map_properties_.quantizationMapTexelSize.height.limit.has_value() && video_format_quantization_map_properties_.quantizationMapTexelSize.height.limit.value() != format.video_format_quantization_map_properties_.quantizationMapTexelSize.height) return false;
        } else {
            if (video_format_quantization_map_properties_defined_) return false;
        }
        return true;
    }

    bool IsComplete(const VideoFormatPropertiesChain &format) const {
        if (format.video_format_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR) {
            if (!video_format_properties_.format.limit.has_value()) return false;
            if (!video_format_properties_.componentMapping.r.limit.has_value()) return false;
            if (!video_format_properties_.componentMapping.g.limit.has_value()) return false;
            if (!video_format_properties_.componentMapping.b.limit.has_value()) return false;
            if (!video_format_properties_.componentMapping.a.limit.has_value()) return false;
            if (!video_format_properties_.imageType.limit.has_value()) return false;
            if (!video_format_properties_.imageTiling.limit.has_value()) return false;
        }
        if (format.video_format_av_1_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_AV1_QUANTIZATION_MAP_PROPERTIES_KHR) {
        }
        if (format.video_format_h_265_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_H265_QUANTIZATION_MAP_PROPERTIES_KHR) {
        }
        if (format.video_format_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR) {
            if (!video_format_quantization_map_properties_.quantizationMapTexelSize.width.limit.has_value()) return false;
            if (!video_format_quantization_map_properties_.quantizationMapTexelSize.height.limit.has_value()) return false;
        }
        return true;
    }

    bool Combine(ProfileLayerSettings *layer_settings, const JsonVideoProfileFormat &format) {
        const char *error_msg = "Conflicting video format property defined in the profile for %s";
        bool result = true;
        if (format.video_format_properties_.imageCreateFlags.limit.has_value() && !video_format_properties_.imageCreateFlags.Combine(format.video_format_properties_.imageCreateFlags.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoFormatPropertiesKHR::imageCreateFlags");
            result = false;
        }
        if (format.video_format_properties_.imageUsageFlags.limit.has_value() && !video_format_properties_.imageUsageFlags.Combine(format.video_format_properties_.imageUsageFlags.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoFormatPropertiesKHR::imageUsageFlags");
            result = false;
        }
        if (format.video_format_av_1_quantization_map_properties_.compatibleSuperblockSizes.limit.has_value() && !video_format_av_1_quantization_map_properties_.compatibleSuperblockSizes.Combine(format.video_format_av_1_quantization_map_properties_.compatibleSuperblockSizes.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoFormatAV1QuantizationMapPropertiesKHR::compatibleSuperblockSizes");
            result = false;
        }
        if (format.video_format_h_265_quantization_map_properties_.compatibleCtbSizes.limit.has_value() && !video_format_h_265_quantization_map_properties_.compatibleCtbSizes.Combine(format.video_format_h_265_quantization_map_properties_.compatibleCtbSizes.limit.value())) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, error_msg, "VkVideoFormatH265QuantizationMapPropertiesKHR::compatibleCtbSizes");
            result = false;
        }
        return result;
    }

    bool Override(ProfileLayerSettings *layer_settings, VideoFormatPropertiesChain &format, const char *name, bool enable_warnings) const {
        const char *warn_msg = "Simulating video format property %s that is not supported by the device for video profile '%s'\n";
        bool result = true;
        if (format.video_format_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR) {
            if (!video_format_properties_.imageCreateFlags.Override(format.video_format_properties_.imageCreateFlags)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoFormatPropertiesKHR::imageCreateFlags", name);
                    result = false;
                }
            }
            if (!video_format_properties_.imageUsageFlags.Override(format.video_format_properties_.imageUsageFlags)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoFormatPropertiesKHR::imageUsageFlags", name);
                    result = false;
                }
            }
        }
        if (format.video_format_av_1_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_AV1_QUANTIZATION_MAP_PROPERTIES_KHR) {
            if (!video_format_av_1_quantization_map_properties_.compatibleSuperblockSizes.Override(format.video_format_av_1_quantization_map_properties_.compatibleSuperblockSizes)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoFormatAV1QuantizationMapPropertiesKHR::compatibleSuperblockSizes", name);
                    result = false;
                }
            }
        }
        if (format.video_format_h_265_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_H265_QUANTIZATION_MAP_PROPERTIES_KHR) {
            if (!video_format_h_265_quantization_map_properties_.compatibleCtbSizes.Override(format.video_format_h_265_quantization_map_properties_.compatibleCtbSizes)) {
                if (enable_warnings) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT, warn_msg, "VkVideoFormatH265QuantizationMapPropertiesKHR::compatibleCtbSizes", name);
                    result = false;
                }
            }
        }
        if (format.video_format_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR) {
        }
        return result;
    }

    void CopyTo(VideoFormatPropertiesChain &format) const {
        if (format.video_format_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR) {
            format.video_format_properties_ = {format.video_format_properties_.sType, format.video_format_properties_.pNext};
            if (video_format_properties_.format.limit.has_value()) format.video_format_properties_.format = video_format_properties_.format.limit.value();
            if (video_format_properties_.componentMapping.r.limit.has_value()) format.video_format_properties_.componentMapping.r = video_format_properties_.componentMapping.r.limit.value();
            if (video_format_properties_.componentMapping.g.limit.has_value()) format.video_format_properties_.componentMapping.g = video_format_properties_.componentMapping.g.limit.value();
            if (video_format_properties_.componentMapping.b.limit.has_value()) format.video_format_properties_.componentMapping.b = video_format_properties_.componentMapping.b.limit.value();
            if (video_format_properties_.componentMapping.a.limit.has_value()) format.video_format_properties_.componentMapping.a = video_format_properties_.componentMapping.a.limit.value();
            if (video_format_properties_.imageCreateFlags.limit.has_value()) format.video_format_properties_.imageCreateFlags = video_format_properties_.imageCreateFlags.limit.value();
            if (video_format_properties_.imageType.limit.has_value()) format.video_format_properties_.imageType = video_format_properties_.imageType.limit.value();
            if (video_format_properties_.imageTiling.limit.has_value()) format.video_format_properties_.imageTiling = video_format_properties_.imageTiling.limit.value();
            if (video_format_properties_.imageUsageFlags.limit.has_value()) format.video_format_properties_.imageUsageFlags = video_format_properties_.imageUsageFlags.limit.value();
        }
        if (format.video_format_av_1_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_AV1_QUANTIZATION_MAP_PROPERTIES_KHR) {
            format.video_format_av_1_quantization_map_properties_ = {format.video_format_av_1_quantization_map_properties_.sType, format.video_format_av_1_quantization_map_properties_.pNext};
            if (video_format_av_1_quantization_map_properties_.compatibleSuperblockSizes.limit.has_value()) format.video_format_av_1_quantization_map_properties_.compatibleSuperblockSizes = video_format_av_1_quantization_map_properties_.compatibleSuperblockSizes.limit.value();
        }
        if (format.video_format_h_265_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_H265_QUANTIZATION_MAP_PROPERTIES_KHR) {
            format.video_format_h_265_quantization_map_properties_ = {format.video_format_h_265_quantization_map_properties_.sType, format.video_format_h_265_quantization_map_properties_.pNext};
            if (video_format_h_265_quantization_map_properties_.compatibleCtbSizes.limit.has_value()) format.video_format_h_265_quantization_map_properties_.compatibleCtbSizes = video_format_h_265_quantization_map_properties_.compatibleCtbSizes.limit.value();
        }
        if (format.video_format_quantization_map_properties_.sType == VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR) {
            format.video_format_quantization_map_properties_ = {format.video_format_quantization_map_properties_.sType, format.video_format_quantization_map_properties_.pNext};
            if (video_format_quantization_map_properties_.quantizationMapTexelSize.width.limit.has_value()) format.video_format_quantization_map_properties_.quantizationMapTexelSize.width = video_format_quantization_map_properties_.quantizationMapTexelSize.width.limit.value();
            if (video_format_quantization_map_properties_.quantizationMapTexelSize.height.limit.has_value()) format.video_format_quantization_map_properties_.quantizationMapTexelSize.height = video_format_quantization_map_properties_.quantizationMapTexelSize.height.limit.value();
        }
    }
};

struct VideoProfileData {
    VideoProfileInfoChain info{};
    VideoCapabilitiesChain caps{};
    std::unordered_map<VkImageUsageFlags, SetOfVideoProfileFormats> formats{};

    std::vector<VkImageUsageFlags> GetSupportedFormatCategories() const {
        std::vector<VkImageUsageFlags> result{};
        switch (info.video_profile_info_.videoCodecOperation) {
            case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR:
                result.push_back(VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR);
                result.push_back(VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR);
                break;
            case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR:
                result.push_back(VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR);
                result.push_back(VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR);
                break;
            case VK_VIDEO_CODEC_OPERATION_DECODE_VP9_BIT_KHR:
                result.push_back(VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR);
                result.push_back(VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR);
                break;
            case VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR:
                result.push_back(VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR);
                result.push_back(VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR);
                break;
            case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR:
                result.push_back(VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR);
                result.push_back(VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR);
                if (caps.video_encode_capabilities_.flags & VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR) {
                    result.push_back(VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR);
                }
                if (caps.video_encode_capabilities_.flags & VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR) {
                    result.push_back(VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR);
                }
                break;
            case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR:
                result.push_back(VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR);
                result.push_back(VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR);
                if (caps.video_encode_capabilities_.flags & VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR) {
                    result.push_back(VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR);
                }
                if (caps.video_encode_capabilities_.flags & VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR) {
                    result.push_back(VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR);
                }
                break;
            case VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR:
                result.push_back(VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR);
                result.push_back(VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR);
                if (caps.video_encode_capabilities_.flags & VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR) {
                    result.push_back(VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR);
                }
                if (caps.video_encode_capabilities_.flags & VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR) {
                    result.push_back(VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR);
                }
                break;
            default:
                break;
        }
        return result;
    }

    bool operator==(const VideoProfileData &rhs) const {
        return info == rhs.info;
    }

    struct hash {
        std::size_t operator()(const VideoProfileData& key) const {
            return std::hash<VideoProfileInfoChain>{}(key.info);
        }
    };
};

template <> struct std::hash<VideoProfileData> : VideoProfileData::hash {};
typedef std::unordered_set<VideoProfileData> SetOfVideoProfiles;

static void ForEachVideoProfile(std::function<void(const VkVideoProfileInfoKHR&, const char*)> callback) {
    VkVideoProfileInfoKHR video_profile_info{VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR, nullptr};
    struct ChromaSubsamplingInfo {
        VkVideoChromaSubsamplingFlagsKHR value;
        const char* name;
    };
    const std::vector<ChromaSubsamplingInfo> chroma_subsampling_list = {
        {VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR, "4:2:0"},
        {VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR, "4:2:2"},
        {VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR, "4:4:4"},
        {VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR, "monochrome"}
    };

    struct BitDepthInfo {
        VkVideoComponentBitDepthFlagsKHR value;
        const char* name;
    };
    const std::vector<BitDepthInfo> bit_depth_list = {
        {VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR, "8"},
        {VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR, "10"},
        {VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR, "12"}
    };

    auto base_format = []
        (const ChromaSubsamplingInfo &chroma_subsampling, const BitDepthInfo &luma_bit_depth, const BitDepthInfo &chroma_bit_depth) {
        std::string result{};
            result += " (";
            result += chroma_subsampling.name;
            result += " ";
            result += luma_bit_depth.name;
            if (luma_bit_depth.value != chroma_bit_depth.value) {
                result += ":";
                result += chroma_bit_depth.name;
            }
            result += "-bit)";
            return result;
        };
    for (auto chroma_subsampling : chroma_subsampling_list) {
        video_profile_info.chromaSubsampling = chroma_subsampling.value;
        for (auto luma_bit_depth : bit_depth_list) {
            video_profile_info.lumaBitDepth = luma_bit_depth.value;
            for (auto chroma_bit_depth : bit_depth_list) {
                if (chroma_subsampling.value == VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR &&
                    luma_bit_depth.value != chroma_bit_depth.value) {
                    // Ignore the chroma bit depth dimension for monochrome
                    continue;
                }
                video_profile_info.chromaBitDepth = chroma_bit_depth.value;
                {
                    const std::string profile_base_name = "H.264 Decode" + base_format(chroma_subsampling, luma_bit_depth, chroma_bit_depth);
                    video_profile_info.pNext = nullptr;
                    video_profile_info.videoCodecOperation = VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR;
                    VkVideoDecodeH264ProfileInfoKHR video_decode_h_264_profile_info_ = {VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR};
                    video_decode_h_264_profile_info_.pNext = video_profile_info.pNext;
                    video_profile_info.pNext = &video_decode_h_264_profile_info_;
                    video_decode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_BASELINE;
                    video_decode_h_264_profile_info_.pictureLayout = VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR;
                    callback(video_profile_info, (profile_base_name + " Baseline progressive").c_str());
                    video_decode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_MAIN;
                    callback(video_profile_info, (profile_base_name + " Main progressive").c_str());
                    video_decode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH;
                    callback(video_profile_info, (profile_base_name + " High progressive").c_str());
                    video_decode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH_10;
                    callback(video_profile_info, (profile_base_name + " High 10 progressive").c_str());
                    video_decode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH_422;
                    callback(video_profile_info, (profile_base_name + " High 4:2:2 progressive").c_str());
                    video_decode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH_444_PREDICTIVE;
                    callback(video_profile_info, (profile_base_name + " High 4:4:4 Predictive progressive").c_str());
                    video_decode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_BASELINE;
                    video_decode_h_264_profile_info_.pictureLayout = VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR;
                    callback(video_profile_info, (profile_base_name + " Baseline interlaced (interleaved lines)").c_str());
                    video_decode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_MAIN;
                    callback(video_profile_info, (profile_base_name + " Main interlaced (interleaved lines)").c_str());
                    video_decode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH;
                    callback(video_profile_info, (profile_base_name + " High interlaced (interleaved lines)").c_str());
                    video_decode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH_10;
                    callback(video_profile_info, (profile_base_name + " High 10 interlaced (interleaved lines)").c_str());
                    video_decode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH_422;
                    callback(video_profile_info, (profile_base_name + " High 4:2:2 interlaced (interleaved lines)").c_str());
                    video_decode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH_444_PREDICTIVE;
                    callback(video_profile_info, (profile_base_name + " High 4:4:4 Predictive interlaced (interleaved lines)").c_str());
                    video_decode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_BASELINE;
                    video_decode_h_264_profile_info_.pictureLayout = VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR;
                    callback(video_profile_info, (profile_base_name + " Baseline interlaced (separate planes)").c_str());
                    video_decode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_MAIN;
                    callback(video_profile_info, (profile_base_name + " Main interlaced (separate planes)").c_str());
                    video_decode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH;
                    callback(video_profile_info, (profile_base_name + " High interlaced (separate planes)").c_str());
                    video_decode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH_10;
                    callback(video_profile_info, (profile_base_name + " High 10 interlaced (separate planes)").c_str());
                    video_decode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH_422;
                    callback(video_profile_info, (profile_base_name + " High 4:2:2 interlaced (separate planes)").c_str());
                    video_decode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH_444_PREDICTIVE;
                    callback(video_profile_info, (profile_base_name + " High 4:4:4 Predictive interlaced (separate planes)").c_str());
                }
                {
                    const std::string profile_base_name = "H.265 Decode" + base_format(chroma_subsampling, luma_bit_depth, chroma_bit_depth);
                    video_profile_info.pNext = nullptr;
                    video_profile_info.videoCodecOperation = VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR;
                    VkVideoDecodeH265ProfileInfoKHR video_decode_h_265_profile_info_ = {VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR};
                    video_decode_h_265_profile_info_.pNext = video_profile_info.pNext;
                    video_profile_info.pNext = &video_decode_h_265_profile_info_;
                    video_decode_h_265_profile_info_.stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_MAIN;
                    callback(video_profile_info, (profile_base_name + " Main").c_str());
                    video_decode_h_265_profile_info_.stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_MAIN_10;
                    callback(video_profile_info, (profile_base_name + " Main 10").c_str());
                    video_decode_h_265_profile_info_.stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_MAIN_STILL_PICTURE;
                    callback(video_profile_info, (profile_base_name + " Main Still Picture").c_str());
                    video_decode_h_265_profile_info_.stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_FORMAT_RANGE_EXTENSIONS;
                    callback(video_profile_info, (profile_base_name + " Format range extensions").c_str());
                    video_decode_h_265_profile_info_.stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_SCC_EXTENSIONS;
                    callback(video_profile_info, (profile_base_name + " Screen content coding extensions").c_str());
                }
                {
                    const std::string profile_base_name = "VP9 Decode" + base_format(chroma_subsampling, luma_bit_depth, chroma_bit_depth);
                    video_profile_info.pNext = nullptr;
                    video_profile_info.videoCodecOperation = VK_VIDEO_CODEC_OPERATION_DECODE_VP9_BIT_KHR;
                    VkVideoDecodeVP9ProfileInfoKHR video_decode_vp_9_profile_info_ = {VK_STRUCTURE_TYPE_VIDEO_DECODE_VP9_PROFILE_INFO_KHR};
                    video_decode_vp_9_profile_info_.pNext = video_profile_info.pNext;
                    video_profile_info.pNext = &video_decode_vp_9_profile_info_;
                    video_decode_vp_9_profile_info_.stdProfile = STD_VIDEO_VP9_PROFILE_0;
                    callback(video_profile_info, (profile_base_name + " Profile 0").c_str());
                    video_decode_vp_9_profile_info_.stdProfile = STD_VIDEO_VP9_PROFILE_1;
                    callback(video_profile_info, (profile_base_name + " Profile 1").c_str());
                    video_decode_vp_9_profile_info_.stdProfile = STD_VIDEO_VP9_PROFILE_2;
                    callback(video_profile_info, (profile_base_name + " Profile 2").c_str());
                    video_decode_vp_9_profile_info_.stdProfile = STD_VIDEO_VP9_PROFILE_3;
                    callback(video_profile_info, (profile_base_name + " Profile 3").c_str());
                }
                {
                    const std::string profile_base_name = "AV1 Decode" + base_format(chroma_subsampling, luma_bit_depth, chroma_bit_depth);
                    video_profile_info.pNext = nullptr;
                    video_profile_info.videoCodecOperation = VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR;
                    VkVideoDecodeAV1ProfileInfoKHR video_decode_av_1_profile_info_ = {VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PROFILE_INFO_KHR};
                    video_decode_av_1_profile_info_.pNext = video_profile_info.pNext;
                    video_profile_info.pNext = &video_decode_av_1_profile_info_;
                    video_decode_av_1_profile_info_.stdProfile = STD_VIDEO_AV1_PROFILE_MAIN;
                    video_decode_av_1_profile_info_.filmGrainSupport = VK_TRUE;
                    callback(video_profile_info, (profile_base_name + " Main with film grain support").c_str());
                    video_decode_av_1_profile_info_.stdProfile = STD_VIDEO_AV1_PROFILE_HIGH;
                    callback(video_profile_info, (profile_base_name + " High with film grain support").c_str());
                    video_decode_av_1_profile_info_.stdProfile = STD_VIDEO_AV1_PROFILE_PROFESSIONAL;
                    callback(video_profile_info, (profile_base_name + " Professional with film grain support").c_str());
                    video_decode_av_1_profile_info_.stdProfile = STD_VIDEO_AV1_PROFILE_MAIN;
                    video_decode_av_1_profile_info_.filmGrainSupport = VK_FALSE;
                    callback(video_profile_info, (profile_base_name + " Main without film grain support").c_str());
                    video_decode_av_1_profile_info_.stdProfile = STD_VIDEO_AV1_PROFILE_HIGH;
                    callback(video_profile_info, (profile_base_name + " High without film grain support").c_str());
                    video_decode_av_1_profile_info_.stdProfile = STD_VIDEO_AV1_PROFILE_PROFESSIONAL;
                    callback(video_profile_info, (profile_base_name + " Professional without film grain support").c_str());
                }
                {
                    const std::string profile_base_name = "H.264 Encode" + base_format(chroma_subsampling, luma_bit_depth, chroma_bit_depth);
                    video_profile_info.pNext = nullptr;
                    video_profile_info.videoCodecOperation = VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR;
                    VkVideoEncodeH264ProfileInfoKHR video_encode_h_264_profile_info_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_INFO_KHR};
                    video_encode_h_264_profile_info_.pNext = video_profile_info.pNext;
                    video_profile_info.pNext = &video_encode_h_264_profile_info_;
                    video_encode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_BASELINE;
                    callback(video_profile_info, (profile_base_name + " Baseline").c_str());
                    video_encode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_MAIN;
                    callback(video_profile_info, (profile_base_name + " Main").c_str());
                    video_encode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH;
                    callback(video_profile_info, (profile_base_name + " High").c_str());
                    video_encode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH_10;
                    callback(video_profile_info, (profile_base_name + " High 10").c_str());
                    video_encode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH_422;
                    callback(video_profile_info, (profile_base_name + " High 4:2:2").c_str());
                    video_encode_h_264_profile_info_.stdProfileIdc = STD_VIDEO_H264_PROFILE_IDC_HIGH_444_PREDICTIVE;
                    callback(video_profile_info, (profile_base_name + " High 4:4:4 Predictive").c_str());
                }
                {
                    const std::string profile_base_name = "H.265 Encode" + base_format(chroma_subsampling, luma_bit_depth, chroma_bit_depth);
                    video_profile_info.pNext = nullptr;
                    video_profile_info.videoCodecOperation = VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR;
                    VkVideoEncodeH265ProfileInfoKHR video_encode_h_265_profile_info_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_INFO_KHR};
                    video_encode_h_265_profile_info_.pNext = video_profile_info.pNext;
                    video_profile_info.pNext = &video_encode_h_265_profile_info_;
                    video_encode_h_265_profile_info_.stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_MAIN;
                    callback(video_profile_info, (profile_base_name + " Main").c_str());
                    video_encode_h_265_profile_info_.stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_MAIN_10;
                    callback(video_profile_info, (profile_base_name + " Main 10").c_str());
                    video_encode_h_265_profile_info_.stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_MAIN_STILL_PICTURE;
                    callback(video_profile_info, (profile_base_name + " Main Still Picture").c_str());
                    video_encode_h_265_profile_info_.stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_FORMAT_RANGE_EXTENSIONS;
                    callback(video_profile_info, (profile_base_name + " Format range extensions").c_str());
                    video_encode_h_265_profile_info_.stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_SCC_EXTENSIONS;
                    callback(video_profile_info, (profile_base_name + " Screen content coding extensions").c_str());
                }
                {
                    const std::string profile_base_name = "AV1 Encode" + base_format(chroma_subsampling, luma_bit_depth, chroma_bit_depth);
                    video_profile_info.pNext = nullptr;
                    video_profile_info.videoCodecOperation = VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR;
                    VkVideoEncodeAV1ProfileInfoKHR video_encode_av_1_profile_info_ = {VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PROFILE_INFO_KHR};
                    video_encode_av_1_profile_info_.pNext = video_profile_info.pNext;
                    video_profile_info.pNext = &video_encode_av_1_profile_info_;
                    video_encode_av_1_profile_info_.stdProfile = STD_VIDEO_AV1_PROFILE_MAIN;
                    callback(video_profile_info, (profile_base_name + " Main").c_str());
                    video_encode_av_1_profile_info_.stdProfile = STD_VIDEO_AV1_PROFILE_HIGH;
                    callback(video_profile_info, (profile_base_name + " High").c_str());
                    video_encode_av_1_profile_info_.stdProfile = STD_VIDEO_AV1_PROFILE_PROFESSIONAL;
                    callback(video_profile_info, (profile_base_name + " Professional").c_str());
                }
            }
        }
    }
}

// PhysicalDeviceData : creates and manages the simulated device configurations //////////////////////////////////////////////////

class PhysicalDeviceData {
   public:
    // Create a new PDD element during vkCreateInstance(), and preserve in map, indexed by physical_device.
    static PhysicalDeviceData &Create(VkPhysicalDevice pd, VkInstance instance) {
        assert(pd != VK_NULL_HANDLE);
        assert(instance != VK_NULL_HANDLE);
        assert(!Find(pd));  // Verify this instance does not already exist.

        const auto result = map().emplace(pd, instance);
        assert(result.second);  // true=insertion, false=replacement
        auto iter = result.first;
        PhysicalDeviceData *pdd = &iter->second;
        assert(Find(pd) == pdd);  // Verify we get the same instance we just inserted.
        return *pdd;
    }

    static void Destroy(const VkPhysicalDevice pd) {
        map().erase(pd);
    }

    // Find a PDD from our map, or nullptr if doesn't exist.
    static PhysicalDeviceData *Find(VkPhysicalDevice pd) {
        const auto iter = map().find(pd);
        return (iter != map().end()) ? &iter->second : nullptr;
    }

    static bool HasExtension(PhysicalDeviceData *pdd, const char *extension_name) {
        return pdd->device_extensions_.count(extension_name) > 0;
    }

    static bool HasSimulatedExtension(VkPhysicalDevice pd, const char *extension_name) {
        return HasSimulatedExtension(Find(pd), extension_name);
    }

    static bool HasSimulatedExtension(PhysicalDeviceData *pdd, const char *extension_name) {
        return pdd->simulation_extensions_.count(extension_name) > 0;
    }

    static bool HasSimulatedOrRealExtension(VkPhysicalDevice pd, const char *extension_name) {
        return HasSimulatedOrRealExtension(Find(pd), extension_name);
    }

    static bool HasSimulatedOrRealExtension(PhysicalDeviceData *pdd, const char *extension_name) {
        return HasSimulatedExtension(pdd, extension_name) || HasExtension(pdd, extension_name);
    }

    uint32_t GetEffectiveVersion() {
        return requested_version < physical_device_properties_.apiVersion ? requested_version
                                                                          : physical_device_properties_.apiVersion;

    }

    VkInstance instance() const { return instance_; }

    MapOfVkExtensionProperties device_extensions_{};
    MapOfVkFormatProperties device_formats_{};
    MapOfVkFormatProperties3 device_formats_3_{};
    ArrayOfVkQueueFamilyProperties device_queue_family_properties_{};
    SetOfVideoProfiles set_of_device_video_profiles_{};
    MapOfVkExtensionProperties simulation_extensions_{};
    VkPhysicalDeviceProperties physical_device_properties_{};
    VkPhysicalDeviceFeatures physical_device_features_{};
    VkPhysicalDeviceMemoryProperties physical_device_memory_properties_{};
    VkPhysicalDeviceToolProperties physical_device_tool_properties_{};
    VkSurfaceCapabilitiesKHR surface_capabilities_{};
    MapOfVkFormatProperties map_of_format_properties_{};
    MapOfVkFormatProperties3 map_of_format_properties_3_{};
    MapOfVkExtensionProperties map_of_extension_properties_{};
    ArrayOfVkQueueFamilyProperties arrayof_queue_family_properties_{};
    SetOfVideoProfiles set_of_video_profiles_{};

    // Space for array queries:
    //
    // - From VkPhysicalDeviceHostImageCopyPropertiesEXT
    std::vector<VkImageLayout> pCopySrcLayouts_;
    std::vector<VkImageLayout> pCopyDstLayouts_;

    bool vulkan_1_1_properties_written_;
    bool vulkan_1_2_properties_written_;
    bool vulkan_1_3_properties_written_;
    bool vulkan_1_4_properties_written_;

    bool vulkan_1_1_features_written_;
    bool vulkan_1_2_features_written_;
    bool vulkan_1_3_features_written_;
    bool vulkan_1_4_features_written_;

    // Core properties
    VkPhysicalDeviceSubgroupProperties physical_device_subgroup_properties_;
    VkPhysicalDeviceProtectedMemoryProperties physical_device_protected_memory_properties_;
    VkPhysicalDeviceVulkan11Properties physical_device_vulkan_11_properties_;
    VkPhysicalDeviceVulkan12Properties physical_device_vulkan_12_properties_;
    VkPhysicalDeviceVulkan13Properties physical_device_vulkan_13_properties_;
    VkPhysicalDeviceVulkan14Properties physical_device_vulkan_14_properties_;

    // Core features
    VkPhysicalDeviceProtectedMemoryFeatures physical_device_protected_memory_features_;
    VkPhysicalDeviceShaderDrawParametersFeatures physical_device_shader_draw_parameter_features_;
    VkPhysicalDeviceVulkan11Features physical_device_vulkan_11_features_;
    VkPhysicalDeviceVulkan12Features physical_device_vulkan_12_features_;
    VkPhysicalDeviceVulkan13Features physical_device_vulkan_13_features_;
    VkPhysicalDeviceVulkan14Features physical_device_vulkan_14_features_;

    // VK_EXT_transform_feedback structs
    VkPhysicalDeviceTransformFeedbackPropertiesEXT physical_device_transform_feedback_properties_;
    VkPhysicalDeviceTransformFeedbackFeaturesEXT physical_device_transform_feedback_features_;

    // VK_KHR_dynamic_rendering structs
    VkPhysicalDeviceDynamicRenderingFeaturesKHR physical_device_dynamic_rendering_features_;

    // VK_NV_corner_sampled_image structs
    VkPhysicalDeviceCornerSampledImageFeaturesNV physical_device_corner_sampled_image_features_;

    // VK_KHR_multiview structs
    VkPhysicalDeviceMultiviewPropertiesKHR physical_device_multiview_properties_;
    VkPhysicalDeviceMultiviewFeaturesKHR physical_device_multiview_features_;

    // VK_EXT_texture_compression_astc_hdr structs
    VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT physical_device_texture_compression_astchdrfeatures_;

    // VK_EXT_astc_decode_mode structs
    VkPhysicalDeviceASTCDecodeFeaturesEXT physical_device_astcdecode_features_;

    // VK_EXT_pipeline_robustness structs
    VkPhysicalDevicePipelineRobustnessPropertiesEXT physical_device_pipeline_robustness_properties_;
    VkPhysicalDevicePipelineRobustnessFeaturesEXT physical_device_pipeline_robustness_features_;

    // VK_KHR_external_memory_capabilities structs
    VkPhysicalDeviceIDPropertiesKHR physical_device_idproperties_;

    // VK_KHR_push_descriptor structs
    VkPhysicalDevicePushDescriptorPropertiesKHR physical_device_push_descriptor_properties_;

    // VK_EXT_conditional_rendering structs
    VkPhysicalDeviceConditionalRenderingFeaturesEXT physical_device_conditional_rendering_features_;

    // VK_KHR_shader_float16_int8 structs
    VkPhysicalDeviceFloat16Int8FeaturesKHR physical_device_float_16_int_8_features_;

    // VK_KHR_16bit_storage structs
    VkPhysicalDevice16BitStorageFeaturesKHR physical_device_16_bit_storage_features_;

    // VK_NVX_multiview_per_view_attributes structs
    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX physical_device_multiview_per_view_attributes_properties_;

    // VK_EXT_discard_rectangles structs
    VkPhysicalDeviceDiscardRectanglePropertiesEXT physical_device_discard_rectangle_properties_;

    // VK_EXT_conservative_rasterization structs
    VkPhysicalDeviceConservativeRasterizationPropertiesEXT physical_device_conservative_rasterization_properties_;

    // VK_EXT_depth_clip_enable structs
    VkPhysicalDeviceDepthClipEnableFeaturesEXT physical_device_depth_clip_enable_features_;

    // VK_KHR_imageless_framebuffer structs
    VkPhysicalDeviceImagelessFramebufferFeaturesKHR physical_device_imageless_framebuffer_features_;

    // VK_IMG_relaxed_line_rasterization structs
    VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG physical_device_relaxed_line_rasterization_features_;

    // VK_KHR_performance_query structs
    VkPhysicalDevicePerformanceQueryPropertiesKHR physical_device_performance_query_properties_;
    VkPhysicalDevicePerformanceQueryFeaturesKHR physical_device_performance_query_features_;

    // VK_KHR_maintenance2 structs
    VkPhysicalDevicePointClippingPropertiesKHR physical_device_point_clipping_properties_;

    // VK_KHR_variable_pointers structs
    VkPhysicalDeviceVariablePointerFeaturesKHR physical_device_variable_pointer_features_;

    // VK_EXT_sampler_filter_minmax structs
    VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT physical_device_sampler_filter_minmax_properties_;

    // VK_AMD_gpa_interface structs
    VkPhysicalDeviceGpaPropertiesAMD physical_device_gpa_properties_;
    VkPhysicalDeviceGpaProperties2AMD physical_device_gpa_properties_2_;
    VkPhysicalDeviceGpaFeaturesAMD physical_device_gpa_features_;

    // VK_AMDX_shader_enqueue structs
#ifdef VK_ENABLE_BETA_EXTENSIONS
    VkPhysicalDeviceShaderEnqueuePropertiesAMDX physical_device_shader_enqueue_properties_;
    VkPhysicalDeviceShaderEnqueueFeaturesAMDX physical_device_shader_enqueue_features_;
#endif // VK_ENABLE_BETA_EXTENSIONS

    // VK_EXT_descriptor_heap structs
    VkPhysicalDeviceDescriptorHeapPropertiesEXT physical_device_descriptor_heap_properties_;
    VkPhysicalDeviceDescriptorHeapTensorPropertiesARM physical_device_descriptor_heap_tensor_properties_;
    VkPhysicalDeviceDescriptorHeapFeaturesEXT physical_device_descriptor_heap_features_;

    // VK_EXT_inline_uniform_block structs
    VkPhysicalDeviceInlineUniformBlockPropertiesEXT physical_device_inline_uniform_block_properties_;
    VkPhysicalDeviceInlineUniformBlockFeaturesEXT physical_device_inline_uniform_block_features_;

    // VK_KHR_shader_bfloat16 structs
    VkPhysicalDeviceShaderBfloat16FeaturesKHR physical_device_shader_bfloat_16_features_;

    // VK_EXT_sample_locations structs
    VkPhysicalDeviceSampleLocationsPropertiesEXT physical_device_sample_locations_properties_;

    // VK_EXT_blend_operation_advanced structs
    VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT physical_device_blend_operation_advanced_properties_;
    VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT physical_device_blend_operation_advanced_features_;

    // VK_KHR_acceleration_structure structs
    VkPhysicalDeviceAccelerationStructurePropertiesKHR physical_device_acceleration_structure_properties_;
    VkPhysicalDeviceAccelerationStructureFeaturesKHR physical_device_acceleration_structure_features_;

    // VK_KHR_ray_tracing_pipeline structs
    VkPhysicalDeviceRayTracingPipelinePropertiesKHR physical_device_ray_tracing_pipeline_properties_;
    VkPhysicalDeviceRayTracingPipelineFeaturesKHR physical_device_ray_tracing_pipeline_features_;

    // VK_KHR_ray_query structs
    VkPhysicalDeviceRayQueryFeaturesKHR physical_device_ray_query_features_;

    // VK_NV_shader_sm_builtins structs
    VkPhysicalDeviceShaderSMBuiltinsPropertiesNV physical_device_shader_smbuiltins_properties_;
    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV physical_device_shader_smbuiltins_features_;

    // VK_KHR_sampler_ycbcr_conversion structs
    VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR physical_device_sampler_ycbcr_conversion_features_;

    // VK_EXT_descriptor_indexing structs
    VkPhysicalDeviceDescriptorIndexingPropertiesEXT physical_device_descriptor_indexing_properties_;
    VkPhysicalDeviceDescriptorIndexingFeaturesEXT physical_device_descriptor_indexing_features_;

    // VK_KHR_portability_subset structs
#ifdef VK_ENABLE_BETA_EXTENSIONS
    VkPhysicalDevicePortabilitySubsetPropertiesKHR physical_device_portability_subset_properties_;
    VkPhysicalDevicePortabilitySubsetFeaturesKHR physical_device_portability_subset_features_;
#endif // VK_ENABLE_BETA_EXTENSIONS

    // VK_NV_shading_rate_image structs
    VkPhysicalDeviceShadingRateImagePropertiesNV physical_device_shading_rate_image_properties_;
    VkPhysicalDeviceShadingRateImageFeaturesNV physical_device_shading_rate_image_features_;

    // VK_NV_ray_tracing structs
    VkPhysicalDeviceRayTracingPropertiesNV physical_device_ray_tracing_properties_;

    // VK_NV_representative_fragment_test structs
    VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV physical_device_representative_fragment_test_features_;

    // VK_KHR_maintenance3 structs
    VkPhysicalDeviceMaintenance3PropertiesKHR physical_device_maintenance_3_properties_;

    // VK_QCOM_cooperative_matrix_conversion structs
    VkPhysicalDeviceCooperativeMatrixConversionFeaturesQCOM physical_device_cooperative_matrix_conversion_features_;

    // VK_QCOM_elapsed_timer_query structs
    VkPhysicalDeviceElapsedTimerQueryFeaturesQCOM physical_device_elapsed_timer_query_features_;

    // VK_KHR_shader_subgroup_extended_types structs
    VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR physical_device_shader_subgroup_extended_types_features_;

    // VK_KHR_8bit_storage structs
    VkPhysicalDevice8BitStorageFeaturesKHR physical_device_8_bit_storage_features_;

    // VK_EXT_external_memory_host structs
    VkPhysicalDeviceExternalMemoryHostPropertiesEXT physical_device_external_memory_host_properties_;

    // VK_KHR_shader_atomic_int64 structs
    VkPhysicalDeviceShaderAtomicInt64FeaturesKHR physical_device_shader_atomic_int_64_features_;

    // VK_KHR_shader_clock structs
    VkPhysicalDeviceShaderClockFeaturesKHR physical_device_shader_clock_features_;

    // VK_AMD_shader_core_properties structs
    VkPhysicalDeviceShaderCorePropertiesAMD physical_device_shader_core_properties_;

    // VK_EXT_vertex_attribute_divisor structs
    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT physical_device_vertex_attribute_divisor_properties_ext_;
    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT physical_device_vertex_attribute_divisor_features_;

    // VK_KHR_driver_properties structs
    VkPhysicalDeviceDriverPropertiesKHR physical_device_driver_properties_;

    // VK_KHR_shader_float_controls structs
    VkPhysicalDeviceFloatControlsPropertiesKHR physical_device_float_controls_properties_;

    // VK_KHR_depth_stencil_resolve structs
    VkPhysicalDeviceDepthStencilResolvePropertiesKHR physical_device_depth_stencil_resolve_properties_;

    // VK_NV_compute_shader_derivatives structs
    VkPhysicalDeviceComputeShaderDerivativesFeaturesNV physical_device_compute_shader_derivatives_features_;

    // VK_NV_mesh_shader structs
    VkPhysicalDeviceMeshShaderPropertiesNV physical_device_mesh_shader_properties_nv_;
    VkPhysicalDeviceMeshShaderFeaturesNV physical_device_mesh_shader_features_nv_;

    // VK_NV_fragment_shader_barycentric structs
    VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV physical_device_fragment_shader_barycentric_features_;

    // VK_NV_shader_image_footprint structs
    VkPhysicalDeviceShaderImageFootprintFeaturesNV physical_device_shader_image_footprint_features_;

    // VK_NV_scissor_exclusive structs
    VkPhysicalDeviceExclusiveScissorFeaturesNV physical_device_exclusive_scissor_features_;

    // VK_KHR_timeline_semaphore structs
    VkPhysicalDeviceTimelineSemaphorePropertiesKHR physical_device_timeline_semaphore_properties_;
    VkPhysicalDeviceTimelineSemaphoreFeaturesKHR physical_device_timeline_semaphore_features_;

    // VK_EXT_present_timing structs
    VkPhysicalDevicePresentTimingFeaturesEXT physical_device_present_timing_features_;

    // VK_INTEL_shader_integer_functions2 structs
    VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL physical_device_shader_integer_functions_2_features_;

    // VK_KHR_vulkan_memory_model structs
    VkPhysicalDeviceVulkanMemoryModelFeaturesKHR physical_device_vulkan_memory_model_features_;

    // VK_EXT_pci_bus_info structs
    VkPhysicalDevicePCIBusInfoPropertiesEXT physical_device_pcibus_info_properties_;

    // VK_KHR_shader_terminate_invocation structs
    VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR physical_device_shader_terminate_invocation_features_;

    // VK_EXT_fragment_density_map structs
    VkPhysicalDeviceFragmentDensityMapPropertiesEXT physical_device_fragment_density_map_properties_;
    VkPhysicalDeviceFragmentDensityMapFeaturesEXT physical_device_fragment_density_map_features_;

    // VK_EXT_scalar_block_layout structs
    VkPhysicalDeviceScalarBlockLayoutFeaturesEXT physical_device_scalar_block_layout_features_;

    // VK_EXT_subgroup_size_control structs
    VkPhysicalDeviceSubgroupSizeControlPropertiesEXT physical_device_subgroup_size_control_properties_;
    VkPhysicalDeviceSubgroupSizeControlFeaturesEXT physical_device_subgroup_size_control_features_;

    // VK_KHR_fragment_shading_rate structs
    VkPhysicalDeviceFragmentShadingRatePropertiesKHR physical_device_fragment_shading_rate_properties_;
    VkPhysicalDeviceFragmentShadingRateFeaturesKHR physical_device_fragment_shading_rate_features_;

    // VK_AMD_shader_core_properties2 structs
    VkPhysicalDeviceShaderCoreProperties2AMD physical_device_shader_core_properties_2_;

    // VK_AMD_device_coherent_memory structs
    VkPhysicalDeviceCoherentMemoryFeaturesAMD physical_device_coherent_memory_features_;

    // VK_KHR_shader_constant_data structs
    VkPhysicalDeviceShaderConstantDataFeaturesKHR physical_device_shader_constant_data_features_;

    // VK_KHR_dynamic_rendering_local_read structs
    VkPhysicalDeviceDynamicRenderingLocalReadFeaturesKHR physical_device_dynamic_rendering_local_read_features_;

    // VK_KHR_shader_abort structs
    VkPhysicalDeviceShaderAbortPropertiesKHR physical_device_shader_abort_properties_;
    VkPhysicalDeviceShaderAbortFeaturesKHR physical_device_shader_abort_features_;

    // VK_EXT_shader_image_atomic_int64 structs
    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT physical_device_shader_image_atomic_int_64_features_;

    // VK_KHR_shader_quad_control structs
    VkPhysicalDeviceShaderQuadControlFeaturesKHR physical_device_shader_quad_control_features_;

    // VK_EXT_memory_priority structs
    VkPhysicalDeviceMemoryPriorityFeaturesEXT physical_device_memory_priority_features_;

    // VK_NV_dedicated_allocation_image_aliasing structs
    VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV physical_device_dedicated_allocation_image_aliasing_features_;

    // VK_KHR_separate_depth_stencil_layouts structs
    VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR physical_device_separate_depth_stencil_layouts_features_;

    // VK_EXT_buffer_device_address structs
    VkPhysicalDeviceBufferAddressFeaturesEXT physical_device_buffer_address_features_;

    // VK_KHR_present_wait structs
    VkPhysicalDevicePresentWaitFeaturesKHR physical_device_present_wait_features_;

    // VK_NV_cooperative_matrix structs
    VkPhysicalDeviceCooperativeMatrixPropertiesNV physical_device_cooperative_matrix_properties_nv_;
    VkPhysicalDeviceCooperativeMatrixFeaturesNV physical_device_cooperative_matrix_features_nv_;

    // VK_NV_coverage_reduction_mode structs
    VkPhysicalDeviceCoverageReductionModeFeaturesNV physical_device_coverage_reduction_mode_features_;

    // VK_EXT_fragment_shader_interlock structs
    VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT physical_device_fragment_shader_interlock_features_;

    // VK_EXT_ycbcr_image_arrays structs
    VkPhysicalDeviceYcbcrImageArraysFeaturesEXT physical_device_ycbcr_image_arrays_features_;

    // VK_KHR_uniform_buffer_standard_layout structs
    VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR physical_device_uniform_buffer_standard_layout_features_;

    // VK_EXT_provoking_vertex structs
    VkPhysicalDeviceProvokingVertexPropertiesEXT physical_device_provoking_vertex_properties_;
    VkPhysicalDeviceProvokingVertexFeaturesEXT physical_device_provoking_vertex_features_;

    // VK_KHR_buffer_device_address structs
    VkPhysicalDeviceBufferDeviceAddressFeaturesKHR physical_device_buffer_device_address_features_;

    // VK_EXT_line_rasterization structs
    VkPhysicalDeviceLineRasterizationPropertiesEXT physical_device_line_rasterization_properties_;
    VkPhysicalDeviceLineRasterizationFeaturesEXT physical_device_line_rasterization_features_;

    // VK_EXT_shader_atomic_float structs
    VkPhysicalDeviceShaderAtomicFloatFeaturesEXT physical_device_shader_atomic_float_features_;

    // VK_EXT_host_query_reset structs
    VkPhysicalDeviceHostQueryResetFeaturesEXT physical_device_host_query_reset_features_;

    // VK_EXT_index_type_uint8 structs
    VkPhysicalDeviceIndexTypeUint8FeaturesEXT physical_device_index_type_uint_8_features_;

    // VK_EXT_extended_dynamic_state structs
    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT physical_device_extended_dynamic_state_features_;

    // VK_KHR_pipeline_executable_properties structs
    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR physical_device_pipeline_executable_properties_features_;

    // VK_EXT_host_image_copy structs
    VkPhysicalDeviceHostImageCopyPropertiesEXT physical_device_host_image_copy_properties_;
    VkPhysicalDeviceHostImageCopyFeaturesEXT physical_device_host_image_copy_features_;

    // VK_EXT_map_memory_placed structs
    VkPhysicalDeviceMapMemoryPlacedPropertiesEXT physical_device_map_memory_placed_properties_;
    VkPhysicalDeviceMapMemoryPlacedFeaturesEXT physical_device_map_memory_placed_features_;

    // VK_EXT_shader_atomic_float2 structs
    VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT physical_device_shader_atomic_float_2_features_;

    // VK_EXT_swapchain_maintenance1 structs
    VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT physical_device_swapchain_maintenance_1_features_;

    // VK_EXT_shader_demote_to_helper_invocation structs
    VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT physical_device_shader_demote_to_helper_invocation_features_;

    // VK_NV_device_generated_commands structs
    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV physical_device_device_generated_commands_properties_nv_;
    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV physical_device_device_generated_commands_features_nv_;

    // VK_NV_inherited_viewport_scissor structs
    VkPhysicalDeviceInheritedViewportScissorFeaturesNV physical_device_inherited_viewport_scissor_features_;

    // VK_KHR_shader_integer_dot_product structs
    VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR physical_device_shader_integer_dot_product_properties_;
    VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR physical_device_shader_integer_dot_product_features_;

    // VK_EXT_texel_buffer_alignment structs
    VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT physical_device_texel_buffer_alignment_properties_;
    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT physical_device_texel_buffer_alignment_features_;

    // VK_EXT_depth_bias_control structs
    VkPhysicalDeviceDepthBiasControlFeaturesEXT physical_device_depth_bias_control_features_;

    // VK_EXT_device_memory_report structs
    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT physical_device_device_memory_report_features_;

    // VK_EXT_robustness2 structs
    VkPhysicalDeviceRobustness2PropertiesEXT physical_device_robustness_2_properties_;
    VkPhysicalDeviceRobustness2FeaturesEXT physical_device_robustness_2_features_;

    // VK_EXT_custom_border_color structs
    VkPhysicalDeviceCustomBorderColorPropertiesEXT physical_device_custom_border_color_properties_;
    VkPhysicalDeviceCustomBorderColorFeaturesEXT physical_device_custom_border_color_features_;

    // VK_EXT_texture_compression_astc_3d structs
    VkPhysicalDeviceTextureCompressionASTC3DFeaturesEXT physical_device_texture_compression_astc_3_dfeatures_;

    // VK_NV_present_barrier structs
    VkPhysicalDevicePresentBarrierFeaturesNV physical_device_present_barrier_features_;

    // VK_KHR_present_id structs
    VkPhysicalDevicePresentIdFeaturesKHR physical_device_present_id_features_;

    // VK_EXT_private_data structs
    VkPhysicalDevicePrivateDataFeaturesEXT physical_device_private_data_features_;

    // VK_EXT_pipeline_creation_cache_control structs
    VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT physical_device_pipeline_creation_cache_control_features_;

    // VK_NV_device_diagnostics_config structs
    VkPhysicalDeviceDiagnosticsConfigFeaturesNV physical_device_diagnostics_config_features_;

    // VK_QCOM_queue_perf_hint structs
    VkPhysicalDeviceQueuePerfHintPropertiesQCOM physical_device_queue_perf_hint_properties_;
    VkPhysicalDeviceQueuePerfHintFeaturesQCOM physical_device_queue_perf_hint_features_;

    // VK_QCOM_image_processing3 structs
    VkPhysicalDeviceImageProcessing3FeaturesQCOM physical_device_image_processing_3_features_;

    // VK_QCOM_shader_multiple_wait_queues structs
    VkPhysicalDeviceShaderMultipleWaitQueuesPropertiesQCOM physical_device_shader_multiple_wait_queues_properties_;
    VkPhysicalDeviceShaderMultipleWaitQueuesFeaturesQCOM physical_device_shader_multiple_wait_queues_features_;

    // VK_EXT_shader_split_barrier structs
    VkPhysicalDeviceShaderSplitBarrierPropertiesEXT physical_device_shader_split_barrier_properties_;
    VkPhysicalDeviceShaderSplitBarrierFeaturesEXT physical_device_shader_split_barrier_features_;

    // VK_NV_cuda_kernel_launch structs
#ifdef VK_ENABLE_BETA_EXTENSIONS
    VkPhysicalDeviceCudaKernelLaunchPropertiesNV physical_device_cuda_kernel_launch_properties_;
    VkPhysicalDeviceCudaKernelLaunchFeaturesNV physical_device_cuda_kernel_launch_features_;
#endif // VK_ENABLE_BETA_EXTENSIONS

    // VK_QCOM_tile_shading structs
    VkPhysicalDeviceTileShadingPropertiesQCOM physical_device_tile_shading_properties_;
    VkPhysicalDeviceTileShadingFeaturesQCOM physical_device_tile_shading_features_;

    // VK_KHR_synchronization2 structs
    VkPhysicalDeviceSynchronization2FeaturesKHR physical_device_synchronization_2_features_;

    // VK_EXT_descriptor_buffer structs
    VkPhysicalDeviceDescriptorBufferPropertiesEXT physical_device_descriptor_buffer_properties_;
    VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT physical_device_descriptor_buffer_density_map_properties_;
    VkPhysicalDeviceDescriptorBufferFeaturesEXT physical_device_descriptor_buffer_features_;

    // VK_KHR_device_address_commands structs
    VkPhysicalDeviceDeviceAddressCommandsFeaturesKHR physical_device_device_address_commands_features_;

    // VK_EXT_graphics_pipeline_library structs
    VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT physical_device_graphics_pipeline_library_properties_;
    VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT physical_device_graphics_pipeline_library_features_;

    // VK_AMD_shader_early_and_late_fragment_tests structs
    VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD physical_device_shader_early_and_late_fragment_tests_features_;

    // VK_KHR_fragment_shader_barycentric structs
    VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR physical_device_fragment_shader_barycentric_properties_;

    // VK_KHR_shader_subgroup_uniform_control_flow structs
    VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR physical_device_shader_subgroup_uniform_control_flow_features_;

    // VK_KHR_zero_initialize_workgroup_memory structs
    VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR physical_device_zero_initialize_workgroup_memory_features_;

    // VK_NV_fragment_shading_rate_enums structs
    VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV physical_device_fragment_shading_rate_enums_properties_;
    VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV physical_device_fragment_shading_rate_enums_features_;

    // VK_NV_ray_tracing_motion_blur structs
    VkPhysicalDeviceRayTracingMotionBlurFeaturesNV physical_device_ray_tracing_motion_blur_features_;

    // VK_EXT_mesh_shader structs
    VkPhysicalDeviceMeshShaderPropertiesEXT physical_device_mesh_shader_properties_;
    VkPhysicalDeviceMeshShaderFeaturesEXT physical_device_mesh_shader_features_;

    // VK_EXT_ycbcr_2plane_444_formats structs
    VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT physical_device_ycbcr_2_plane_444_formats_features_;

    // VK_EXT_fragment_density_map2 structs
    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT physical_device_fragment_density_map_2_properties_;
    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT physical_device_fragment_density_map_2_features_;

    // VK_EXT_image_robustness structs
    VkPhysicalDeviceImageRobustnessFeaturesEXT physical_device_image_robustness_features_;

    // VK_KHR_workgroup_memory_explicit_layout structs
    VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR physical_device_workgroup_memory_explicit_layout_features_;

    // VK_EXT_image_compression_control structs
    VkPhysicalDeviceImageCompressionControlFeaturesEXT physical_device_image_compression_control_features_;

    // VK_EXT_attachment_feedback_loop_layout structs
    VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT physical_device_attachment_feedback_loop_layout_features_;

    // VK_EXT_4444_formats structs
    VkPhysicalDevice4444FormatsFeaturesEXT physical_device_4444_formats_features_;

    // VK_EXT_device_fault structs
    VkPhysicalDeviceFaultFeaturesEXT physical_device_fault_features_ext_;

    // VK_ARM_rasterization_order_attachment_access structs
    VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM physical_device_rasterization_order_attachment_access_features_;

    // VK_EXT_rgba10x6_formats structs
    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT physical_device_rgba_10_x_6_formats_features_;

    // VK_VALVE_mutable_descriptor_type structs
    VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE physical_device_mutable_descriptor_type_features_;

    // VK_EXT_vertex_input_dynamic_state structs
    VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT physical_device_vertex_input_dynamic_state_features_;

    // VK_EXT_physical_device_drm structs
    VkPhysicalDeviceDrmPropertiesEXT physical_device_drm_properties_;

    // VK_EXT_device_address_binding_report structs
    VkPhysicalDeviceAddressBindingReportFeaturesEXT physical_device_address_binding_report_features_;

    // VK_EXT_depth_clip_control structs
    VkPhysicalDeviceDepthClipControlFeaturesEXT physical_device_depth_clip_control_features_;

    // VK_EXT_primitive_topology_list_restart structs
    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT physical_device_primitive_topology_list_restart_features_;

    // VK_EXT_present_mode_fifo_latest_ready structs
    VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT physical_device_present_mode_fifo_latest_ready_features_;

    // VK_HUAWEI_subpass_shading structs
    VkPhysicalDeviceSubpassShadingPropertiesHUAWEI physical_device_subpass_shading_properties_;
    VkPhysicalDeviceSubpassShadingFeaturesHUAWEI physical_device_subpass_shading_features_;

    // VK_HUAWEI_invocation_mask structs
    VkPhysicalDeviceInvocationMaskFeaturesHUAWEI physical_device_invocation_mask_features_;

    // VK_NV_external_memory_rdma structs
    VkPhysicalDeviceExternalMemoryRDMAFeaturesNV physical_device_external_memory_rdmafeatures_;

    // VK_EXT_pipeline_properties structs
    VkPhysicalDevicePipelinePropertiesFeaturesEXT physical_device_pipeline_properties_features_;

    // VK_EXT_frame_boundary structs
    VkPhysicalDeviceFrameBoundaryFeaturesEXT physical_device_frame_boundary_features_;

    // VK_EXT_multisampled_render_to_single_sampled structs
    VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT physical_device_multisampled_render_to_single_sampled_features_;

    // VK_EXT_extended_dynamic_state2 structs
    VkPhysicalDeviceExtendedDynamicState2FeaturesEXT physical_device_extended_dynamic_state_2_features_;

    // VK_EXT_color_write_enable structs
    VkPhysicalDeviceColorWriteEnableFeaturesEXT physical_device_color_write_enable_features_;

    // VK_EXT_primitives_generated_query structs
    VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT physical_device_primitives_generated_query_features_;

    // VK_KHR_ray_tracing_maintenance1 structs
    VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR physical_device_ray_tracing_maintenance_1_features_;

    // VK_KHR_shader_untyped_pointers structs
    VkPhysicalDeviceShaderUntypedPointersFeaturesKHR physical_device_shader_untyped_pointers_features_;

    // VK_EXT_global_priority_query structs
    VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT physical_device_global_priority_query_features_;

    // VK_VALVE_video_encode_rgb_conversion structs
    VkPhysicalDeviceVideoEncodeRgbConversionFeaturesVALVE physical_device_video_encode_rgb_conversion_features_;

    // VK_EXT_image_view_min_lod structs
    VkPhysicalDeviceImageViewMinLodFeaturesEXT physical_device_image_view_min_lod_features_;

    // VK_EXT_multi_draw structs
    VkPhysicalDeviceMultiDrawPropertiesEXT physical_device_multi_draw_properties_;
    VkPhysicalDeviceMultiDrawFeaturesEXT physical_device_multi_draw_features_;

    // VK_EXT_image_2d_view_of_3d structs
    VkPhysicalDeviceImage2DViewOf3DFeaturesEXT physical_device_image_2_dview_of_3_dfeatures_;

    // VK_EXT_shader_tile_image structs
    VkPhysicalDeviceShaderTileImagePropertiesEXT physical_device_shader_tile_image_properties_;
    VkPhysicalDeviceShaderTileImageFeaturesEXT physical_device_shader_tile_image_features_;

    // VK_EXT_opacity_micromap structs
    VkPhysicalDeviceOpacityMicromapPropertiesEXT physical_device_opacity_micromap_properties_ext_;
    VkPhysicalDeviceOpacityMicromapFeaturesEXT physical_device_opacity_micromap_features_ext_;

    // VK_NV_displacement_micromap structs
#ifdef VK_ENABLE_BETA_EXTENSIONS
    VkPhysicalDeviceDisplacementMicromapPropertiesNV physical_device_displacement_micromap_properties_;
    VkPhysicalDeviceDisplacementMicromapFeaturesNV physical_device_displacement_micromap_features_;
#endif // VK_ENABLE_BETA_EXTENSIONS

    // VK_HUAWEI_cluster_culling_shader structs
    VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI physical_device_cluster_culling_shader_properties_;
    VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI physical_device_cluster_culling_shader_features_;

    // VK_EXT_border_color_swizzle structs
    VkPhysicalDeviceBorderColorSwizzleFeaturesEXT physical_device_border_color_swizzle_features_;

    // VK_EXT_pageable_device_local_memory structs
    VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT physical_device_pageable_device_local_memory_features_;

    // VK_KHR_maintenance4 structs
    VkPhysicalDeviceMaintenance4PropertiesKHR physical_device_maintenance_4_properties_;
    VkPhysicalDeviceMaintenance4FeaturesKHR physical_device_maintenance_4_features_;

    // VK_ARM_shader_core_properties structs
    VkPhysicalDeviceShaderCorePropertiesARM physical_device_shader_core_properties_arm_;

    // VK_KHR_shader_subgroup_rotate structs
    VkPhysicalDeviceShaderSubgroupRotateFeaturesKHR physical_device_shader_subgroup_rotate_features_;

    // VK_ARM_scheduling_controls structs
    VkPhysicalDeviceSchedulingControlsPropertiesARM physical_device_scheduling_controls_properties_;
    VkPhysicalDeviceSchedulingControlsDispatchParametersPropertiesARM physical_device_scheduling_controls_dispatch_parameters_properties_;
    VkPhysicalDeviceSchedulingControlsFeaturesARM physical_device_scheduling_controls_features_;

    // VK_EXT_image_sliced_view_of_3d structs
    VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT physical_device_image_sliced_view_of_3_dfeatures_;

    // VK_VALVE_descriptor_set_host_mapping structs
    VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE physical_device_descriptor_set_host_mapping_features_;

    // VK_EXT_depth_clamp_zero_one structs
    VkPhysicalDeviceDepthClampZeroOneFeaturesEXT physical_device_depth_clamp_zero_one_features_;

    // VK_EXT_non_seamless_cube_map structs
    VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT physical_device_non_seamless_cube_map_features_;

    // VK_ARM_render_pass_striped structs
    VkPhysicalDeviceRenderPassStripedPropertiesARM physical_device_render_pass_striped_properties_;
    VkPhysicalDeviceRenderPassStripedFeaturesARM physical_device_render_pass_striped_features_;

    // VK_QCOM_fragment_density_map_offset structs
    VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM physical_device_fragment_density_map_offset_properties_;
    VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM physical_device_fragment_density_map_offset_features_;

    // VK_NV_copy_memory_indirect structs
    VkPhysicalDeviceCopyMemoryIndirectPropertiesNV physical_device_copy_memory_indirect_properties_;
    VkPhysicalDeviceCopyMemoryIndirectFeaturesNV physical_device_copy_memory_indirect_features_nv_;

    // VK_NV_memory_decompression structs
    VkPhysicalDeviceMemoryDecompressionPropertiesNV physical_device_memory_decompression_properties_;
    VkPhysicalDeviceMemoryDecompressionFeaturesNV physical_device_memory_decompression_features_;

    // VK_NV_device_generated_commands_compute structs
    VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV physical_device_device_generated_commands_compute_features_;

    // VK_NV_ray_tracing_linear_swept_spheres structs
    VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV physical_device_ray_tracing_linear_swept_spheres_features_;

    // VK_NV_linear_color_attachment structs
    VkPhysicalDeviceLinearColorAttachmentFeaturesNV physical_device_linear_color_attachment_features_;

    // VK_KHR_shader_maximal_reconvergence structs
    VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR physical_device_shader_maximal_reconvergence_features_;

    // VK_EXT_image_compression_control_swapchain structs
    VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT physical_device_image_compression_control_swapchain_features_;

    // VK_QCOM_image_processing structs
    VkPhysicalDeviceImageProcessingPropertiesQCOM physical_device_image_processing_properties_;
    VkPhysicalDeviceImageProcessingFeaturesQCOM physical_device_image_processing_features_;

    // VK_EXT_nested_command_buffer structs
    VkPhysicalDeviceNestedCommandBufferPropertiesEXT physical_device_nested_command_buffer_properties_;
    VkPhysicalDeviceNestedCommandBufferFeaturesEXT physical_device_nested_command_buffer_features_;

    // VK_EXT_extended_dynamic_state3 structs
    VkPhysicalDeviceExtendedDynamicState3PropertiesEXT physical_device_extended_dynamic_state_3_properties_;
    VkPhysicalDeviceExtendedDynamicState3FeaturesEXT physical_device_extended_dynamic_state_3_features_;

    // VK_EXT_subpass_merge_feedback structs
    VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT physical_device_subpass_merge_feedback_features_;

    // VK_ARM_tensors structs
    VkPhysicalDeviceTensorPropertiesARM physical_device_tensor_properties_;
    VkPhysicalDeviceDescriptorBufferTensorPropertiesARM physical_device_descriptor_buffer_tensor_properties_;
    VkPhysicalDeviceTensorFeaturesARM physical_device_tensor_features_;
    VkPhysicalDeviceDescriptorBufferTensorFeaturesARM physical_device_descriptor_buffer_tensor_features_;

    // VK_EXT_shader_module_identifier structs
    VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT physical_device_shader_module_identifier_properties_;
    VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT physical_device_shader_module_identifier_features_;

    // VK_NV_optical_flow structs
    VkPhysicalDeviceOpticalFlowPropertiesNV physical_device_optical_flow_properties_;
    VkPhysicalDeviceOpticalFlowFeaturesNV physical_device_optical_flow_features_;

    // VK_EXT_legacy_dithering structs
    VkPhysicalDeviceLegacyDitheringFeaturesEXT physical_device_legacy_dithering_features_;

    // VK_EXT_pipeline_protected_access structs
    VkPhysicalDevicePipelineProtectedAccessFeaturesEXT physical_device_pipeline_protected_access_features_;

    // VK_ANDROID_external_format_resolve structs
#ifdef VK_USE_PLATFORM_ANDROID_KHR
    VkPhysicalDeviceExternalFormatResolvePropertiesANDROID physical_device_external_format_resolve_properties_;
    VkPhysicalDeviceExternalFormatResolveFeaturesANDROID physical_device_external_format_resolve_features_;
#endif // VK_USE_PLATFORM_ANDROID_KHR

    // VK_KHR_maintenance5 structs
    VkPhysicalDeviceMaintenance5PropertiesKHR physical_device_maintenance_5_properties_;
    VkPhysicalDeviceMaintenance5FeaturesKHR physical_device_maintenance_5_features_;

    // VK_AMD_anti_lag structs
    VkPhysicalDeviceAntiLagFeaturesAMD physical_device_anti_lag_features_;

    // VK_AMDX_dense_geometry_format structs
#ifdef VK_ENABLE_BETA_EXTENSIONS
    VkPhysicalDeviceDenseGeometryFormatFeaturesAMDX physical_device_dense_geometry_format_features_;
#endif // VK_ENABLE_BETA_EXTENSIONS

    // VK_KHR_present_id2 structs
    VkPhysicalDevicePresentId2FeaturesKHR physical_device_present_id_2_features_;

    // VK_KHR_present_wait2 structs
    VkPhysicalDevicePresentWait2FeaturesKHR physical_device_present_wait_2_features_;

    // VK_KHR_ray_tracing_position_fetch structs
    VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR physical_device_ray_tracing_position_fetch_features_;

    // VK_EXT_shader_object structs
    VkPhysicalDeviceShaderObjectPropertiesEXT physical_device_shader_object_properties_;
    VkPhysicalDeviceShaderObjectFeaturesEXT physical_device_shader_object_features_;

    // VK_KHR_pipeline_binary structs
    VkPhysicalDevicePipelineBinaryPropertiesKHR physical_device_pipeline_binary_properties_;
    VkPhysicalDevicePipelineBinaryFeaturesKHR physical_device_pipeline_binary_features_;

    // VK_QCOM_tile_properties structs
    VkPhysicalDeviceTilePropertiesFeaturesQCOM physical_device_tile_properties_features_;

    // VK_SEC_amigo_profiling structs
    VkPhysicalDeviceAmigoProfilingFeaturesSEC physical_device_amigo_profiling_features_;

    // VK_QCOM_multiview_per_view_viewports structs
    VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM physical_device_multiview_per_view_viewports_features_;

    // VK_NV_ray_tracing_invocation_reorder structs
    VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV physical_device_ray_tracing_invocation_reorder_properties_nv_;
    VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV physical_device_ray_tracing_invocation_reorder_features_nv_;

    // VK_NV_cooperative_vector structs
    VkPhysicalDeviceCooperativeVectorPropertiesNV physical_device_cooperative_vector_properties_;
    VkPhysicalDeviceCooperativeVectorFeaturesNV physical_device_cooperative_vector_features_;

    // VK_NV_extended_sparse_address_space structs
    VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV physical_device_extended_sparse_address_space_properties_;
    VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV physical_device_extended_sparse_address_space_features_;

    // VK_EXT_legacy_vertex_attributes structs
    VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT physical_device_legacy_vertex_attributes_properties_;
    VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT physical_device_legacy_vertex_attributes_features_;

    // VK_ARM_shader_core_builtins structs
    VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM physical_device_shader_core_builtins_properties_;
    VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM physical_device_shader_core_builtins_features_;

    // VK_EXT_pipeline_library_group_handles structs
    VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT physical_device_pipeline_library_group_handles_features_;

    // VK_EXT_dynamic_rendering_unused_attachments structs
    VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT physical_device_dynamic_rendering_unused_attachments_features_;

    // VK_KHR_internally_synchronized_queues structs
    VkPhysicalDeviceInternallySynchronizedQueuesFeaturesKHR physical_device_internally_synchronized_queues_features_;

    // VK_KHR_cooperative_matrix structs
    VkPhysicalDeviceCooperativeMatrixPropertiesKHR physical_device_cooperative_matrix_properties_;
    VkPhysicalDeviceCooperativeMatrixFeaturesKHR physical_device_cooperative_matrix_features_;

    // VK_ARM_data_graph structs
    VkPhysicalDeviceDataGraphFeaturesARM physical_device_data_graph_features_;

    // VK_QCOM_multiview_per_view_render_areas structs
    VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM physical_device_multiview_per_view_render_areas_features_;

    // VK_KHR_compute_shader_derivatives structs
    VkPhysicalDeviceComputeShaderDerivativesPropertiesKHR physical_device_compute_shader_derivatives_properties_;

    // VK_KHR_video_encode_av1 structs
    VkPhysicalDeviceVideoEncodeAV1FeaturesKHR physical_device_video_encode_av_1_features_;

    // VK_KHR_video_decode_vp9 structs
    VkPhysicalDeviceVideoDecodeVP9FeaturesKHR physical_device_video_decode_vp_9_features_;

    // VK_KHR_video_maintenance1 structs
    VkPhysicalDeviceVideoMaintenance1FeaturesKHR physical_device_video_maintenance_1_features_;

    // VK_NV_per_stage_descriptor_set structs
    VkPhysicalDevicePerStageDescriptorSetFeaturesNV physical_device_per_stage_descriptor_set_features_;

    // VK_QCOM_image_processing2 structs
    VkPhysicalDeviceImageProcessing2PropertiesQCOM physical_device_image_processing_2_properties_;
    VkPhysicalDeviceImageProcessing2FeaturesQCOM physical_device_image_processing_2_features_;

    // VK_QCOM_filter_cubic_weights structs
    VkPhysicalDeviceCubicWeightsFeaturesQCOM physical_device_cubic_weights_features_;

    // VK_QCOM_ycbcr_degamma structs
    VkPhysicalDeviceYcbcrDegammaFeaturesQCOM physical_device_ycbcr_degamma_features_;

    // VK_QCOM_filter_cubic_clamp structs
    VkPhysicalDeviceCubicClampFeaturesQCOM physical_device_cubic_clamp_features_;

    // VK_EXT_attachment_feedback_loop_dynamic_state structs
    VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT physical_device_attachment_feedback_loop_dynamic_state_features_;

    // VK_KHR_vertex_attribute_divisor structs
    VkPhysicalDeviceVertexAttributeDivisorPropertiesKHR physical_device_vertex_attribute_divisor_properties_;

    // VK_KHR_unified_image_layouts structs
    VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR physical_device_unified_image_layouts_features_;

    // VK_KHR_shader_float_controls2 structs
    VkPhysicalDeviceShaderFloatControls2FeaturesKHR physical_device_shader_float_controls_2_features_;

    // VK_QNX_external_memory_screen_buffer structs
#ifdef VK_USE_PLATFORM_SCREEN_QNX
    VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX physical_device_external_memory_screen_buffer_features_;
#endif // VK_USE_PLATFORM_SCREEN_QNX

    // VK_MSFT_layered_driver structs
    VkPhysicalDeviceLayeredDriverPropertiesMSFT physical_device_layered_driver_properties_;

    // VK_KHR_shader_expect_assume structs
    VkPhysicalDeviceShaderExpectAssumeFeaturesKHR physical_device_shader_expect_assume_features_;

    // VK_KHR_maintenance6 structs
    VkPhysicalDeviceMaintenance6PropertiesKHR physical_device_maintenance_6_properties_;
    VkPhysicalDeviceMaintenance6FeaturesKHR physical_device_maintenance_6_features_;

    // VK_NV_descriptor_pool_overallocation structs
    VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV physical_device_descriptor_pool_overallocation_features_;

    // VK_QCOM_tile_memory_heap structs
    VkPhysicalDeviceTileMemoryHeapPropertiesQCOM physical_device_tile_memory_heap_properties_;
    VkPhysicalDeviceTileMemoryHeapFeaturesQCOM physical_device_tile_memory_heap_features_;

    // VK_KHR_copy_memory_indirect structs
    VkPhysicalDeviceCopyMemoryIndirectFeaturesKHR physical_device_copy_memory_indirect_features_;

    // VK_KHR_video_encode_intra_refresh structs
    VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR physical_device_video_encode_intra_refresh_features_;

    // VK_KHR_video_encode_quantization_map structs
    VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR physical_device_video_encode_quantization_map_features_;

    // VK_NV_raw_access_chains structs
    VkPhysicalDeviceRawAccessChainsFeaturesNV physical_device_raw_access_chains_features_;

    // VK_NV_external_compute_queue structs
    VkPhysicalDeviceExternalComputeQueuePropertiesNV physical_device_external_compute_queue_properties_;

    // VK_KHR_shader_relaxed_extended_instruction structs
    VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR physical_device_shader_relaxed_extended_instruction_features_;

    // VK_NV_command_buffer_inheritance structs
    VkPhysicalDeviceCommandBufferInheritanceFeaturesNV physical_device_command_buffer_inheritance_features_;

    // VK_KHR_maintenance7 structs
    VkPhysicalDeviceMaintenance7PropertiesKHR physical_device_maintenance_7_properties_;
    VkPhysicalDeviceLayeredApiPropertiesListKHR physical_device_layered_api_properties_list_;
    VkPhysicalDeviceMaintenance7FeaturesKHR physical_device_maintenance_7_features_;

    // VK_NV_shader_atomic_float16_vector structs
    VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV physical_device_shader_atomic_float_16_vector_features_;

    // VK_EXT_shader_replicated_composites structs
    VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT physical_device_shader_replicated_composites_features_;

    // VK_EXT_shader_float8 structs
    VkPhysicalDeviceShaderFloat8FeaturesEXT physical_device_shader_float_8_features_;

    // VK_NV_ray_tracing_validation structs
    VkPhysicalDeviceRayTracingValidationFeaturesNV physical_device_ray_tracing_validation_features_;

    // VK_NV_cluster_acceleration_structure structs
    VkPhysicalDeviceClusterAccelerationStructurePropertiesNV physical_device_cluster_acceleration_structure_properties_;
    VkPhysicalDeviceClusterAccelerationStructureFeaturesNV physical_device_cluster_acceleration_structure_features_;

    // VK_NV_partitioned_acceleration_structure structs
    VkPhysicalDevicePartitionedAccelerationStructurePropertiesNV physical_device_partitioned_acceleration_structure_properties_;
    VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV physical_device_partitioned_acceleration_structure_features_;

    // VK_EXT_device_generated_commands structs
    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT physical_device_device_generated_commands_properties_;
    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT physical_device_device_generated_commands_features_;

    // VK_KHR_device_fault structs
    VkPhysicalDeviceFaultPropertiesKHR physical_device_fault_properties_;
    VkPhysicalDeviceFaultFeaturesKHR physical_device_fault_features_;

    // VK_KHR_maintenance8 structs
    VkPhysicalDeviceMaintenance8FeaturesKHR physical_device_maintenance_8_features_;

    // VK_MESA_image_alignment_control structs
    VkPhysicalDeviceImageAlignmentControlPropertiesMESA physical_device_image_alignment_control_properties_;
    VkPhysicalDeviceImageAlignmentControlFeaturesMESA physical_device_image_alignment_control_features_;

    // VK_KHR_shader_fma structs
    VkPhysicalDeviceShaderFmaFeaturesKHR physical_device_shader_fma_features_;

    // VK_NV_push_constant_bank structs
    VkPhysicalDevicePushConstantBankPropertiesNV physical_device_push_constant_bank_properties_;
    VkPhysicalDevicePushConstantBankFeaturesNV physical_device_push_constant_bank_features_;

    // VK_EXT_ray_tracing_invocation_reorder structs
    VkPhysicalDeviceRayTracingInvocationReorderPropertiesEXT physical_device_ray_tracing_invocation_reorder_properties_;
    VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT physical_device_ray_tracing_invocation_reorder_features_;

    // VK_EXT_depth_clamp_control structs
    VkPhysicalDeviceDepthClampControlFeaturesEXT physical_device_depth_clamp_control_features_;

    // VK_KHR_maintenance9 structs
    VkPhysicalDeviceMaintenance9PropertiesKHR physical_device_maintenance_9_properties_;
    VkPhysicalDeviceMaintenance9FeaturesKHR physical_device_maintenance_9_features_;

    // VK_KHR_video_maintenance2 structs
    VkPhysicalDeviceVideoMaintenance2FeaturesKHR physical_device_video_maintenance_2_features_;

    // VK_HUAWEI_hdr_vivid structs
    VkPhysicalDeviceHdrVividFeaturesHUAWEI physical_device_hdr_vivid_features_;

    // VK_NV_cooperative_matrix2 structs
    VkPhysicalDeviceCooperativeMatrix2PropertiesNV physical_device_cooperative_matrix_2_properties_;
    VkPhysicalDeviceCooperativeMatrix2FeaturesNV physical_device_cooperative_matrix_2_features_;

    // VK_ARM_pipeline_opacity_micromap structs
    VkPhysicalDevicePipelineOpacityMicromapFeaturesARM physical_device_pipeline_opacity_micromap_features_;

    // VK_KHR_video_encode_feedback2 structs
    VkPhysicalDeviceVideoEncodeFeedback2FeaturesKHR physical_device_video_encode_feedback_2_features_;

    // VK_ARM_performance_counters_by_region structs
    VkPhysicalDevicePerformanceCountersByRegionPropertiesARM physical_device_performance_counters_by_region_properties_;
    VkPhysicalDevicePerformanceCountersByRegionFeaturesARM physical_device_performance_counters_by_region_features_;

    // VK_ARM_shader_instrumentation structs
    VkPhysicalDeviceShaderInstrumentationPropertiesARM physical_device_shader_instrumentation_properties_;
    VkPhysicalDeviceShaderInstrumentationFeaturesARM physical_device_shader_instrumentation_features_;

    // VK_EXT_vertex_attribute_robustness structs
    VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT physical_device_vertex_attribute_robustness_features_;

    // VK_ARM_format_pack structs
    VkPhysicalDeviceFormatPackFeaturesARM physical_device_format_pack_features_;

    // VK_VALVE_fragment_density_map_layered structs
    VkPhysicalDeviceFragmentDensityMapLayeredPropertiesVALVE physical_device_fragment_density_map_layered_properties_;
    VkPhysicalDeviceFragmentDensityMapLayeredFeaturesVALVE physical_device_fragment_density_map_layered_features_;

    // VK_NV_present_metering structs
    VkPhysicalDevicePresentMeteringFeaturesNV physical_device_present_metering_features_;

    // VK_EXT_multisampled_render_to_swapchain structs
    VkPhysicalDeviceMultisampledRenderToSwapchainFeaturesEXT physical_device_multisampled_render_to_swapchain_features_;

    // VK_EXT_zero_initialize_device_memory structs
    VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT physical_device_zero_initialize_device_memory_features_;

    // VK_KHR_opacity_micromap structs
    VkPhysicalDeviceOpacityMicromapPropertiesKHR physical_device_opacity_micromap_properties_;
    VkPhysicalDeviceOpacityMicromapFeaturesKHR physical_device_opacity_micromap_features_;

    // VK_EXT_shader_64bit_indexing structs
    VkPhysicalDeviceShader64BitIndexingFeaturesEXT physical_device_shader_64_bit_indexing_features_;

    // VK_EXT_custom_resolve structs
    VkPhysicalDeviceCustomResolveFeaturesEXT physical_device_custom_resolve_features_;

    // VK_QCOM_data_graph_model structs
    VkPhysicalDeviceDataGraphModelFeaturesQCOM physical_device_data_graph_model_features_;

    // VK_KHR_maintenance10 structs
    VkPhysicalDeviceMaintenance10PropertiesKHR physical_device_maintenance_10_properties_;
    VkPhysicalDeviceMaintenance10FeaturesKHR physical_device_maintenance_10_features_;

    // VK_ARM_data_graph_optical_flow structs
    VkPhysicalDeviceDataGraphOpticalFlowFeaturesARM physical_device_data_graph_optical_flow_features_;

    // VK_EXT_shader_long_vector structs
    VkPhysicalDeviceShaderLongVectorPropertiesEXT physical_device_shader_long_vector_properties_;
    VkPhysicalDeviceShaderLongVectorFeaturesEXT physical_device_shader_long_vector_features_;

    // VK_SEC_pipeline_cache_incremental_mode structs
    VkPhysicalDevicePipelineCacheIncrementalModeFeaturesSEC physical_device_pipeline_cache_incremental_mode_features_;

    // VK_EXT_shader_uniform_buffer_unsized_array structs
    VkPhysicalDeviceShaderUniformBufferUnsizedArrayFeaturesEXT physical_device_shader_uniform_buffer_unsized_array_features_;

    // VK_NV_compute_occupancy_priority structs
    VkPhysicalDeviceComputeOccupancyPriorityFeaturesNV physical_device_compute_occupancy_priority_features_;

    // VK_KHR_maintenance11 structs
    VkPhysicalDeviceMaintenance11FeaturesKHR physical_device_maintenance_11_features_;

    // VK_EXT_shader_subgroup_partitioned structs
    VkPhysicalDeviceShaderSubgroupPartitionedFeaturesEXT physical_device_shader_subgroup_partitioned_features_;

    // VK_KHR_extended_flags structs
    VkPhysicalDeviceExtendedFlagsFeaturesKHR physical_device_extended_flags_features_;

    // VK_EXT_shader_ocp_microscaling_types structs
    VkPhysicalDeviceShaderOCPMicroscalingTypesFeaturesEXT physical_device_shader_ocpmicroscaling_types_features_;

    // VK_VALVE_shader_mixed_float_dot_product structs
    VkPhysicalDeviceShaderMixedFloatDotProductFeaturesVALVE physical_device_shader_mixed_float_dot_product_features_;

    // VK_SEC_throttle_hint structs
    VkPhysicalDeviceThrottleHintFeaturesSEC physical_device_throttle_hint_features_;

    // VK_ARM_data_graph_neural_accelerator_statistics structs
    VkPhysicalDeviceDataGraphNeuralAcceleratorStatisticsFeaturesARM physical_device_data_graph_neural_accelerator_statistics_features_;

    // VK_EXT_primitive_restart_index structs
    VkPhysicalDevicePrimitiveRestartIndexFeaturesEXT physical_device_primitive_restart_index_features_;

    // VK_NV_cooperative_matrix_decode_vector structs
    VkPhysicalDeviceCooperativeMatrixDecodeVectorFeaturesNV physical_device_cooperative_matrix_decode_vector_features_;

    PhysicalDeviceData(VkInstance instance) : instance_(instance) {
        physical_device_properties_ = {};
        physical_device_features_ = {};
        physical_device_memory_properties_ = {};
        surface_capabilities_ = {};

        vulkan_1_1_properties_written_ = false;
        vulkan_1_2_properties_written_ = false;
        vulkan_1_3_properties_written_ = false;
        vulkan_1_4_properties_written_ = false;

        vulkan_1_1_features_written_ = false;
        vulkan_1_2_features_written_ = false;
        vulkan_1_3_features_written_ = false;
        vulkan_1_4_features_written_ = false;

        // Core properties
        physical_device_subgroup_properties_ = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES };
        physical_device_protected_memory_properties_ = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES };
        physical_device_vulkan_11_properties_ = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES };
        physical_device_vulkan_12_properties_ = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES };
        physical_device_vulkan_13_properties_ = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES };
        physical_device_vulkan_14_properties_ = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_PROPERTIES };

        // Core features
        physical_device_protected_memory_features_ = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES };
        physical_device_shader_draw_parameter_features_ = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES };
        physical_device_vulkan_11_features_ = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES };
        physical_device_vulkan_12_features_ = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES };
        physical_device_vulkan_13_features_ = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES };
        physical_device_vulkan_14_features_ = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_FEATURES };

        // VK_EXT_transform_feedback structs
        physical_device_transform_feedback_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT};
        physical_device_transform_feedback_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT};

        // VK_KHR_dynamic_rendering structs
        physical_device_dynamic_rendering_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR};

        // VK_NV_corner_sampled_image structs
        physical_device_corner_sampled_image_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV};

        // VK_KHR_multiview structs
        physical_device_multiview_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHR};
        physical_device_multiview_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR};

        // VK_EXT_texture_compression_astc_hdr structs
        physical_device_texture_compression_astchdrfeatures_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT};

        // VK_EXT_astc_decode_mode structs
        physical_device_astcdecode_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT};

        // VK_EXT_pipeline_robustness structs
        physical_device_pipeline_robustness_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES_EXT};
        physical_device_pipeline_robustness_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT};

        // VK_KHR_external_memory_capabilities structs
        physical_device_idproperties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES_KHR};

        // VK_KHR_push_descriptor structs
        physical_device_push_descriptor_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR};

        // VK_EXT_conditional_rendering structs
        physical_device_conditional_rendering_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT};

        // VK_KHR_shader_float16_int8 structs
        physical_device_float_16_int_8_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR};

        // VK_KHR_16bit_storage structs
        physical_device_16_bit_storage_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR};

        // VK_NVX_multiview_per_view_attributes structs
        physical_device_multiview_per_view_attributes_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX};

        // VK_EXT_discard_rectangles structs
        physical_device_discard_rectangle_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT};

        // VK_EXT_conservative_rasterization structs
        physical_device_conservative_rasterization_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT};

        // VK_EXT_depth_clip_enable structs
        physical_device_depth_clip_enable_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT};

        // VK_KHR_imageless_framebuffer structs
        physical_device_imageless_framebuffer_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR};

        // VK_IMG_relaxed_line_rasterization structs
        physical_device_relaxed_line_rasterization_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG};

        // VK_KHR_performance_query structs
        physical_device_performance_query_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR};
        physical_device_performance_query_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR};

        // VK_KHR_maintenance2 structs
        physical_device_point_clipping_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES_KHR};

        // VK_KHR_variable_pointers structs
        physical_device_variable_pointer_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES};

        // VK_EXT_sampler_filter_minmax structs
        physical_device_sampler_filter_minmax_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT};

        // VK_AMD_gpa_interface structs
        physical_device_gpa_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GPA_PROPERTIES_AMD};
        physical_device_gpa_properties_2_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GPA_PROPERTIES_2_AMD};
        physical_device_gpa_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GPA_FEATURES_AMD};

        // VK_AMDX_shader_enqueue structs
#ifdef VK_ENABLE_BETA_EXTENSIONS
        physical_device_shader_enqueue_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ENQUEUE_PROPERTIES_AMDX};
        physical_device_shader_enqueue_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ENQUEUE_FEATURES_AMDX};
#endif // VK_ENABLE_BETA_EXTENSIONS

        // VK_EXT_descriptor_heap structs
        physical_device_descriptor_heap_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_HEAP_PROPERTIES_EXT};
        physical_device_descriptor_heap_tensor_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_HEAP_TENSOR_PROPERTIES_ARM};
        physical_device_descriptor_heap_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_HEAP_FEATURES_EXT};

        // VK_EXT_inline_uniform_block structs
        physical_device_inline_uniform_block_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT};
        physical_device_inline_uniform_block_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT};

        // VK_KHR_shader_bfloat16 structs
        physical_device_shader_bfloat_16_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_BFLOAT16_FEATURES_KHR};

        // VK_EXT_sample_locations structs
        physical_device_sample_locations_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT};

        // VK_EXT_blend_operation_advanced structs
        physical_device_blend_operation_advanced_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT};
        physical_device_blend_operation_advanced_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT};

        // VK_KHR_acceleration_structure structs
        physical_device_acceleration_structure_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR};
        physical_device_acceleration_structure_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR};

        // VK_KHR_ray_tracing_pipeline structs
        physical_device_ray_tracing_pipeline_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR};
        physical_device_ray_tracing_pipeline_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR};

        // VK_KHR_ray_query structs
        physical_device_ray_query_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR};

        // VK_NV_shader_sm_builtins structs
        physical_device_shader_smbuiltins_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV};
        physical_device_shader_smbuiltins_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV};

        // VK_KHR_sampler_ycbcr_conversion structs
        physical_device_sampler_ycbcr_conversion_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR};

        // VK_EXT_descriptor_indexing structs
        physical_device_descriptor_indexing_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT};
        physical_device_descriptor_indexing_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT};

        // VK_KHR_portability_subset structs
#ifdef VK_ENABLE_BETA_EXTENSIONS
        physical_device_portability_subset_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR};
        physical_device_portability_subset_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR};
#endif // VK_ENABLE_BETA_EXTENSIONS

        // VK_NV_shading_rate_image structs
        physical_device_shading_rate_image_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV};
        physical_device_shading_rate_image_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV};

        // VK_NV_ray_tracing structs
        physical_device_ray_tracing_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV};

        // VK_NV_representative_fragment_test structs
        physical_device_representative_fragment_test_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV};

        // VK_KHR_maintenance3 structs
        physical_device_maintenance_3_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES_KHR};

        // VK_QCOM_cooperative_matrix_conversion structs
        physical_device_cooperative_matrix_conversion_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_CONVERSION_FEATURES_QCOM};

        // VK_QCOM_elapsed_timer_query structs
        physical_device_elapsed_timer_query_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ELAPSED_TIMER_QUERY_FEATURES_QCOM};

        // VK_KHR_shader_subgroup_extended_types structs
        physical_device_shader_subgroup_extended_types_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR};

        // VK_KHR_8bit_storage structs
        physical_device_8_bit_storage_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR};

        // VK_EXT_external_memory_host structs
        physical_device_external_memory_host_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT};

        // VK_KHR_shader_atomic_int64 structs
        physical_device_shader_atomic_int_64_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR};

        // VK_KHR_shader_clock structs
        physical_device_shader_clock_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR};

        // VK_AMD_shader_core_properties structs
        physical_device_shader_core_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD};

        // VK_EXT_vertex_attribute_divisor structs
        physical_device_vertex_attribute_divisor_properties_ext_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT};
        physical_device_vertex_attribute_divisor_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT};

        // VK_KHR_driver_properties structs
        physical_device_driver_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR};

        // VK_KHR_shader_float_controls structs
        physical_device_float_controls_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR};

        // VK_KHR_depth_stencil_resolve structs
        physical_device_depth_stencil_resolve_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR};

        // VK_NV_compute_shader_derivatives structs
        physical_device_compute_shader_derivatives_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV};

        // VK_NV_mesh_shader structs
        physical_device_mesh_shader_properties_nv_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV};
        physical_device_mesh_shader_features_nv_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV};

        // VK_NV_fragment_shader_barycentric structs
        physical_device_fragment_shader_barycentric_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV};

        // VK_NV_shader_image_footprint structs
        physical_device_shader_image_footprint_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV};

        // VK_NV_scissor_exclusive structs
        physical_device_exclusive_scissor_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV};

        // VK_KHR_timeline_semaphore structs
        physical_device_timeline_semaphore_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR};
        physical_device_timeline_semaphore_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR};

        // VK_EXT_present_timing structs
        physical_device_present_timing_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_TIMING_FEATURES_EXT};

        // VK_INTEL_shader_integer_functions2 structs
        physical_device_shader_integer_functions_2_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL};

        // VK_KHR_vulkan_memory_model structs
        physical_device_vulkan_memory_model_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR};

        // VK_EXT_pci_bus_info structs
        physical_device_pcibus_info_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT};

        // VK_KHR_shader_terminate_invocation structs
        physical_device_shader_terminate_invocation_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR};

        // VK_EXT_fragment_density_map structs
        physical_device_fragment_density_map_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT};
        physical_device_fragment_density_map_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT};

        // VK_EXT_scalar_block_layout structs
        physical_device_scalar_block_layout_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT};

        // VK_EXT_subgroup_size_control structs
        physical_device_subgroup_size_control_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT};
        physical_device_subgroup_size_control_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT};

        // VK_KHR_fragment_shading_rate structs
        physical_device_fragment_shading_rate_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR};
        physical_device_fragment_shading_rate_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR};

        // VK_AMD_shader_core_properties2 structs
        physical_device_shader_core_properties_2_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD};

        // VK_AMD_device_coherent_memory structs
        physical_device_coherent_memory_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD};

        // VK_KHR_shader_constant_data structs
        physical_device_shader_constant_data_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CONSTANT_DATA_FEATURES_KHR};

        // VK_KHR_dynamic_rendering_local_read structs
        physical_device_dynamic_rendering_local_read_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES_KHR};

        // VK_KHR_shader_abort structs
        physical_device_shader_abort_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ABORT_PROPERTIES_KHR};
        physical_device_shader_abort_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ABORT_FEATURES_KHR};

        // VK_EXT_shader_image_atomic_int64 structs
        physical_device_shader_image_atomic_int_64_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT};

        // VK_KHR_shader_quad_control structs
        physical_device_shader_quad_control_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_QUAD_CONTROL_FEATURES_KHR};

        // VK_EXT_memory_priority structs
        physical_device_memory_priority_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT};

        // VK_NV_dedicated_allocation_image_aliasing structs
        physical_device_dedicated_allocation_image_aliasing_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV};

        // VK_KHR_separate_depth_stencil_layouts structs
        physical_device_separate_depth_stencil_layouts_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES_KHR};

        // VK_EXT_buffer_device_address structs
        physical_device_buffer_address_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT};

        // VK_KHR_present_wait structs
        physical_device_present_wait_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR};

        // VK_NV_cooperative_matrix structs
        physical_device_cooperative_matrix_properties_nv_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV};
        physical_device_cooperative_matrix_features_nv_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV};

        // VK_NV_coverage_reduction_mode structs
        physical_device_coverage_reduction_mode_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV};

        // VK_EXT_fragment_shader_interlock structs
        physical_device_fragment_shader_interlock_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT};

        // VK_EXT_ycbcr_image_arrays structs
        physical_device_ycbcr_image_arrays_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT};

        // VK_KHR_uniform_buffer_standard_layout structs
        physical_device_uniform_buffer_standard_layout_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR};

        // VK_EXT_provoking_vertex structs
        physical_device_provoking_vertex_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT};
        physical_device_provoking_vertex_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT};

        // VK_KHR_buffer_device_address structs
        physical_device_buffer_device_address_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR};

        // VK_EXT_line_rasterization structs
        physical_device_line_rasterization_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT};
        physical_device_line_rasterization_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT};

        // VK_EXT_shader_atomic_float structs
        physical_device_shader_atomic_float_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT};

        // VK_EXT_host_query_reset structs
        physical_device_host_query_reset_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT};

        // VK_EXT_index_type_uint8 structs
        physical_device_index_type_uint_8_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT};

        // VK_EXT_extended_dynamic_state structs
        physical_device_extended_dynamic_state_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT};

        // VK_KHR_pipeline_executable_properties structs
        physical_device_pipeline_executable_properties_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR};

        // VK_EXT_host_image_copy structs
        physical_device_host_image_copy_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES_EXT};
        physical_device_host_image_copy_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT};

        // VK_EXT_map_memory_placed structs
        physical_device_map_memory_placed_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_PROPERTIES_EXT};
        physical_device_map_memory_placed_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_FEATURES_EXT};

        // VK_EXT_shader_atomic_float2 structs
        physical_device_shader_atomic_float_2_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT};

        // VK_EXT_swapchain_maintenance1 structs
        physical_device_swapchain_maintenance_1_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT};

        // VK_EXT_shader_demote_to_helper_invocation structs
        physical_device_shader_demote_to_helper_invocation_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT};

        // VK_NV_device_generated_commands structs
        physical_device_device_generated_commands_properties_nv_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV};
        physical_device_device_generated_commands_features_nv_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV};

        // VK_NV_inherited_viewport_scissor structs
        physical_device_inherited_viewport_scissor_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV};

        // VK_KHR_shader_integer_dot_product structs
        physical_device_shader_integer_dot_product_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR};
        physical_device_shader_integer_dot_product_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR};

        // VK_EXT_texel_buffer_alignment structs
        physical_device_texel_buffer_alignment_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT};
        physical_device_texel_buffer_alignment_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT};

        // VK_EXT_depth_bias_control structs
        physical_device_depth_bias_control_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT};

        // VK_EXT_device_memory_report structs
        physical_device_device_memory_report_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT};

        // VK_EXT_robustness2 structs
        physical_device_robustness_2_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT};
        physical_device_robustness_2_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT};

        // VK_EXT_custom_border_color structs
        physical_device_custom_border_color_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT};
        physical_device_custom_border_color_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT};

        // VK_EXT_texture_compression_astc_3d structs
        physical_device_texture_compression_astc_3_dfeatures_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_3D_FEATURES_EXT};

        // VK_NV_present_barrier structs
        physical_device_present_barrier_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_BARRIER_FEATURES_NV};

        // VK_KHR_present_id structs
        physical_device_present_id_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR};

        // VK_EXT_private_data structs
        physical_device_private_data_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT};

        // VK_EXT_pipeline_creation_cache_control structs
        physical_device_pipeline_creation_cache_control_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT};

        // VK_NV_device_diagnostics_config structs
        physical_device_diagnostics_config_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV};

        // VK_QCOM_queue_perf_hint structs
        physical_device_queue_perf_hint_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_QUEUE_PERF_HINT_PROPERTIES_QCOM};
        physical_device_queue_perf_hint_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_QUEUE_PERF_HINT_FEATURES_QCOM};

        // VK_QCOM_image_processing3 structs
        physical_device_image_processing_3_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_3_FEATURES_QCOM};

        // VK_QCOM_shader_multiple_wait_queues structs
        physical_device_shader_multiple_wait_queues_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MULTIPLE_WAIT_QUEUES_PROPERTIES_QCOM};
        physical_device_shader_multiple_wait_queues_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MULTIPLE_WAIT_QUEUES_FEATURES_QCOM};

        // VK_EXT_shader_split_barrier structs
        physical_device_shader_split_barrier_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SPLIT_BARRIER_PROPERTIES_EXT};
        physical_device_shader_split_barrier_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SPLIT_BARRIER_FEATURES_EXT};

        // VK_NV_cuda_kernel_launch structs
#ifdef VK_ENABLE_BETA_EXTENSIONS
        physical_device_cuda_kernel_launch_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_PROPERTIES_NV};
        physical_device_cuda_kernel_launch_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_FEATURES_NV};
#endif // VK_ENABLE_BETA_EXTENSIONS

        // VK_QCOM_tile_shading structs
        physical_device_tile_shading_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_SHADING_PROPERTIES_QCOM};
        physical_device_tile_shading_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_SHADING_FEATURES_QCOM};

        // VK_KHR_synchronization2 structs
        physical_device_synchronization_2_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR};

        // VK_EXT_descriptor_buffer structs
        physical_device_descriptor_buffer_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT};
        physical_device_descriptor_buffer_density_map_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_DENSITY_MAP_PROPERTIES_EXT};
        physical_device_descriptor_buffer_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT};

        // VK_KHR_device_address_commands structs
        physical_device_device_address_commands_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_ADDRESS_COMMANDS_FEATURES_KHR};

        // VK_EXT_graphics_pipeline_library structs
        physical_device_graphics_pipeline_library_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_PROPERTIES_EXT};
        physical_device_graphics_pipeline_library_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT};

        // VK_AMD_shader_early_and_late_fragment_tests structs
        physical_device_shader_early_and_late_fragment_tests_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_FEATURES_AMD};

        // VK_KHR_fragment_shader_barycentric structs
        physical_device_fragment_shader_barycentric_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_PROPERTIES_KHR};

        // VK_KHR_shader_subgroup_uniform_control_flow structs
        physical_device_shader_subgroup_uniform_control_flow_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR};

        // VK_KHR_zero_initialize_workgroup_memory structs
        physical_device_zero_initialize_workgroup_memory_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR};

        // VK_NV_fragment_shading_rate_enums structs
        physical_device_fragment_shading_rate_enums_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV};
        physical_device_fragment_shading_rate_enums_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV};

        // VK_NV_ray_tracing_motion_blur structs
        physical_device_ray_tracing_motion_blur_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV};

        // VK_EXT_mesh_shader structs
        physical_device_mesh_shader_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_EXT};
        physical_device_mesh_shader_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT};

        // VK_EXT_ycbcr_2plane_444_formats structs
        physical_device_ycbcr_2_plane_444_formats_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT};

        // VK_EXT_fragment_density_map2 structs
        physical_device_fragment_density_map_2_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT};
        physical_device_fragment_density_map_2_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT};

        // VK_EXT_image_robustness structs
        physical_device_image_robustness_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT};

        // VK_KHR_workgroup_memory_explicit_layout structs
        physical_device_workgroup_memory_explicit_layout_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR};

        // VK_EXT_image_compression_control structs
        physical_device_image_compression_control_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT};

        // VK_EXT_attachment_feedback_loop_layout structs
        physical_device_attachment_feedback_loop_layout_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT};

        // VK_EXT_4444_formats structs
        physical_device_4444_formats_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT};

        // VK_EXT_device_fault structs
        physical_device_fault_features_ext_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_EXT};

        // VK_ARM_rasterization_order_attachment_access structs
        physical_device_rasterization_order_attachment_access_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_ARM};

        // VK_EXT_rgba10x6_formats structs
        physical_device_rgba_10_x_6_formats_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT};

        // VK_VALVE_mutable_descriptor_type structs
        physical_device_mutable_descriptor_type_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE};

        // VK_EXT_vertex_input_dynamic_state structs
        physical_device_vertex_input_dynamic_state_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT};

        // VK_EXT_physical_device_drm structs
        physical_device_drm_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT};

        // VK_EXT_device_address_binding_report structs
        physical_device_address_binding_report_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ADDRESS_BINDING_REPORT_FEATURES_EXT};

        // VK_EXT_depth_clip_control structs
        physical_device_depth_clip_control_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT};

        // VK_EXT_primitive_topology_list_restart structs
        physical_device_primitive_topology_list_restart_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT};

        // VK_EXT_present_mode_fifo_latest_ready structs
        physical_device_present_mode_fifo_latest_ready_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_MODE_FIFO_LATEST_READY_FEATURES_EXT};

        // VK_HUAWEI_subpass_shading structs
        physical_device_subpass_shading_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI};
        physical_device_subpass_shading_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI};

        // VK_HUAWEI_invocation_mask structs
        physical_device_invocation_mask_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI};

        // VK_NV_external_memory_rdma structs
        physical_device_external_memory_rdmafeatures_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV};

        // VK_EXT_pipeline_properties structs
        physical_device_pipeline_properties_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT};

        // VK_EXT_frame_boundary structs
        physical_device_frame_boundary_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAME_BOUNDARY_FEATURES_EXT};

        // VK_EXT_multisampled_render_to_single_sampled structs
        physical_device_multisampled_render_to_single_sampled_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT};

        // VK_EXT_extended_dynamic_state2 structs
        physical_device_extended_dynamic_state_2_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT};

        // VK_EXT_color_write_enable structs
        physical_device_color_write_enable_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT};

        // VK_EXT_primitives_generated_query structs
        physical_device_primitives_generated_query_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT};

        // VK_KHR_ray_tracing_maintenance1 structs
        physical_device_ray_tracing_maintenance_1_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR};

        // VK_KHR_shader_untyped_pointers structs
        physical_device_shader_untyped_pointers_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_UNTYPED_POINTERS_FEATURES_KHR};

        // VK_EXT_global_priority_query structs
        physical_device_global_priority_query_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT};

        // VK_VALVE_video_encode_rgb_conversion structs
        physical_device_video_encode_rgb_conversion_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_RGB_CONVERSION_FEATURES_VALVE};

        // VK_EXT_image_view_min_lod structs
        physical_device_image_view_min_lod_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT};

        // VK_EXT_multi_draw structs
        physical_device_multi_draw_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT};
        physical_device_multi_draw_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT};

        // VK_EXT_image_2d_view_of_3d structs
        physical_device_image_2_dview_of_3_dfeatures_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT};

        // VK_EXT_shader_tile_image structs
        physical_device_shader_tile_image_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_PROPERTIES_EXT};
        physical_device_shader_tile_image_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_FEATURES_EXT};

        // VK_EXT_opacity_micromap structs
        physical_device_opacity_micromap_properties_ext_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_PROPERTIES_EXT};
        physical_device_opacity_micromap_features_ext_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_EXT};

        // VK_NV_displacement_micromap structs
#ifdef VK_ENABLE_BETA_EXTENSIONS
        physical_device_displacement_micromap_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISPLACEMENT_MICROMAP_PROPERTIES_NV};
        physical_device_displacement_micromap_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISPLACEMENT_MICROMAP_FEATURES_NV};
#endif // VK_ENABLE_BETA_EXTENSIONS

        // VK_HUAWEI_cluster_culling_shader structs
        physical_device_cluster_culling_shader_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_PROPERTIES_HUAWEI};
        physical_device_cluster_culling_shader_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_FEATURES_HUAWEI};

        // VK_EXT_border_color_swizzle structs
        physical_device_border_color_swizzle_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT};

        // VK_EXT_pageable_device_local_memory structs
        physical_device_pageable_device_local_memory_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT};

        // VK_KHR_maintenance4 structs
        physical_device_maintenance_4_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR};
        physical_device_maintenance_4_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR};

        // VK_ARM_shader_core_properties structs
        physical_device_shader_core_properties_arm_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_ARM};

        // VK_KHR_shader_subgroup_rotate structs
        physical_device_shader_subgroup_rotate_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES_KHR};

        // VK_ARM_scheduling_controls structs
        physical_device_scheduling_controls_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_PROPERTIES_ARM};
        physical_device_scheduling_controls_dispatch_parameters_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_DISPATCH_PARAMETERS_PROPERTIES_ARM};
        physical_device_scheduling_controls_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_FEATURES_ARM};

        // VK_EXT_image_sliced_view_of_3d structs
        physical_device_image_sliced_view_of_3_dfeatures_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_SLICED_VIEW_OF_3D_FEATURES_EXT};

        // VK_VALVE_descriptor_set_host_mapping structs
        physical_device_descriptor_set_host_mapping_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_SET_HOST_MAPPING_FEATURES_VALVE};

        // VK_EXT_depth_clamp_zero_one structs
        physical_device_depth_clamp_zero_one_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_EXT};

        // VK_EXT_non_seamless_cube_map structs
        physical_device_non_seamless_cube_map_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT};

        // VK_ARM_render_pass_striped structs
        physical_device_render_pass_striped_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RENDER_PASS_STRIPED_PROPERTIES_ARM};
        physical_device_render_pass_striped_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RENDER_PASS_STRIPED_FEATURES_ARM};

        // VK_QCOM_fragment_density_map_offset structs
        physical_device_fragment_density_map_offset_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_PROPERTIES_QCOM};
        physical_device_fragment_density_map_offset_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_QCOM};

        // VK_NV_copy_memory_indirect structs
        physical_device_copy_memory_indirect_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_PROPERTIES_NV};
        physical_device_copy_memory_indirect_features_nv_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_NV};

        // VK_NV_memory_decompression structs
        physical_device_memory_decompression_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_PROPERTIES_NV};
        physical_device_memory_decompression_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_NV};

        // VK_NV_device_generated_commands_compute structs
        physical_device_device_generated_commands_compute_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_COMPUTE_FEATURES_NV};

        // VK_NV_ray_tracing_linear_swept_spheres structs
        physical_device_ray_tracing_linear_swept_spheres_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_LINEAR_SWEPT_SPHERES_FEATURES_NV};

        // VK_NV_linear_color_attachment structs
        physical_device_linear_color_attachment_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINEAR_COLOR_ATTACHMENT_FEATURES_NV};

        // VK_KHR_shader_maximal_reconvergence structs
        physical_device_shader_maximal_reconvergence_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MAXIMAL_RECONVERGENCE_FEATURES_KHR};

        // VK_EXT_image_compression_control_swapchain structs
        physical_device_image_compression_control_swapchain_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT};

        // VK_QCOM_image_processing structs
        physical_device_image_processing_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_PROPERTIES_QCOM};
        physical_device_image_processing_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_FEATURES_QCOM};

        // VK_EXT_nested_command_buffer structs
        physical_device_nested_command_buffer_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_PROPERTIES_EXT};
        physical_device_nested_command_buffer_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_FEATURES_EXT};

        // VK_EXT_extended_dynamic_state3 structs
        physical_device_extended_dynamic_state_3_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_PROPERTIES_EXT};
        physical_device_extended_dynamic_state_3_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT};

        // VK_EXT_subpass_merge_feedback structs
        physical_device_subpass_merge_feedback_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT};

        // VK_ARM_tensors structs
        physical_device_tensor_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TENSOR_PROPERTIES_ARM};
        physical_device_descriptor_buffer_tensor_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_TENSOR_PROPERTIES_ARM};
        physical_device_tensor_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TENSOR_FEATURES_ARM};
        physical_device_descriptor_buffer_tensor_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_TENSOR_FEATURES_ARM};

        // VK_EXT_shader_module_identifier structs
        physical_device_shader_module_identifier_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_PROPERTIES_EXT};
        physical_device_shader_module_identifier_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT};

        // VK_NV_optical_flow structs
        physical_device_optical_flow_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_PROPERTIES_NV};
        physical_device_optical_flow_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV};

        // VK_EXT_legacy_dithering structs
        physical_device_legacy_dithering_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT};

        // VK_EXT_pipeline_protected_access structs
        physical_device_pipeline_protected_access_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES_EXT};

        // VK_ANDROID_external_format_resolve structs
#ifdef VK_USE_PLATFORM_ANDROID_KHR
        physical_device_external_format_resolve_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_PROPERTIES_ANDROID};
        physical_device_external_format_resolve_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_FEATURES_ANDROID};
#endif // VK_USE_PLATFORM_ANDROID_KHR

        // VK_KHR_maintenance5 structs
        physical_device_maintenance_5_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR};
        physical_device_maintenance_5_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR};

        // VK_AMD_anti_lag structs
        physical_device_anti_lag_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ANTI_LAG_FEATURES_AMD};

        // VK_AMDX_dense_geometry_format structs
#ifdef VK_ENABLE_BETA_EXTENSIONS
        physical_device_dense_geometry_format_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DENSE_GEOMETRY_FORMAT_FEATURES_AMDX};
#endif // VK_ENABLE_BETA_EXTENSIONS

        // VK_KHR_present_id2 structs
        physical_device_present_id_2_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_2_FEATURES_KHR};

        // VK_KHR_present_wait2 structs
        physical_device_present_wait_2_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_2_FEATURES_KHR};

        // VK_KHR_ray_tracing_position_fetch structs
        physical_device_ray_tracing_position_fetch_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR};

        // VK_EXT_shader_object structs
        physical_device_shader_object_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_PROPERTIES_EXT};
        physical_device_shader_object_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT};

        // VK_KHR_pipeline_binary structs
        physical_device_pipeline_binary_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_BINARY_PROPERTIES_KHR};
        physical_device_pipeline_binary_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_BINARY_FEATURES_KHR};

        // VK_QCOM_tile_properties structs
        physical_device_tile_properties_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_PROPERTIES_FEATURES_QCOM};

        // VK_SEC_amigo_profiling structs
        physical_device_amigo_profiling_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC};

        // VK_QCOM_multiview_per_view_viewports structs
        physical_device_multiview_per_view_viewports_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM};

        // VK_NV_ray_tracing_invocation_reorder structs
        physical_device_ray_tracing_invocation_reorder_properties_nv_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV};
        physical_device_ray_tracing_invocation_reorder_features_nv_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV};

        // VK_NV_cooperative_vector structs
        physical_device_cooperative_vector_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_VECTOR_PROPERTIES_NV};
        physical_device_cooperative_vector_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_VECTOR_FEATURES_NV};

        // VK_NV_extended_sparse_address_space structs
        physical_device_extended_sparse_address_space_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_SPARSE_ADDRESS_SPACE_PROPERTIES_NV};
        physical_device_extended_sparse_address_space_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_SPARSE_ADDRESS_SPACE_FEATURES_NV};

        // VK_EXT_legacy_vertex_attributes structs
        physical_device_legacy_vertex_attributes_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_PROPERTIES_EXT};
        physical_device_legacy_vertex_attributes_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_FEATURES_EXT};

        // VK_ARM_shader_core_builtins structs
        physical_device_shader_core_builtins_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_PROPERTIES_ARM};
        physical_device_shader_core_builtins_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_FEATURES_ARM};

        // VK_EXT_pipeline_library_group_handles structs
        physical_device_pipeline_library_group_handles_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_LIBRARY_GROUP_HANDLES_FEATURES_EXT};

        // VK_EXT_dynamic_rendering_unused_attachments structs
        physical_device_dynamic_rendering_unused_attachments_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_FEATURES_EXT};

        // VK_KHR_internally_synchronized_queues structs
        physical_device_internally_synchronized_queues_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INTERNALLY_SYNCHRONIZED_QUEUES_FEATURES_KHR};

        // VK_KHR_cooperative_matrix structs
        physical_device_cooperative_matrix_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR};
        physical_device_cooperative_matrix_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR};

        // VK_ARM_data_graph structs
        physical_device_data_graph_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DATA_GRAPH_FEATURES_ARM};

        // VK_QCOM_multiview_per_view_render_areas structs
        physical_device_multiview_per_view_render_areas_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_RENDER_AREAS_FEATURES_QCOM};

        // VK_KHR_compute_shader_derivatives structs
        physical_device_compute_shader_derivatives_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_PROPERTIES_KHR};

        // VK_KHR_video_encode_av1 structs
        physical_device_video_encode_av_1_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_AV1_FEATURES_KHR};

        // VK_KHR_video_decode_vp9 structs
        physical_device_video_decode_vp_9_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_DECODE_VP9_FEATURES_KHR};

        // VK_KHR_video_maintenance1 structs
        physical_device_video_maintenance_1_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR};

        // VK_NV_per_stage_descriptor_set structs
        physical_device_per_stage_descriptor_set_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PER_STAGE_DESCRIPTOR_SET_FEATURES_NV};

        // VK_QCOM_image_processing2 structs
        physical_device_image_processing_2_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_2_PROPERTIES_QCOM};
        physical_device_image_processing_2_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_2_FEATURES_QCOM};

        // VK_QCOM_filter_cubic_weights structs
        physical_device_cubic_weights_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_WEIGHTS_FEATURES_QCOM};

        // VK_QCOM_ycbcr_degamma structs
        physical_device_ycbcr_degamma_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_DEGAMMA_FEATURES_QCOM};

        // VK_QCOM_filter_cubic_clamp structs
        physical_device_cubic_clamp_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_CLAMP_FEATURES_QCOM};

        // VK_EXT_attachment_feedback_loop_dynamic_state structs
        physical_device_attachment_feedback_loop_dynamic_state_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT};

        // VK_KHR_vertex_attribute_divisor structs
        physical_device_vertex_attribute_divisor_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_KHR};

        // VK_KHR_unified_image_layouts structs
        physical_device_unified_image_layouts_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFIED_IMAGE_LAYOUTS_FEATURES_KHR};

        // VK_KHR_shader_float_controls2 structs
        physical_device_shader_float_controls_2_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES_KHR};

        // VK_QNX_external_memory_screen_buffer structs
#ifdef VK_USE_PLATFORM_SCREEN_QNX
        physical_device_external_memory_screen_buffer_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_SCREEN_BUFFER_FEATURES_QNX};
#endif // VK_USE_PLATFORM_SCREEN_QNX

        // VK_MSFT_layered_driver structs
        physical_device_layered_driver_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_DRIVER_PROPERTIES_MSFT};

        // VK_KHR_shader_expect_assume structs
        physical_device_shader_expect_assume_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES_KHR};

        // VK_KHR_maintenance6 structs
        physical_device_maintenance_6_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES_KHR};
        physical_device_maintenance_6_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES_KHR};

        // VK_NV_descriptor_pool_overallocation structs
        physical_device_descriptor_pool_overallocation_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_POOL_OVERALLOCATION_FEATURES_NV};

        // VK_QCOM_tile_memory_heap structs
        physical_device_tile_memory_heap_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_MEMORY_HEAP_PROPERTIES_QCOM};
        physical_device_tile_memory_heap_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_MEMORY_HEAP_FEATURES_QCOM};

        // VK_KHR_copy_memory_indirect structs
        physical_device_copy_memory_indirect_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_KHR};

        // VK_KHR_video_encode_intra_refresh structs
        physical_device_video_encode_intra_refresh_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_INTRA_REFRESH_FEATURES_KHR};

        // VK_KHR_video_encode_quantization_map structs
        physical_device_video_encode_quantization_map_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_QUANTIZATION_MAP_FEATURES_KHR};

        // VK_NV_raw_access_chains structs
        physical_device_raw_access_chains_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAW_ACCESS_CHAINS_FEATURES_NV};

        // VK_NV_external_compute_queue structs
        physical_device_external_compute_queue_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_COMPUTE_QUEUE_PROPERTIES_NV};

        // VK_KHR_shader_relaxed_extended_instruction structs
        physical_device_shader_relaxed_extended_instruction_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR};

        // VK_NV_command_buffer_inheritance structs
        physical_device_command_buffer_inheritance_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMMAND_BUFFER_INHERITANCE_FEATURES_NV};

        // VK_KHR_maintenance7 structs
        physical_device_maintenance_7_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_7_PROPERTIES_KHR};
        physical_device_layered_api_properties_list_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_API_PROPERTIES_LIST_KHR};
        physical_device_maintenance_7_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_7_FEATURES_KHR};

        // VK_NV_shader_atomic_float16_vector structs
        physical_device_shader_atomic_float_16_vector_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT16_VECTOR_FEATURES_NV};

        // VK_EXT_shader_replicated_composites structs
        physical_device_shader_replicated_composites_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_REPLICATED_COMPOSITES_FEATURES_EXT};

        // VK_EXT_shader_float8 structs
        physical_device_shader_float_8_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT8_FEATURES_EXT};

        // VK_NV_ray_tracing_validation structs
        physical_device_ray_tracing_validation_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_VALIDATION_FEATURES_NV};

        // VK_NV_cluster_acceleration_structure structs
        physical_device_cluster_acceleration_structure_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_ACCELERATION_STRUCTURE_PROPERTIES_NV};
        physical_device_cluster_acceleration_structure_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_ACCELERATION_STRUCTURE_FEATURES_NV};

        // VK_NV_partitioned_acceleration_structure structs
        physical_device_partitioned_acceleration_structure_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PARTITIONED_ACCELERATION_STRUCTURE_PROPERTIES_NV};
        physical_device_partitioned_acceleration_structure_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PARTITIONED_ACCELERATION_STRUCTURE_FEATURES_NV};

        // VK_EXT_device_generated_commands structs
        physical_device_device_generated_commands_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_EXT};
        physical_device_device_generated_commands_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_EXT};

        // VK_KHR_device_fault structs
        physical_device_fault_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_PROPERTIES_KHR};
        physical_device_fault_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_KHR};

        // VK_KHR_maintenance8 structs
        physical_device_maintenance_8_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_8_FEATURES_KHR};

        // VK_MESA_image_alignment_control structs
        physical_device_image_alignment_control_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_PROPERTIES_MESA};
        physical_device_image_alignment_control_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_FEATURES_MESA};

        // VK_KHR_shader_fma structs
        physical_device_shader_fma_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FMA_FEATURES_KHR};

        // VK_NV_push_constant_bank structs
        physical_device_push_constant_bank_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_CONSTANT_BANK_PROPERTIES_NV};
        physical_device_push_constant_bank_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_CONSTANT_BANK_FEATURES_NV};

        // VK_EXT_ray_tracing_invocation_reorder structs
        physical_device_ray_tracing_invocation_reorder_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_EXT};
        physical_device_ray_tracing_invocation_reorder_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_EXT};

        // VK_EXT_depth_clamp_control structs
        physical_device_depth_clamp_control_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_CONTROL_FEATURES_EXT};

        // VK_KHR_maintenance9 structs
        physical_device_maintenance_9_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_9_PROPERTIES_KHR};
        physical_device_maintenance_9_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_9_FEATURES_KHR};

        // VK_KHR_video_maintenance2 structs
        physical_device_video_maintenance_2_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_2_FEATURES_KHR};

        // VK_HUAWEI_hdr_vivid structs
        physical_device_hdr_vivid_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HDR_VIVID_FEATURES_HUAWEI};

        // VK_NV_cooperative_matrix2 structs
        physical_device_cooperative_matrix_2_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_2_PROPERTIES_NV};
        physical_device_cooperative_matrix_2_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_2_FEATURES_NV};

        // VK_ARM_pipeline_opacity_micromap structs
        physical_device_pipeline_opacity_micromap_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_OPACITY_MICROMAP_FEATURES_ARM};

        // VK_KHR_video_encode_feedback2 structs
        physical_device_video_encode_feedback_2_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_FEEDBACK_2_FEATURES_KHR};

        // VK_ARM_performance_counters_by_region structs
        physical_device_performance_counters_by_region_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_COUNTERS_BY_REGION_PROPERTIES_ARM};
        physical_device_performance_counters_by_region_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_COUNTERS_BY_REGION_FEATURES_ARM};

        // VK_ARM_shader_instrumentation structs
        physical_device_shader_instrumentation_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INSTRUMENTATION_PROPERTIES_ARM};
        physical_device_shader_instrumentation_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INSTRUMENTATION_FEATURES_ARM};

        // VK_EXT_vertex_attribute_robustness structs
        physical_device_vertex_attribute_robustness_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_ROBUSTNESS_FEATURES_EXT};

        // VK_ARM_format_pack structs
        physical_device_format_pack_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FORMAT_PACK_FEATURES_ARM};

        // VK_VALVE_fragment_density_map_layered structs
        physical_device_fragment_density_map_layered_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_LAYERED_PROPERTIES_VALVE};
        physical_device_fragment_density_map_layered_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_LAYERED_FEATURES_VALVE};

        // VK_NV_present_metering structs
        physical_device_present_metering_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_METERING_FEATURES_NV};

        // VK_EXT_multisampled_render_to_swapchain structs
        physical_device_multisampled_render_to_swapchain_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SWAPCHAIN_FEATURES_EXT};

        // VK_EXT_zero_initialize_device_memory structs
        physical_device_zero_initialize_device_memory_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_DEVICE_MEMORY_FEATURES_EXT};

        // VK_KHR_opacity_micromap structs
        physical_device_opacity_micromap_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_PROPERTIES_KHR};
        physical_device_opacity_micromap_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_KHR};

        // VK_EXT_shader_64bit_indexing structs
        physical_device_shader_64_bit_indexing_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_64_BIT_INDEXING_FEATURES_EXT};

        // VK_EXT_custom_resolve structs
        physical_device_custom_resolve_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_RESOLVE_FEATURES_EXT};

        // VK_QCOM_data_graph_model structs
        physical_device_data_graph_model_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DATA_GRAPH_MODEL_FEATURES_QCOM};

        // VK_KHR_maintenance10 structs
        physical_device_maintenance_10_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_10_PROPERTIES_KHR};
        physical_device_maintenance_10_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_10_FEATURES_KHR};

        // VK_ARM_data_graph_optical_flow structs
        physical_device_data_graph_optical_flow_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DATA_GRAPH_OPTICAL_FLOW_FEATURES_ARM};

        // VK_EXT_shader_long_vector structs
        physical_device_shader_long_vector_properties_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_LONG_VECTOR_PROPERTIES_EXT};
        physical_device_shader_long_vector_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_LONG_VECTOR_FEATURES_EXT};

        // VK_SEC_pipeline_cache_incremental_mode structs
        physical_device_pipeline_cache_incremental_mode_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CACHE_INCREMENTAL_MODE_FEATURES_SEC};

        // VK_EXT_shader_uniform_buffer_unsized_array structs
        physical_device_shader_uniform_buffer_unsized_array_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_UNIFORM_BUFFER_UNSIZED_ARRAY_FEATURES_EXT};

        // VK_NV_compute_occupancy_priority structs
        physical_device_compute_occupancy_priority_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_OCCUPANCY_PRIORITY_FEATURES_NV};

        // VK_KHR_maintenance11 structs
        physical_device_maintenance_11_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_11_FEATURES_KHR};

        // VK_EXT_shader_subgroup_partitioned structs
        physical_device_shader_subgroup_partitioned_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_PARTITIONED_FEATURES_EXT};

        // VK_KHR_extended_flags structs
        physical_device_extended_flags_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_FLAGS_FEATURES_KHR};

        // VK_EXT_shader_ocp_microscaling_types structs
        physical_device_shader_ocpmicroscaling_types_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OCP_MICROSCALING_TYPES_FEATURES_EXT};

        // VK_VALVE_shader_mixed_float_dot_product structs
        physical_device_shader_mixed_float_dot_product_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MIXED_FLOAT_DOT_PRODUCT_FEATURES_VALVE};

        // VK_SEC_throttle_hint structs
        physical_device_throttle_hint_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_THROTTLE_HINT_FEATURES_SEC};

        // VK_ARM_data_graph_neural_accelerator_statistics structs
        physical_device_data_graph_neural_accelerator_statistics_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DATA_GRAPH_NEURAL_ACCELERATOR_STATISTICS_FEATURES_ARM};

        // VK_EXT_primitive_restart_index structs
        physical_device_primitive_restart_index_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_RESTART_INDEX_FEATURES_EXT};

        // VK_NV_cooperative_matrix_decode_vector structs
        physical_device_cooperative_matrix_decode_vector_features_ = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_DECODE_VECTOR_FEATURES_NV};
    }
    PhysicalDeviceData(const PhysicalDeviceData &) = delete;
    PhysicalDeviceData &operator=(const PhysicalDeviceData &) = delete;
  private:

    const VkInstance instance_;

    typedef std::unordered_map<VkPhysicalDevice, PhysicalDeviceData> Map;
    static Map& map() {
        static Map map_;
        return map_;
    }
};


// Loader for Profiles JSON configuration files ////////////////////////////////////////////////////////////////////////////////////

class JsonLoader {
   public:
    JsonLoader()
        : layer_settings{},
          pdd_(nullptr),
          profile_api_version_(0),
          excluded_extensions_(),
          excluded_formats_()
    {}
    JsonLoader(const JsonLoader &) = delete;
    JsonLoader &operator=(const JsonLoader &rhs) = delete;

    static JsonLoader &Create() {
        VkInstance temporary = VK_NULL_HANDLE;
        const auto result = profile_map().emplace(std::piecewise_construct, std::make_tuple(temporary), std::make_tuple());
        assert(result.second);  // true=insertion, false=replacement
        auto iter = result.first;
        JsonLoader *profile = &iter->second;
        return *profile;
    }

    static void Store(VkInstance instance) {
        auto nh = profile_map().extract(VK_NULL_HANDLE);
        nh.key() = instance;
        profile_map().insert(std::move(nh));
    }

    static JsonLoader *Find(VkInstance instance) {
        const auto iter = profile_map().find(instance);
        return (iter != profile_map().end()) ? &iter->second : nullptr;
    }

    static void Destroy(VkInstance instance) {
        profile_map().erase(instance);
    }

    void LogFoundProfiles();
    const Json::Value& FindRootFromProfileName(const std::string& profile_name) const;
    VkResult LoadProfilesDatabase();
    VkResult LoadFile(const std::string& filename);
    void ReadProfileApiVersion();
    VkResult LoadDevice(const char* device_name, PhysicalDeviceData *pdd);
    VkResult ReadProfile(const char* device_name, const Json::Value& root, const std::vector<std::vector<std::string>> &capabilities, bool requested_profile, bool enable_warnings);
    uint32_t GetProfileApiVersion() const { return profile_api_version_; }
    void CollectProfiles(const std::string& profile_name, std::vector<std::string>& results) const;

    ProfileLayerSettings layer_settings;

   private:
    PhysicalDeviceData *pdd_;

    std::map<std::string, Json::Value> profiles_file_roots_;

    std::uint32_t profile_api_version_;
    std::vector<std::string> excluded_extensions_;
    std::vector<std::string> excluded_formats_;

    struct Extension {
        std::string name;
        int specVersion;
    };

    enum ExtensionSupport {
        UNSUPPORTED,
        EXCLUDED,
        SUPPORTED,
    };

    bool WarnDuplicatedFeature(const Json::Value &parent);
    bool WarnDuplicatedProperty(const Json::Value &parent);
    bool GetFeature(const char *device_name, bool requested_profile, const Json::Value &features, const std::string &name);
    bool GetProperty(const char *device_name, bool requested_profile, const Json::Value &props, const std::string &name);
    bool GetFormat(const char *device_name, bool requested_profile, const Json::Value &formats, const std::string &format_name, MapOfVkFormatProperties *dest,
                   MapOfVkFormatProperties3 *dest3);
    bool CheckVersionSupport(uint32_t version, const std::string &name);
    ExtensionSupport CheckExtensionSupport(const char *extension, const std::string &name);
    bool valid(ExtensionSupport support);
    bool GetQueueFamilyProperties(const char* device_name, const Json::Value &qf_props, QueueFamilyProperties *dest);
    bool OrderQueueFamilyProperties(ArrayOfVkQueueFamilyProperties *qfp);
    void AddPromotedExtensions(uint32_t api_level);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSubgroupProperties *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceProtectedMemoryProperties *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVulkan11Properties *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVulkan12Properties *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVulkan13Properties *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVulkan14Properties *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceProtectedMemoryFeatures *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderDrawParameterFeatures *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVulkan11Features *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVulkan12Features *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVulkan13Features *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVulkan14Features *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTransformFeedbackPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTransformFeedbackFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDynamicRenderingFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCornerSampledImageFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMultiviewPropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMultiviewFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceASTCDecodeFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelineRobustnessPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelineRobustnessFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceIDPropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePushDescriptorPropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceConditionalRenderingFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFloat16Int8FeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevice16BitStorageFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDiscardRectanglePropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceConservativeRasterizationPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDepthClipEnableFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImagelessFramebufferFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePerformanceQueryPropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePerformanceQueryFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePointClippingPropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVariablePointerFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceGpaPropertiesAMD *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceGpaProperties2AMD *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceGpaFeaturesAMD *dest);
#ifdef VK_ENABLE_BETA_EXTENSIONS
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderEnqueuePropertiesAMDX *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderEnqueueFeaturesAMDX *dest);
#endif // VK_ENABLE_BETA_EXTENSIONS
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorHeapPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorHeapTensorPropertiesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorHeapFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceInlineUniformBlockPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceInlineUniformBlockFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderBfloat16FeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSampleLocationsPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceAccelerationStructurePropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceAccelerationStructureFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingPipelinePropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingPipelineFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayQueryFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderSMBuiltinsPropertiesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderSMBuiltinsFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorIndexingPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorIndexingFeaturesEXT *dest);
#ifdef VK_ENABLE_BETA_EXTENSIONS
#endif // VK_ENABLE_BETA_EXTENSIONS
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShadingRateImagePropertiesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShadingRateImageFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingPropertiesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance3PropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCooperativeMatrixConversionFeaturesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceElapsedTimerQueryFeaturesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevice8BitStorageFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExternalMemoryHostPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderAtomicInt64FeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderClockFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderCorePropertiesAMD *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDriverPropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFloatControlsPropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDepthStencilResolvePropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceComputeShaderDerivativesFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMeshShaderPropertiesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMeshShaderFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderImageFootprintFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExclusiveScissorFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTimelineSemaphorePropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTimelineSemaphoreFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePresentTimingFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVulkanMemoryModelFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePCIBusInfoPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentDensityMapPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentDensityMapFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceScalarBlockLayoutFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSubgroupSizeControlPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSubgroupSizeControlFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentShadingRatePropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentShadingRateFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderCoreProperties2AMD *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCoherentMemoryFeaturesAMD *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderConstantDataFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDynamicRenderingLocalReadFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderAbortPropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderAbortFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderQuadControlFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMemoryPriorityFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceBufferAddressFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePresentWaitFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCooperativeMatrixPropertiesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCooperativeMatrixFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCoverageReductionModeFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceYcbcrImageArraysFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceProvokingVertexPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceProvokingVertexFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceBufferDeviceAddressFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceLineRasterizationPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceLineRasterizationFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderAtomicFloatFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceHostQueryResetFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceIndexTypeUint8FeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceHostImageCopyPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceHostImageCopyFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMapMemoryPlacedPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMapMemoryPlacedFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceInheritedViewportScissorFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDepthBiasControlFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDeviceMemoryReportFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRobustness2PropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRobustness2FeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCustomBorderColorPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCustomBorderColorFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTextureCompressionASTC3DFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePresentBarrierFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePresentIdFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePrivateDataFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDiagnosticsConfigFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceQueuePerfHintPropertiesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceQueuePerfHintFeaturesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageProcessing3FeaturesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderMultipleWaitQueuesPropertiesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderMultipleWaitQueuesFeaturesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderSplitBarrierPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderSplitBarrierFeaturesEXT *dest);
#ifdef VK_ENABLE_BETA_EXTENSIONS
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCudaKernelLaunchPropertiesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCudaKernelLaunchFeaturesNV *dest);
#endif // VK_ENABLE_BETA_EXTENSIONS
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTileShadingPropertiesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTileShadingFeaturesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSynchronization2FeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorBufferPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorBufferFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDeviceAddressCommandsFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingMotionBlurFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMeshShaderPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMeshShaderFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentDensityMap2PropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentDensityMap2FeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageRobustnessFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageCompressionControlFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevice4444FormatsFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFaultFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDrmPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceAddressBindingReportFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDepthClipControlFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSubpassShadingPropertiesHUAWEI *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSubpassShadingFeaturesHUAWEI *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceInvocationMaskFeaturesHUAWEI *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExternalMemoryRDMAFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelinePropertiesFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFrameBoundaryFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExtendedDynamicState2FeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceColorWriteEnableFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderUntypedPointersFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVideoEncodeRgbConversionFeaturesVALVE *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageViewMinLodFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMultiDrawPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMultiDrawFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImage2DViewOf3DFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderTileImagePropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderTileImageFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceOpacityMicromapPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceOpacityMicromapFeaturesEXT *dest);
#ifdef VK_ENABLE_BETA_EXTENSIONS
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDisplacementMicromapPropertiesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDisplacementMicromapFeaturesNV *dest);
#endif // VK_ENABLE_BETA_EXTENSIONS
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceBorderColorSwizzleFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance4PropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance4FeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderCorePropertiesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderSubgroupRotateFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSchedulingControlsPropertiesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSchedulingControlsDispatchParametersPropertiesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSchedulingControlsFeaturesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDepthClampZeroOneFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRenderPassStripedPropertiesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRenderPassStripedFeaturesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCopyMemoryIndirectPropertiesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCopyMemoryIndirectFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMemoryDecompressionPropertiesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMemoryDecompressionFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceLinearColorAttachmentFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageProcessingPropertiesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageProcessingFeaturesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceNestedCommandBufferPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceNestedCommandBufferFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExtendedDynamicState3PropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExtendedDynamicState3FeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTensorPropertiesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorBufferTensorPropertiesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTensorFeaturesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorBufferTensorFeaturesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceOpticalFlowPropertiesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceOpticalFlowFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceLegacyDitheringFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelineProtectedAccessFeaturesEXT *dest);
#ifdef VK_USE_PLATFORM_ANDROID_KHR
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExternalFormatResolvePropertiesANDROID *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExternalFormatResolveFeaturesANDROID *dest);
#endif // VK_USE_PLATFORM_ANDROID_KHR
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance5PropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance5FeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceAntiLagFeaturesAMD *dest);
#ifdef VK_ENABLE_BETA_EXTENSIONS
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDenseGeometryFormatFeaturesAMDX *dest);
#endif // VK_ENABLE_BETA_EXTENSIONS
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePresentId2FeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePresentWait2FeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderObjectPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderObjectFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelineBinaryPropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelineBinaryFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTilePropertiesFeaturesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceAmigoProfilingFeaturesSEC *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCooperativeVectorPropertiesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCooperativeVectorFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceInternallySynchronizedQueuesFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCooperativeMatrixPropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCooperativeMatrixFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDataGraphFeaturesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceComputeShaderDerivativesPropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVideoEncodeAV1FeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVideoDecodeVP9FeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVideoMaintenance1FeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePerStageDescriptorSetFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageProcessing2PropertiesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageProcessing2FeaturesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCubicWeightsFeaturesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceYcbcrDegammaFeaturesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCubicClampFeaturesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVertexAttributeDivisorPropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderFloatControls2FeaturesKHR *dest);
#ifdef VK_USE_PLATFORM_SCREEN_QNX
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX *dest);
#endif // VK_USE_PLATFORM_SCREEN_QNX
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceLayeredDriverPropertiesMSFT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderExpectAssumeFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance6PropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance6FeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTileMemoryHeapPropertiesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTileMemoryHeapFeaturesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCopyMemoryIndirectFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRawAccessChainsFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExternalComputeQueuePropertiesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCommandBufferInheritanceFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance7PropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceLayeredApiPropertiesListKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance7FeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderFloat8FeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingValidationFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceClusterAccelerationStructurePropertiesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceClusterAccelerationStructureFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePartitionedAccelerationStructurePropertiesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFaultPropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFaultFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance8FeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageAlignmentControlPropertiesMESA *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageAlignmentControlFeaturesMESA *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderFmaFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePushConstantBankPropertiesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePushConstantBankFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingInvocationReorderPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDepthClampControlFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance9PropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance9FeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVideoMaintenance2FeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceHdrVividFeaturesHUAWEI *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCooperativeMatrix2PropertiesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCooperativeMatrix2FeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelineOpacityMicromapFeaturesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVideoEncodeFeedback2FeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePerformanceCountersByRegionPropertiesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePerformanceCountersByRegionFeaturesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderInstrumentationPropertiesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderInstrumentationFeaturesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFormatPackFeaturesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentDensityMapLayeredPropertiesVALVE *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentDensityMapLayeredFeaturesVALVE *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePresentMeteringFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMultisampledRenderToSwapchainFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceOpacityMicromapPropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceOpacityMicromapFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShader64BitIndexingFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCustomResolveFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDataGraphModelFeaturesQCOM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance10PropertiesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance10FeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDataGraphOpticalFlowFeaturesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderLongVectorPropertiesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderLongVectorFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelineCacheIncrementalModeFeaturesSEC *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderUniformBufferUnsizedArrayFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceComputeOccupancyPriorityFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance11FeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderSubgroupPartitionedFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExtendedFlagsFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderOCPMicroscalingTypesFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderMixedFloatDotProductFeaturesVALVE *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceThrottleHintFeaturesSEC *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDataGraphNeuralAcceleratorStatisticsFeaturesARM *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePrimitiveRestartIndexFeaturesEXT *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCooperativeMatrixDecodeVectorFeaturesNV *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFeatures *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePortabilitySubsetFeaturesKHR *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceProperties *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceLimits *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSparseProperties *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceToolProperties *dest);
    bool GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePortabilitySubsetPropertiesKHR *dest);

    static bool WarnIfNotEqualFloat(ProfileLayerSettings *layer_settings, bool enable_warnings, const char* device_name, const char *cap_name, const float new_value, const float old_value, const bool not_modifiable) {
        if (std::abs(new_value - old_value) > 0.0001f) {
            if (enable_warnings) {
                if (not_modifiable) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                        "'%s' is not modifiable but the profile value (%3.2f) is different from the device (%s) value (%3.2f)\n", cap_name, new_value, device_name, old_value);
                } else {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                        "'%s' profile value (%3.2f) is different from the device (%s) supported value (%3.2f)\n", cap_name, new_value, device_name, old_value);
                }
            }
            return true;
        }
        return false;
    }

    static bool WarnIfNotEqualBool(ProfileLayerSettings *layer_settings, bool enable_warnings, const char* device_name, const char *cap_name, const bool new_value, const bool old_value, const bool not_modifiable) {
        if (new_value != old_value) {
            if (enable_warnings) {
                if (not_modifiable) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                        "'%s' is not modifiable but the profile value (%s) is different from the device (%s) value (%s)\n", cap_name, new_value ? "true" : "false", device_name, old_value ? "true" : "false");
                } else if (new_value) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                        "'%s' profile value is enabled in the profile, but the device (%s) does not support it\n", cap_name, device_name);
                }
            }
            return true;
        }
        return false;
    }

    static bool WarnIfNotEqualEnum(ProfileLayerSettings *layer_settings, bool enable_warnings, const char* device_name, const char *cap_name, const uint32_t new_value, const uint32_t old_value, const bool not_modifiable) {
        if (new_value != old_value) {
            if (enable_warnings) {
                if (not_modifiable) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                        "'%s' is not modifiable but the profile value (%" PRIu32 ") is different from the device (%s) value (%" PRIu32 ")\n", cap_name, new_value, device_name, old_value);
                } else {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                        "'%s' profile value (%" PRIu32 ") is different from the device (%s) value (%" PRIu32 ")\n", cap_name, new_value, device_name, old_value);
                }
            }
            return true;
        }
        return false;
    }

    static bool WarnIfNotEqual(ProfileLayerSettings *layer_settings, bool enable_warnings, const char* device_name, const char *cap_name, const uint32_t new_value, const uint32_t old_value, const bool not_modifiable) {
        if (new_value != old_value) {
            if (enable_warnings) {
                if (not_modifiable) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                        "'%s' is not modifiable but the profile value (%" PRIu32 ") is different from the device (%s) value (%" PRIu32 ")\n", cap_name, new_value, device_name, old_value);
                } else {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                        "'%s' profile value (%" PRIu32 ") is different from the device (%s) value (%" PRIu32 ")\n", cap_name, new_value, device_name, old_value);
                }
            }
            return true;
        }
        return false;
    }

    static bool WarnIfNotEqual32u(ProfileLayerSettings *layer_settings, bool enable_warnings, const char* device_name, const char *cap_name, const uint32_t new_value, const uint32_t old_value, const bool not_modifiable) {
        if (new_value != old_value) {
            if (enable_warnings) {
                if (not_modifiable) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                        "'%s' is not modifiable but the profile value (%" PRIu32 ") is different from the device (%s) value (%" PRIu32 ")\n", cap_name, new_value, device_name, old_value);
                } else {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                        "'%s' profile value (%" PRIu32 ") is different from the device (%s) value (%" PRIu32 ")\n", cap_name, new_value, device_name, old_value);
                }
            }
            return true;
        }
        return false;
    }

    static bool WarnIfNotEqual(ProfileLayerSettings *layer_settings, bool enable_warnings, const char* device_name, const char *cap_name, const int32_t new_value, const int32_t old_value, const bool not_modifiable) {
        if (new_value != old_value) {
            if (enable_warnings) {
                if (not_modifiable) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                        "'%s' is not modifiable but the profile value (%" PRIi32 ") is different from the device (%s) value (%" PRIi32 ")\n", cap_name, new_value, device_name, old_value);
                } else {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                        "'%s' profile value (%" PRIi32 ") is different from the device (%s) value (%" PRIi32 ")\n", cap_name, new_value, device_name, old_value);
                }
            }
            return true;
        }
        return false;
    }

    static bool WarnIfNotEqual64u(ProfileLayerSettings *layer_settings, bool enable_warnings, const char* device_name, const char *cap_name, const uint64_t new_value, const uint64_t old_value, const bool not_modifiable) {
        if (new_value != old_value) {
            if (enable_warnings) {
                if (not_modifiable) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                        "'%s' is not modifiable but the profile value (%" PRIu64 ") is different from the device (%s) value (%" PRIu64 ")\n", cap_name, new_value, device_name, old_value);
                } else {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                        "'%s' profile value (%" PRIu64 ") is different from the device (%s) value (%" PRIu64 ")\n", cap_name, new_value, device_name, old_value);
                }
            }
            return true;
        }
        return false;
    }

    static bool WarnIfNotEquali64(ProfileLayerSettings *layer_settings, bool enable_warnings, const char* device_name, const char *cap_name, const int64_t new_value, const int64_t old_value, const bool not_modifiable) {
        if (new_value != old_value) {
            if (enable_warnings) {
                if (not_modifiable) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                        "'%s' is not modifiable but the profile value (%" PRIi64 ") is different from the device (%s) value (%" PRIi64 ")\n", cap_name, new_value, device_name, old_value);
                } else {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                        "'%s' profile value (%" PRIi64 ") is different from the device (%s) value (%" PRIi64 ")\n", cap_name, new_value, device_name, old_value);
                }
            }
            return true;
        }
        return false;
    }

    static bool WarnIfNotEqualSizet(ProfileLayerSettings *layer_settings, bool enable_warnings, const char* device_name, const char *cap_name, const size_t new_value, const size_t old_value, const bool not_modifiable) {
        if (new_value != old_value) {
            if (enable_warnings) {
                if (not_modifiable) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                        "'%s' is not modifiable but the profile value (%" PRIuLEAST64 ") is different from the device (%s) value (%" PRIuLEAST64 ")\n", cap_name, new_value, device_name, old_value);
                } else {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                        "'%s' profile value (%" PRIuLEAST64 ") is different from the device (%s) value (%" PRIuLEAST64 ")\n", cap_name, new_value, device_name, old_value);
                }
            }
            return true;
        }
        return false;
    }

    static bool WarnIfMissingBit(ProfileLayerSettings *layer_settings, bool enable_warnings, const char* device_name, const char *cap_name, const uint64_t new_value, const uint64_t old_value, const bool not_modifiable) {
        if ((old_value | new_value) != old_value) {
            if (enable_warnings) {
                if (not_modifiable) {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                        "'%s' is not modifiable but the profile value (%" PRIu64 ") is different from the device (%s) value (%" PRIu64 ")\n", cap_name, new_value, device_name, old_value);
                } else {
                    LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                        "'%s' profile value (%" PRIu64 ") has bits set that the device (%s) value (%" PRIu64 ") does not\n", cap_name, new_value, device_name, old_value);
                }
            }
            return true;
        }
        return false;
    }

    static bool WarnIfGreater(ProfileLayerSettings *layer_settings, bool enable_warnings, const char* device_name, const char *cap_name, const uint64_t new_value, const uint64_t old_value, const bool not_modifiable) {
        (void)not_modifiable;

        if (new_value > old_value) {
            if (enable_warnings) {
                LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                    "'%s' profile value (%" PRIu64 ") is greater than device (%s) value (%" PRIu64 ")\n", cap_name, new_value, device_name, old_value);
            }
            return true;
        }
        return false;
    }

    static bool WarnIfGreaterSizet(ProfileLayerSettings *layer_settings, bool enable_warnings, const char* device_name, const char *cap_name, const size_t new_value, const size_t old_value, const bool not_modifiable) {
        (void)not_modifiable;

        if (new_value > old_value) {
            if (enable_warnings) {
                LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                    "'%s' profile value (%" PRIuLEAST64 ") is greater than device (%s) value (%" PRIuLEAST64 ")\n", cap_name, new_value, device_name, old_value);
            }
            return true;
        }
        return false;
    }

    static bool WarnIfGreaterFloat(ProfileLayerSettings *layer_settings, bool enable_warnings, const char* device_name, const char *cap_name, const float new_value, const float old_value, const bool not_modifiable) {
        (void)not_modifiable;

        if (new_value > old_value) {
            if (enable_warnings) {
                LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                    "'%s' profile value (%3.2f) is greater than device (%s) value (%3.2f)\n", cap_name, new_value, device_name, old_value);
            }
            return true;
        }
        return false;
    }

    static bool WarnIfLesser(ProfileLayerSettings *layer_settings, bool enable_warnings, const char* device_name, const char *cap_name, const uint64_t new_value, const uint64_t old_value, const bool not_modifiable) {
        (void)not_modifiable;

        if (new_value < old_value) {
            if (enable_warnings) {
                LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                "'%s' profile value (%" PRIu64 ") is lesser than device (%s) value (%" PRIu64 ")\n", cap_name, new_value, device_name, old_value);
            }
            return true;
        }
        return false;
    }

    static bool WarnIfLesserSizet(ProfileLayerSettings *layer_settings, bool enable_warnings, const char* device_name, const char *cap_name, const size_t new_value, const size_t old_value, const bool not_modifiable) {
        (void)not_modifiable;

        if (new_value < old_value) {
            if (enable_warnings) {
                LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                    "'%s' profile value (%" PRIuLEAST64 ") is lesser than device (%s) value (%" PRIuLEAST64 ")\n", cap_name, new_value, device_name, old_value);
            }
            return true;
        }
        return false;
    }

    static bool WarnIfLesserFloat(ProfileLayerSettings *layer_settings, bool enable_warnings, const char* device_name, const char *cap_name, const float new_value, const float old_value, const bool not_modifiable) {
        (void)not_modifiable;

        if (new_value < old_value) {
            if (enable_warnings) {
                LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                    "'%s' profile value (%3.2f) is lesser than device (%s) value (%3.2f)\n", cap_name, new_value, device_name, old_value);
            }
            return true;
        }
        return false;
    }

    bool GetValue(const char* device_name, const Json::Value &parent, const std::string &member, const char *name, float *dest, bool not_modifiable, bool requested_profile,
                  std::function<bool(ProfileLayerSettings *, bool, const char *, const char *, float, float, bool)> warn_func = nullptr) {
        if (member != name) {
            return true;
        }
        // If the value is not modifiable and we don't warn, we can return immediately, we will use the native value
        if (not_modifiable && warn_func == nullptr) {
            return true;
        }

        const Json::Value value = parent[name];
        if (!value.isDouble()) {
            return true;
        }
        bool valid = true;
        const float new_value = value.asFloat();
        if (warn_func) {
            if (warn_func(&layer_settings, requested_profile, device_name, name, new_value, *dest, not_modifiable)) {
                valid = false;
            }
        }
        if (!not_modifiable) {
            *dest = new_value;
        }

        return valid;
    }

    bool GetValue(const char* device_name, const Json::Value &parent, const std::string &member, const char *name, uint8_t *dest, bool not_modifiable, bool requested_profile,
                  std::function<bool(ProfileLayerSettings *, bool, const char *, const char *, uint8_t, uint8_t, bool)> warn_func = nullptr) {
        if (member != name) {
            return true;
        }
        // If the value is not modifiable and we don't warn, we can return immediately, we will use the native value
        if (not_modifiable && warn_func == nullptr) {
            return true;
        }

        const Json::Value value = parent[name];
        bool valid = true;
        if (value.isBool()) {
            const bool new_value = value.asBool();
            if (warn_func) {
                if (warn_func(&layer_settings, requested_profile, device_name, name, new_value, *dest, not_modifiable)) {
                    valid = false;
                }
            }
            *dest = static_cast<uint8_t>(new_value);
        } else if (value.isArray()) {
            uint64_t sum_bits = 0;
            for (const auto &entry : value) {
                if (entry.isString()) {
                    sum_bits |= VkStringToUint64(entry.asString());
                }
            }
            if (!not_modifiable) {
                *dest = static_cast<uint8_t>(sum_bits);
            }
        } else if (value.isUInt()) {
            const uint8_t new_value = static_cast<uint8_t>(value.asUInt());
            if (warn_func) {
                if (warn_func(&layer_settings, requested_profile, device_name, name, new_value, *dest, not_modifiable)) {
                    valid = false;
                }
            }
            if (!not_modifiable) {
                *dest = static_cast<uint8_t>(new_value);
            }
        }
        return valid;
    }

    bool GetValue(const char* device_name, const Json::Value &parent, const std::string &member, const char *name, int32_t *dest, bool not_modifiable, bool requested_profile,
                  std::function<bool(ProfileLayerSettings *, bool, const char *, const char *, int32_t, int32_t, bool)> warn_func = nullptr) {
        if (member != name) {
            return true;
        }
        // If the value is not modifiable and we don't warn, we can return immediately, we will use the native value
        if (not_modifiable && warn_func == nullptr) {
            return true;
        }

        const Json::Value value = parent[name];
        if (!value.isInt()) {
            return true;
        }
        bool valid = true;
        const int32_t new_value = value.asInt();
        if (warn_func) {
            if (warn_func(&layer_settings, requested_profile, device_name, name, new_value, *dest, not_modifiable)) {
                valid = false;
            }
        }

        if (!not_modifiable) {
            *dest = new_value;
        }
        return valid;
    }

    bool GetValue(const char* device_name, const Json::Value &parent, const std::string &member, const char *name, int64_t *dest, bool not_modifiable, bool requested_profile,
                  std::function<bool(ProfileLayerSettings *, bool, const char *, const char *, int64_t, int64_t, bool)> warn_func = nullptr) {
        if (member != name) {
            return true;
        }
        // If the value is not modifiable and we don't warn, we can return immediately, we will use the native value
        if (not_modifiable && warn_func == nullptr) {
            return true;
        }

        const Json::Value value = parent[name];
        if (!value.isInt64()) {
            return true;
        }
        bool valid = true;
        const int64_t new_value = value.asInt64();
        if (warn_func) {
            if (warn_func(&layer_settings, requested_profile, device_name, name, new_value, *dest, not_modifiable)) {
                valid = false;
            }
        }

        if (!not_modifiable) {
            *dest = new_value;
        }
        return valid;
    }

    bool GetValue(const char* device_name, const Json::Value &parent, const std::string &member, const char *name, uint32_t *dest, bool not_modifiable, bool requested_profile,
                  std::function<bool(ProfileLayerSettings *, bool, const char *, const char *, uint32_t, uint32_t, bool)> warn_func = nullptr) {
        if (member != name) {
            return true;
        }
        // If the value is not modifiable and we don't warn, we can return immediately, we will use the native value
        if (not_modifiable && warn_func == nullptr) {
            return true;
        }

        const Json::Value value = parent[name];
        bool valid = true;
        if (value.isBool()) {
            const bool new_value = value.asBool();
            if (warn_func) {
                if (warn_func(&layer_settings, requested_profile, device_name, name, new_value, *dest, not_modifiable)) {
                    valid = false;
                }
            }

            if (!not_modifiable) {
                *dest = static_cast<uint32_t>(new_value);
            }
        } else if (value.isArray()) {
            uint64_t sum_bits = 0;
            for (const auto &entry : value) {
                if (entry.isString()) {
                    sum_bits |= VkStringToUint64(entry.asString());
                }
            }

            if (!not_modifiable) {
                *dest = static_cast<uint32_t>(sum_bits);
            }
        } else if (value.isUInt()) {
            const uint32_t new_value = value.asUInt();
            if (warn_func) {
                if (warn_func(&layer_settings, requested_profile, device_name, name, new_value, *dest, not_modifiable)) {
                    valid = false;
                }
            }

            if (!not_modifiable) {
                *dest = new_value;
            }
        }
        return valid;
    }

    bool GetValue(const char* device_name, const Json::Value &parent, const std::string &member, const char *name, uint64_t *dest, bool not_modifiable, bool requested_profile,
                  std::function<bool(ProfileLayerSettings *, bool, const char *, const char *, uint64_t, uint64_t, bool)> warn_func = nullptr) {
        if (member != name) {
            return true;
        }
        // If the value is not modifiable and we don't warn, we can return immediately, we will use the native value
        if (not_modifiable && warn_func == nullptr) {
            return true;
        }

        const Json::Value value = parent[name];
        if (!value.isUInt64()) {
            return true;
        }
        bool valid = true;
        const uint64_t new_value = value.asUInt64();
        if (warn_func) {
            if (warn_func(&layer_settings, requested_profile, device_name, name, new_value, *dest, not_modifiable)) {
                valid = false;
            }
        }

        if (!not_modifiable) {
            *dest = new_value;
        }
        return valid;
    }

    bool GetValue(const char* device_name, const Json::Value &pparent, const std::string &member, const char *name, VkExtent2D *dest, bool not_modifiable, bool requested_profile,
                  std::function<bool(ProfileLayerSettings *, bool, const char *, const char *, uint32_t, uint32_t, bool)> warn_func = nullptr) {
        if (member != name) {
            return true;
        }
        // If the value is not modifiable and we don't warn, we can return immediately, we will use the native value
        if (not_modifiable && warn_func == nullptr) {
            return true;
        }

        const Json::Value parent = pparent[name];
        if (parent.type() != Json::objectValue) {
            return true;
        }
        bool valid = true;
        for (const auto &prop : parent.getMemberNames()) {
            GET_VALUE_WARN(prop, width, not_modifiable, requested_profile, warn_func);
            GET_VALUE_WARN(prop, height, not_modifiable, requested_profile, warn_func);
        }
        return valid;
    }

    bool GetValue(const char* device_name, const Json::Value &pparent, const std::string &member, const char *name, VkExtent3D *dest, bool not_modifiable, bool requested_profile,
                  std::function<bool(ProfileLayerSettings *, bool, const char *, const char *, uint32_t, uint32_t, bool)> warn_func = nullptr) {
        if (member != name) {
            return true;
        }
        // If the value is not modifiable and we don't warn, we can return immediately, we will use the native value
        if (not_modifiable && warn_func == nullptr) {
            return true;
        }

        const Json::Value parent = pparent[name];
        if (parent.type() != Json::objectValue) {
            return true;
        }
        bool valid = true;
        for (const auto &prop : parent.getMemberNames()) {
            GET_VALUE_WARN(prop, width, not_modifiable, requested_profile, warn_func);
            GET_VALUE_WARN(prop, height, not_modifiable, requested_profile, warn_func);
            GET_VALUE_WARN(prop, depth, not_modifiable, requested_profile, warn_func);
        }
        return valid;
    }

    bool GetValueSizet(const char* device_name, const Json::Value &parent, const std::string &member, const char *name, size_t *dest, bool not_modifiable, bool requested_profile,
                       std::function<bool(ProfileLayerSettings *, bool, const char *, const char *, size_t, size_t, bool)> warn_func = nullptr) {
        if (member != name) {
            return true;
        }
        // If the value is not modifiable and we don't warn, we can return immediately, we will use the native value
        if (not_modifiable && warn_func == nullptr) {
            return true;
        }

        const Json::Value value = parent[name];
        bool valid = true;
        if (value.isUInt()) {
            const size_t new_value = value.asUInt();
            if (warn_func) {
                if (warn_func(&layer_settings, requested_profile, device_name, name, new_value, *dest, not_modifiable)) {
                    valid = false;
                }
            }

            if (!not_modifiable) {
                *dest = new_value;
            }
        }
        return valid;
    }

    template <typename T>  // for Vulkan enum types
    bool GetValueFlag(const char* device_name, const Json::Value &parent, const std::string &member, const char *name, T *dest, bool not_modifiable, bool requested_profile,
                      std::function<bool(ProfileLayerSettings *, bool, const char *, const char *, T, T, bool)> warn_func = nullptr) {
        if (member != name) {
            return true;
        }
        // If the value is not modifiable and we don't warn, we can return immediately, we will use the native value
        if (not_modifiable && warn_func == nullptr) {
            return true;
        }

        const Json::Value value = parent[name];
        bool valid = true;
        uint64_t new_value = 0;
        if (value.isArray()) {
            for (const auto &entry : value) {
                if (entry.isString()) {
                    new_value |= VkStringToUint64(entry.asString());
                }
            }
        }
        if (WarnIfMissingBit(&layer_settings, requested_profile, device_name, name, new_value, static_cast<uint64_t>(*dest), not_modifiable)) {
            valid = false;
        }

        if (!not_modifiable) {
            *dest = static_cast<T>(new_value);
        }
        return valid;
    }

    template <typename T>  // for Vulkan enum types
    bool GetValueEnum(const char* device_name, const Json::Value &parent, const std::string &member, const char *name, T *dest, bool not_modifiable, bool requested_profile,
                      std::function<bool(ProfileLayerSettings *, bool, const char *, const char *, uint32_t, uint32_t, bool)> warn_func = nullptr) {
        if (member != name) {
            return true;
        }
        // If the value is not modifiable and we don't warn, we can return immediately, we will use the native value
        if (not_modifiable && warn_func == nullptr) {
            return true;
        }

        const Json::Value value = parent[name];
        bool valid = true;
        uint32_t new_value = 0;
        if (value.isString()) {
            new_value = static_cast<T>(VkStringToUint64(value.asString()));
        }
        if (warn_func) {
            if (warn_func(&layer_settings, requested_profile, device_name, name, new_value, *dest, not_modifiable)) {
                valid = false;
            }
        } else {
            if (WarnIfNotEqualEnum(&layer_settings, requested_profile, device_name, name, new_value, *dest, not_modifiable)) {
                valid = false;
            }
        }

        if (!not_modifiable) {
            *dest = static_cast<T>(new_value);
        }
        return valid;
    }

    int GetArray(const char* device_name, const Json::Value &parent, const std::string &member, const char *name, uint8_t *dest, bool not_modifiable) {
        (void)device_name;

        if (member != name) {
            return -1;
        }

        const Json::Value value = parent[name];
        if (value.type() != Json::arrayValue) {
            return -1;
        }
        const int count = static_cast<int>(value.size());
        if (!not_modifiable) {
            for (int i = 0; i < count; ++i) {
                dest[i] = static_cast<uint8_t>(value[i].asUInt());
            }
        }
        return count;
    }

    int GetArray(const char* device_name, const Json::Value &parent, const std::string &member, const char *name, uint32_t *dest, bool not_modifiable) {
        (void)device_name;

        if (member != name) {
            return -1;
        }

        const Json::Value value = parent[name];
        if (value.type() != Json::arrayValue) {
            return -1;
        }
        const int count = static_cast<int>(value.size());
        if (!not_modifiable) {
            for (int i = 0; i < count; ++i) {
                dest[i] = static_cast<uint32_t>(value[i].asUInt());
            }
        }
        return count;
    }

    int GetArray(const char* device_name, const Json::Value &parent, const std::string &member, const char *name, float *dest, bool not_modifiable) {
        (void)device_name;

        if (member != name) {
            return -1;
        }

        const Json::Value value = parent[name];
        if (value.type() != Json::arrayValue) {
            return -1;
        }
        const int count = static_cast<int>(value.size());
        if (!not_modifiable) {
            for (int i = 0; i < count; ++i) {
                dest[i] = value[i].asFloat();
            }
        }
        return count;
    }

    int GetArray(const char* device_name, const Json::Value &parent, const std::string &member, const char *name, char *dest, bool not_modifiable) {
        (void)device_name;

        if (member != name) {
            return -1;
        }

        const Json::Value value = parent[name];
        if (!value.isString()) {
            return -1;
        }
        const char *new_value = value.asCString();
        int count = 0;
        if (!not_modifiable) {
            dest[0] = '\0';
            if (new_value) {
                count = static_cast<int>(strlen(new_value));
                strcpy(dest, new_value);
            }
        }
        return count;
    }

    int GetArray(const char* device_name, const Json::Value &parent, const std::string &member, const char *name, VkImageLayout *dest, uint32_t *destCount, bool not_modifiable) {
        (void)device_name;

        if (member != name) {
            return -1;
        }

        const Json::Value value = parent[name];
        if (value.type() != Json::arrayValue) {
            return -1;
        }
        const int count = static_cast<int>(value.size());
        if (!not_modifiable) {
            *destCount = static_cast<uint32_t>(count);
            for (int i = 0; i < count; ++i) {
                dest[i] = StringToImageLayout(value[i].asCString());
            }
        }
        return count;
    }

    typedef std::unordered_map<VkInstance, JsonLoader> ProfileMap;
    static ProfileMap& profile_map() {
        static ProfileMap profile_map_;
        return profile_map_;
    }
};

static bool IsASTCHDRFormat(VkFormat format) {
    switch (format) {
        case VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK:
        case VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK:
        case VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK:
        case VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK:
        case VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK:
        case VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK:
        case VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK:
        case VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK:
        case VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK:
        case VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK:
        case VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK:
        case VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK:
        case VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK:
        case VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK:
        case VK_FORMAT_ASTC_3x3x3_SFLOAT_BLOCK_EXT:
        case VK_FORMAT_ASTC_4x3x3_SFLOAT_BLOCK_EXT:
        case VK_FORMAT_ASTC_4x4x3_SFLOAT_BLOCK_EXT:
        case VK_FORMAT_ASTC_4x4x4_SFLOAT_BLOCK_EXT:
        case VK_FORMAT_ASTC_5x4x4_SFLOAT_BLOCK_EXT:
        case VK_FORMAT_ASTC_5x5x4_SFLOAT_BLOCK_EXT:
        case VK_FORMAT_ASTC_5x5x5_SFLOAT_BLOCK_EXT:
        case VK_FORMAT_ASTC_6x5x5_SFLOAT_BLOCK_EXT:
        case VK_FORMAT_ASTC_6x6x5_SFLOAT_BLOCK_EXT:
        case VK_FORMAT_ASTC_6x6x6_SFLOAT_BLOCK_EXT:
            return true;
        default:
            return false;
    }
}

static bool IsASTCLDRFormat(VkFormat format) {
    switch (format) {
        case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
        case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
        case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
        case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
        case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
        case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
        case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
        case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
        case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
        case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
        case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
        case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
        case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
        case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
        case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
        case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
        case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
        case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
        case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
        case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
        case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
        case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
        case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
        case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
        case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
        case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
        case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
        case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
        case VK_FORMAT_ASTC_3x3x3_UNORM_BLOCK_EXT:
        case VK_FORMAT_ASTC_3x3x3_SRGB_BLOCK_EXT:
        case VK_FORMAT_ASTC_4x3x3_UNORM_BLOCK_EXT:
        case VK_FORMAT_ASTC_4x3x3_SRGB_BLOCK_EXT:
        case VK_FORMAT_ASTC_4x4x3_UNORM_BLOCK_EXT:
        case VK_FORMAT_ASTC_4x4x3_SRGB_BLOCK_EXT:
        case VK_FORMAT_ASTC_4x4x4_UNORM_BLOCK_EXT:
        case VK_FORMAT_ASTC_4x4x4_SRGB_BLOCK_EXT:
        case VK_FORMAT_ASTC_5x4x4_UNORM_BLOCK_EXT:
        case VK_FORMAT_ASTC_5x4x4_SRGB_BLOCK_EXT:
        case VK_FORMAT_ASTC_5x5x4_UNORM_BLOCK_EXT:
        case VK_FORMAT_ASTC_5x5x4_SRGB_BLOCK_EXT:
        case VK_FORMAT_ASTC_5x5x5_UNORM_BLOCK_EXT:
        case VK_FORMAT_ASTC_5x5x5_SRGB_BLOCK_EXT:
        case VK_FORMAT_ASTC_6x5x5_UNORM_BLOCK_EXT:
        case VK_FORMAT_ASTC_6x5x5_SRGB_BLOCK_EXT:
        case VK_FORMAT_ASTC_6x6x5_UNORM_BLOCK_EXT:
        case VK_FORMAT_ASTC_6x6x5_SRGB_BLOCK_EXT:
        case VK_FORMAT_ASTC_6x6x6_UNORM_BLOCK_EXT:
        case VK_FORMAT_ASTC_6x6x6_SRGB_BLOCK_EXT:
            return true;
        default:
            return false;
    }
}

static bool IsBCFormat(VkFormat format) {
    switch (format) {
        case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
        case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
        case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
        case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
        case VK_FORMAT_BC2_UNORM_BLOCK:
        case VK_FORMAT_BC2_SRGB_BLOCK:
        case VK_FORMAT_BC3_UNORM_BLOCK:
        case VK_FORMAT_BC3_SRGB_BLOCK:
        case VK_FORMAT_BC4_UNORM_BLOCK:
        case VK_FORMAT_BC4_SNORM_BLOCK:
        case VK_FORMAT_BC5_UNORM_BLOCK:
        case VK_FORMAT_BC5_SNORM_BLOCK:
        case VK_FORMAT_BC6H_UFLOAT_BLOCK:
        case VK_FORMAT_BC6H_SFLOAT_BLOCK:
        case VK_FORMAT_BC7_UNORM_BLOCK:
        case VK_FORMAT_BC7_SRGB_BLOCK:
            return true;
        default:
            return false;
    }
}

static bool IsEACFormat(VkFormat format) {
    switch (format) {
        case VK_FORMAT_EAC_R11_UNORM_BLOCK:
        case VK_FORMAT_EAC_R11_SNORM_BLOCK:
        case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
        case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
            return true;
        default:
            return false;
    }
}

static bool IsETC2Format(VkFormat format) {
    switch (format) {
        case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
        case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
        case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
        case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
        case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
        case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
            return true;
        default:
            return false;
    }
}

static bool IsPVRTCFormat(VkFormat format) {
    switch (format) {
        case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:
        case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG:
        case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG:
        case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG:
        case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG:
        case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG:
        case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG:
        case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG:
            return true;
        default:
            return false;
    }
}

bool JsonLoader::WarnDuplicatedFeature(const Json::Value &parent) {
    bool valid = true;
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDevicePrivateDataFeatures", "VkPhysicalDevicePrivateDataFeaturesEXT", "VkPhysicalDeviceVulkan13Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceVariablePointersFeatures", "VkPhysicalDeviceVariablePointersFeaturesKHR", "VkPhysicalDeviceVariablePointerFeaturesKHR", "VkPhysicalDeviceVariablePointerFeatures", "VkPhysicalDeviceVulkan11Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceMultiviewFeatures", "VkPhysicalDeviceMultiviewFeaturesKHR", "VkPhysicalDeviceVulkan11Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDevice16BitStorageFeatures", "VkPhysicalDevice16BitStorageFeaturesKHR", "VkPhysicalDeviceVulkan11Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures", "VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR", "VkPhysicalDeviceVulkan12Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceSamplerYcbcrConversionFeatures", "VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR", "VkPhysicalDeviceVulkan11Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceProtectedMemoryFeatures", "VkPhysicalDeviceVulkan11Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceInlineUniformBlockFeatures", "VkPhysicalDeviceInlineUniformBlockFeaturesEXT", "VkPhysicalDeviceVulkan13Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceMaintenance4Features", "VkPhysicalDeviceMaintenance4FeaturesKHR", "VkPhysicalDeviceVulkan13Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceMaintenance5Features", "VkPhysicalDeviceMaintenance5FeaturesKHR", "VkPhysicalDeviceVulkan14Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceMaintenance6Features", "VkPhysicalDeviceMaintenance6FeaturesKHR", "VkPhysicalDeviceVulkan14Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceShaderDrawParametersFeatures", "VkPhysicalDeviceShaderDrawParameterFeatures", "VkPhysicalDeviceVulkan11Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceShaderFloat16Int8Features", "VkPhysicalDeviceShaderFloat16Int8FeaturesKHR", "VkPhysicalDeviceFloat16Int8FeaturesKHR", "VkPhysicalDeviceVulkan12Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceHostQueryResetFeatures", "VkPhysicalDeviceHostQueryResetFeaturesEXT", "VkPhysicalDeviceVulkan12Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceGlobalPriorityQueryFeatures", "VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR", "VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT", "VkPhysicalDeviceVulkan14Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceDescriptorIndexingFeatures", "VkPhysicalDeviceDescriptorIndexingFeaturesEXT", "VkPhysicalDeviceVulkan12Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceTimelineSemaphoreFeatures", "VkPhysicalDeviceTimelineSemaphoreFeaturesKHR", "VkPhysicalDeviceVulkan12Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDevice8BitStorageFeatures", "VkPhysicalDevice8BitStorageFeaturesKHR", "VkPhysicalDeviceVulkan12Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceVulkanMemoryModelFeatures", "VkPhysicalDeviceVulkanMemoryModelFeaturesKHR", "VkPhysicalDeviceVulkan12Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceShaderAtomicInt64Features", "VkPhysicalDeviceShaderAtomicInt64FeaturesKHR", "VkPhysicalDeviceVulkan12Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceVertexAttributeDivisorFeatures", "VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR", "VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT", "VkPhysicalDeviceVulkan14Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR", "VkPhysicalDeviceComputeShaderDerivativesFeaturesNV"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceMemoryDecompressionFeaturesEXT", "VkPhysicalDeviceMemoryDecompressionFeaturesNV"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT", "VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceScalarBlockLayoutFeatures", "VkPhysicalDeviceScalarBlockLayoutFeaturesEXT", "VkPhysicalDeviceVulkan12Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceUniformBufferStandardLayoutFeatures", "VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR", "VkPhysicalDeviceVulkan12Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceBufferDeviceAddressFeatures", "VkPhysicalDeviceBufferDeviceAddressFeaturesKHR", "VkPhysicalDeviceVulkan12Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceBufferDeviceAddressFeaturesEXT", "VkPhysicalDeviceBufferAddressFeaturesEXT"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceImagelessFramebufferFeatures", "VkPhysicalDeviceImagelessFramebufferFeaturesKHR", "VkPhysicalDeviceVulkan12Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceTextureCompressionASTCHDRFeatures", "VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT", "VkPhysicalDeviceVulkan13Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceIndexTypeUint8Features", "VkPhysicalDeviceIndexTypeUint8FeaturesKHR", "VkPhysicalDeviceIndexTypeUint8FeaturesEXT", "VkPhysicalDeviceVulkan14Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures", "VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR", "VkPhysicalDeviceVulkan12Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures", "VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT", "VkPhysicalDeviceVulkan13Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceSubgroupSizeControlFeatures", "VkPhysicalDeviceSubgroupSizeControlFeaturesEXT", "VkPhysicalDeviceVulkan13Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceLineRasterizationFeatures", "VkPhysicalDeviceLineRasterizationFeaturesKHR", "VkPhysicalDeviceLineRasterizationFeaturesEXT", "VkPhysicalDeviceVulkan14Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDevicePipelineCreationCacheControlFeatures", "VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT", "VkPhysicalDeviceVulkan13Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures", "VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR", "VkPhysicalDeviceVulkan13Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceRobustness2FeaturesKHR", "VkPhysicalDeviceRobustness2FeaturesEXT"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceImageRobustnessFeatures", "VkPhysicalDeviceImageRobustnessFeaturesEXT", "VkPhysicalDeviceVulkan13Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceShaderTerminateInvocationFeatures", "VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR", "VkPhysicalDeviceVulkan13Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT", "VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceSynchronization2Features", "VkPhysicalDeviceSynchronization2FeaturesKHR", "VkPhysicalDeviceVulkan13Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceHostImageCopyFeatures", "VkPhysicalDeviceHostImageCopyFeaturesEXT", "VkPhysicalDeviceVulkan14Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDevicePipelineProtectedAccessFeatures", "VkPhysicalDevicePipelineProtectedAccessFeaturesEXT", "VkPhysicalDeviceVulkan14Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceShaderIntegerDotProductFeatures", "VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR", "VkPhysicalDeviceVulkan13Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR", "VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceDynamicRenderingFeatures", "VkPhysicalDeviceDynamicRenderingFeaturesKHR", "VkPhysicalDeviceVulkan13Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT", "VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDevicePipelineRobustnessFeatures", "VkPhysicalDevicePipelineRobustnessFeaturesEXT", "VkPhysicalDeviceVulkan14Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceSwapchainMaintenance1FeaturesKHR", "VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceShaderSubgroupRotateFeatures", "VkPhysicalDeviceShaderSubgroupRotateFeaturesKHR", "VkPhysicalDeviceVulkan14Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceShaderExpectAssumeFeatures", "VkPhysicalDeviceShaderExpectAssumeFeaturesKHR", "VkPhysicalDeviceVulkan14Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceShaderFloatControls2Features", "VkPhysicalDeviceShaderFloatControls2FeaturesKHR", "VkPhysicalDeviceVulkan14Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceDynamicRenderingLocalReadFeatures", "VkPhysicalDeviceDynamicRenderingLocalReadFeaturesKHR", "VkPhysicalDeviceVulkan14Features"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR", "VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceDepthClampZeroOneFeaturesKHR", "VkPhysicalDeviceDepthClampZeroOneFeaturesEXT"});
    return valid;
}

bool JsonLoader::WarnDuplicatedProperty(const Json::Value &parent) {
    bool valid = true;
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDevicePushDescriptorProperties", "VkPhysicalDevicePushDescriptorPropertiesKHR", "VkPhysicalDeviceVulkan14Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceDriverProperties", "VkPhysicalDeviceDriverPropertiesKHR", "VkPhysicalDeviceVulkan12Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceIDProperties", "VkPhysicalDeviceIDPropertiesKHR", "VkPhysicalDeviceVulkan11Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceMultiviewProperties", "VkPhysicalDeviceMultiviewPropertiesKHR", "VkPhysicalDeviceVulkan11Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceSubgroupProperties", "VkPhysicalDeviceVulkan11Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDevicePointClippingProperties", "VkPhysicalDevicePointClippingPropertiesKHR", "VkPhysicalDeviceVulkan11Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceProtectedMemoryProperties", "VkPhysicalDeviceVulkan11Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceSamplerFilterMinmaxProperties", "VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT", "VkPhysicalDeviceVulkan12Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceInlineUniformBlockProperties", "VkPhysicalDeviceInlineUniformBlockPropertiesEXT", "VkPhysicalDeviceVulkan13Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceMaintenance3Properties", "VkPhysicalDeviceMaintenance3PropertiesKHR", "VkPhysicalDeviceVulkan11Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceMaintenance4Properties", "VkPhysicalDeviceMaintenance4PropertiesKHR", "VkPhysicalDeviceVulkan13Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceMaintenance5Properties", "VkPhysicalDeviceMaintenance5PropertiesKHR", "VkPhysicalDeviceVulkan14Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceMaintenance6Properties", "VkPhysicalDeviceMaintenance6PropertiesKHR", "VkPhysicalDeviceVulkan14Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceFloatControlsProperties", "VkPhysicalDeviceFloatControlsPropertiesKHR", "VkPhysicalDeviceVulkan12Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceDescriptorIndexingProperties", "VkPhysicalDeviceDescriptorIndexingPropertiesEXT", "VkPhysicalDeviceVulkan12Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceTimelineSemaphoreProperties", "VkPhysicalDeviceTimelineSemaphorePropertiesKHR", "VkPhysicalDeviceVulkan12Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceVertexAttributeDivisorProperties", "VkPhysicalDeviceVertexAttributeDivisorPropertiesKHR", "VkPhysicalDeviceVulkan14Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceDepthStencilResolveProperties", "VkPhysicalDeviceDepthStencilResolvePropertiesKHR", "VkPhysicalDeviceVulkan12Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceCopyMemoryIndirectPropertiesKHR", "VkPhysicalDeviceCopyMemoryIndirectPropertiesNV"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceMemoryDecompressionPropertiesEXT", "VkPhysicalDeviceMemoryDecompressionPropertiesNV"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceFragmentDensityMapOffsetPropertiesEXT", "VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceTexelBufferAlignmentProperties", "VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT", "VkPhysicalDeviceVulkan13Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceSubgroupSizeControlProperties", "VkPhysicalDeviceSubgroupSizeControlPropertiesEXT", "VkPhysicalDeviceVulkan13Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceLineRasterizationProperties", "VkPhysicalDeviceLineRasterizationPropertiesKHR", "VkPhysicalDeviceLineRasterizationPropertiesEXT", "VkPhysicalDeviceVulkan14Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceRobustness2PropertiesKHR", "VkPhysicalDeviceRobustness2PropertiesEXT"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceHostImageCopyProperties", "VkPhysicalDeviceHostImageCopyPropertiesEXT", "VkPhysicalDeviceVulkan14Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDeviceShaderIntegerDotProductProperties", "VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR", "VkPhysicalDeviceVulkan13Properties"});
    valid &= WarnDuplicated(&layer_settings, parent, {"VkPhysicalDevicePipelineRobustnessProperties", "VkPhysicalDevicePipelineRobustnessPropertiesEXT", "VkPhysicalDeviceVulkan14Properties"});
    return valid;
}

bool JsonLoader::GetFeature(const char *device_name, bool requested_profile, const Json::Value &features, const std::string &name) {
    const Json::Value &feature = features[name];

    if (name == "VkPhysicalDeviceFeatures") {
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_features_);
    } else if (name == "VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_device_generated_commands_features_nv_);
    } else if (name == "VkPhysicalDevicePushConstantBankFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_PUSH_CONSTANT_BANK_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_push_constant_bank_features_);
    } else if (name == "VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_DEVICE_GENERATED_COMMANDS_COMPUTE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_device_generated_commands_compute_features_);
    } else if (name == "VkPhysicalDevicePrivateDataFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_PRIVATE_DATA_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_private_data_features_);
    } else if (name == "VkPhysicalDevicePrivateDataFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_private_data_features_);
    } else if (name == "VkPhysicalDeviceClusterAccelerationStructureFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_CLUSTER_ACCELERATION_STRUCTURE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_cluster_acceleration_structure_features_);
    } else if (name == "VkPhysicalDeviceVariablePointerFeatures" || name == "VkPhysicalDeviceVariablePointersFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_1, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_variable_pointer_features_);
    } else if (name == "VkPhysicalDeviceVariablePointerFeaturesKHR" || name == "VkPhysicalDeviceVariablePointersFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_variable_pointer_features_);
    } else if (name == "VkPhysicalDeviceMultiviewFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_MULTIVIEW_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_multiview_features_);
    } else if (name == "VkPhysicalDeviceMultiviewFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_1, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_multiview_features_);
    } else if (name == "VkPhysicalDevicePresentIdFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_PRESENT_ID_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_present_id_features_);
    } else if (name == "VkPhysicalDevicePresentId2FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_PRESENT_ID_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_present_id_2_features_);
    } else if (name == "VkPhysicalDevicePresentWaitFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_PRESENT_WAIT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_present_wait_features_);
    } else if (name == "VkPhysicalDevicePresentWait2FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_PRESENT_WAIT_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_present_wait_2_features_);
    } else if (name == "VkPhysicalDevicePresentTimingFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_PRESENT_TIMING_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_present_timing_features_);
    } else if (name == "VkPhysicalDevice16BitStorageFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_16BIT_STORAGE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_16_bit_storage_features_);
    } else if (name == "VkPhysicalDevice16BitStorageFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_1, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_16_bit_storage_features_);
    } else if (name == "VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_subgroup_extended_types_features_);
    } else if (name == "VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_subgroup_extended_types_features_);
    } else if (name == "VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_sampler_ycbcr_conversion_features_);
    } else if (name == "VkPhysicalDeviceSamplerYcbcrConversionFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_1, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_sampler_ycbcr_conversion_features_);
    } else if (name == "VkPhysicalDeviceProtectedMemoryFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_1, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_protected_memory_features_);
    } else if (name == "VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_blend_operation_advanced_features_);
    } else if (name == "VkPhysicalDeviceMultiDrawFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_MULTI_DRAW_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_multi_draw_features_);
    } else if (name == "VkPhysicalDeviceInlineUniformBlockFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_inline_uniform_block_features_);
    } else if (name == "VkPhysicalDeviceInlineUniformBlockFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_inline_uniform_block_features_);
    } else if (name == "VkPhysicalDeviceMaintenance4FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_MAINTENANCE_4_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_maintenance_4_features_);
    } else if (name == "VkPhysicalDeviceMaintenance4Features") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_maintenance_4_features_);
    } else if (name == "VkPhysicalDeviceMaintenance5FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_MAINTENANCE_5_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_maintenance_5_features_);
    } else if (name == "VkPhysicalDeviceMaintenance5Features") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_maintenance_5_features_);
    } else if (name == "VkPhysicalDeviceMaintenance6FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_MAINTENANCE_6_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_maintenance_6_features_);
    } else if (name == "VkPhysicalDeviceMaintenance6Features") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_maintenance_6_features_);
    } else if (name == "VkPhysicalDeviceMaintenance7FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_MAINTENANCE_7_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_maintenance_7_features_);
    } else if (name == "VkPhysicalDeviceMaintenance8FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_MAINTENANCE_8_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_maintenance_8_features_);
    } else if (name == "VkPhysicalDeviceMaintenance9FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_MAINTENANCE_9_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_maintenance_9_features_);
    } else if (name == "VkPhysicalDeviceMaintenance11FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_MAINTENANCE_11_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_maintenance_11_features_);
    } else if (name == "VkPhysicalDeviceMaintenance10FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_MAINTENANCE_10_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_maintenance_10_features_);
    } else if (name == "VkPhysicalDeviceShaderDrawParameterFeatures" || name == "VkPhysicalDeviceShaderDrawParametersFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_1, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_draw_parameter_features_);
    } else if (name == "VkPhysicalDeviceFloat16Int8FeaturesKHR" || name == "VkPhysicalDeviceShaderFloat16Int8FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_float_16_int_8_features_);
    } else if (name == "VkPhysicalDeviceShaderFloat16Int8Features") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_float_16_int_8_features_);
    } else if (name == "VkPhysicalDeviceHostQueryResetFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_host_query_reset_features_);
    } else if (name == "VkPhysicalDeviceHostQueryResetFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_host_query_reset_features_);
    } else if (name == "VkPhysicalDeviceElapsedTimerQueryFeaturesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_ELAPSED_TIMER_QUERY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_elapsed_timer_query_features_);
    } else if (name == "VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_GLOBAL_PRIORITY_QUERY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_global_priority_query_features_);
    } else if (name == "VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_global_priority_query_features_);
    } else if (name == "VkPhysicalDeviceGlobalPriorityQueryFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_global_priority_query_features_);
    } else if (name == "VkPhysicalDeviceDeviceMemoryReportFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_DEVICE_MEMORY_REPORT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_device_memory_report_features_);
    } else if (name == "VkPhysicalDeviceDescriptorIndexingFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_descriptor_indexing_features_);
    } else if (name == "VkPhysicalDeviceDescriptorIndexingFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_descriptor_indexing_features_);
    } else if (name == "VkPhysicalDeviceTimelineSemaphoreFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_timeline_semaphore_features_);
    } else if (name == "VkPhysicalDeviceTimelineSemaphoreFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_timeline_semaphore_features_);
    } else if (name == "VkPhysicalDevice8BitStorageFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_8BIT_STORAGE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_8_bit_storage_features_);
    } else if (name == "VkPhysicalDevice8BitStorageFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_8_bit_storage_features_);
    } else if (name == "VkPhysicalDeviceConditionalRenderingFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_conditional_rendering_features_);
    } else if (name == "VkPhysicalDeviceVulkanMemoryModelFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_vulkan_memory_model_features_);
    } else if (name == "VkPhysicalDeviceVulkanMemoryModelFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_vulkan_memory_model_features_);
    } else if (name == "VkPhysicalDeviceShaderAtomicInt64FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_atomic_int_64_features_);
    } else if (name == "VkPhysicalDeviceShaderAtomicInt64Features") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_atomic_int_64_features_);
    } else if (name == "VkPhysicalDeviceShaderAtomicFloatFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_atomic_float_features_);
    } else if (name == "VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SHADER_ATOMIC_FLOAT_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_atomic_float_2_features_);
    } else if (name == "VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_vertex_attribute_divisor_features_);
    } else if (name == "VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_vertex_attribute_divisor_features_);
    } else if (name == "VkPhysicalDeviceVertexAttributeDivisorFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_vertex_attribute_divisor_features_);
    } else if (name == "VkPhysicalDeviceASTCDecodeFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_astcdecode_features_);
    } else if (name == "VkPhysicalDeviceTransformFeedbackFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_transform_feedback_features_);
    } else if (name == "VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_REPRESENTATIVE_FRAGMENT_TEST_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_representative_fragment_test_features_);
    } else if (name == "VkPhysicalDeviceExclusiveScissorFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_exclusive_scissor_features_);
    } else if (name == "VkPhysicalDeviceCornerSampledImageFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_CORNER_SAMPLED_IMAGE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_corner_sampled_image_features_);
    } else if (name == "VkPhysicalDeviceComputeShaderDerivativesFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_compute_shader_derivatives_features_);
    } else if (name == "VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_compute_shader_derivatives_features_);
    } else if (name == "VkPhysicalDeviceShaderImageFootprintFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_image_footprint_features_);
    } else if (name == "VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_dedicated_allocation_image_aliasing_features_);
    } else if (name == "VkPhysicalDeviceCopyMemoryIndirectFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_COPY_MEMORY_INDIRECT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_copy_memory_indirect_features_);
    } else if (name == "VkPhysicalDeviceCopyMemoryIndirectFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_COPY_MEMORY_INDIRECT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_copy_memory_indirect_features_nv_);
    } else if (name == "VkPhysicalDeviceMemoryDecompressionFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_MEMORY_DECOMPRESSION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_memory_decompression_features_);
    } else if (name == "VkPhysicalDeviceMemoryDecompressionFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_MEMORY_DECOMPRESSION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_memory_decompression_features_);
    } else if (name == "VkPhysicalDeviceShadingRateImageFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shading_rate_image_features_);
    } else if (name == "VkPhysicalDeviceInvocationMaskFeaturesHUAWEI") {
        auto support = CheckExtensionSupport(VK_HUAWEI_INVOCATION_MASK_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_invocation_mask_features_);
    } else if (name == "VkPhysicalDeviceMeshShaderFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_MESH_SHADER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_mesh_shader_features_nv_);
    } else if (name == "VkPhysicalDeviceMeshShaderFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_MESH_SHADER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_mesh_shader_features_);
    } else if (name == "VkPhysicalDeviceAccelerationStructureFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_acceleration_structure_features_);
    } else if (name == "VkPhysicalDeviceRayTracingPipelineFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_ray_tracing_pipeline_features_);
    } else if (name == "VkPhysicalDeviceRayQueryFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_RAY_QUERY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_ray_query_features_);
    } else if (name == "VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_RAY_TRACING_MAINTENANCE_1_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_ray_tracing_maintenance_1_features_);
    } else if (name == "VkPhysicalDeviceFragmentDensityMapFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_fragment_density_map_features_);
    } else if (name == "VkPhysicalDeviceFragmentDensityMap2FeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_fragment_density_map_2_features_);
    } else if (name == "VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_FRAGMENT_DENSITY_MAP_OFFSET_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_fragment_density_map_offset_features_);
    } else if (name == "VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_FRAGMENT_DENSITY_MAP_OFFSET_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_fragment_density_map_offset_features_);
    } else if (name == "VkPhysicalDeviceScalarBlockLayoutFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_scalar_block_layout_features_);
    } else if (name == "VkPhysicalDeviceScalarBlockLayoutFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_scalar_block_layout_features_);
    } else if (name == "VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_uniform_buffer_standard_layout_features_);
    } else if (name == "VkPhysicalDeviceUniformBufferStandardLayoutFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_uniform_buffer_standard_layout_features_);
    } else if (name == "VkPhysicalDeviceDepthClipEnableFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_depth_clip_enable_features_);
    } else if (name == "VkPhysicalDeviceMemoryPriorityFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_memory_priority_features_);
    } else if (name == "VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_pageable_device_local_memory_features_);
    } else if (name == "VkPhysicalDeviceBufferDeviceAddressFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_buffer_device_address_features_);
    } else if (name == "VkPhysicalDeviceBufferDeviceAddressFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_buffer_device_address_features_);
    } else if (name == "VkPhysicalDeviceBufferAddressFeaturesEXT" || name == "VkPhysicalDeviceBufferDeviceAddressFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_buffer_address_features_);
    } else if (name == "VkPhysicalDeviceImagelessFramebufferFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_imageless_framebuffer_features_);
    } else if (name == "VkPhysicalDeviceImagelessFramebufferFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_imageless_framebuffer_features_);
    } else if (name == "VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_texture_compression_astchdrfeatures_);
    } else if (name == "VkPhysicalDeviceTextureCompressionASTCHDRFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_texture_compression_astchdrfeatures_);
    } // Blocks nested too deeply, break
    if (name == "VkPhysicalDeviceCooperativeMatrixFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_cooperative_matrix_features_nv_);
    } else if (name == "VkPhysicalDeviceYcbcrImageArraysFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_ycbcr_image_arrays_features_);
    } else if (name == "VkPhysicalDevicePresentBarrierFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_PRESENT_BARRIER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_present_barrier_features_);
    } else if (name == "VkPhysicalDevicePerformanceQueryFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_performance_query_features_);
    } else if (name == "VkPhysicalDeviceCoverageReductionModeFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_COVERAGE_REDUCTION_MODE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_coverage_reduction_mode_features_);
    } else if (name == "VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL") {
        auto support = CheckExtensionSupport(VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_integer_functions_2_features_);
    } else if (name == "VkPhysicalDeviceShaderClockFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_CLOCK_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_clock_features_);
    } else if (name == "VkPhysicalDeviceIndexTypeUint8FeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_index_type_uint_8_features_);
    } else if (name == "VkPhysicalDeviceIndexTypeUint8FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_INDEX_TYPE_UINT8_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_index_type_uint_8_features_);
    } else if (name == "VkPhysicalDeviceIndexTypeUint8Features") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_index_type_uint_8_features_);
    } else if (name == "VkPhysicalDeviceShaderSMBuiltinsFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_SHADER_SM_BUILTINS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_smbuiltins_features_);
    } else if (name == "VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_fragment_shader_interlock_features_);
    } else if (name == "VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_separate_depth_stencil_layouts_features_);
    } else if (name == "VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_separate_depth_stencil_layouts_features_);
    } else if (name == "VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_primitive_topology_list_restart_features_);
    } else if (name == "VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_pipeline_executable_properties_features_);
    } else if (name == "VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_demote_to_helper_invocation_features_);
    } else if (name == "VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_demote_to_helper_invocation_features_);
    } else if (name == "VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_texel_buffer_alignment_features_);
    } else if (name == "VkPhysicalDeviceSubgroupSizeControlFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_subgroup_size_control_features_);
    } else if (name == "VkPhysicalDeviceSubgroupSizeControlFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_subgroup_size_control_features_);
    } else if (name == "VkPhysicalDeviceLineRasterizationFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_line_rasterization_features_);
    } else if (name == "VkPhysicalDeviceLineRasterizationFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_LINE_RASTERIZATION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_line_rasterization_features_);
    } else if (name == "VkPhysicalDeviceLineRasterizationFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_line_rasterization_features_);
    } else if (name == "VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_pipeline_creation_cache_control_features_);
    } else if (name == "VkPhysicalDevicePipelineCreationCacheControlFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_pipeline_creation_cache_control_features_);
    } else if (name == "VkPhysicalDeviceVulkan11Features") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_vulkan_11_features_);
    } else if (name == "VkPhysicalDeviceVulkan12Features") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_vulkan_12_features_);
    } else if (name == "VkPhysicalDeviceVulkan13Features") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_vulkan_13_features_);
    } else if (name == "VkPhysicalDeviceVulkan14Features") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_vulkan_14_features_);
    } else if (name == "VkPhysicalDeviceCoherentMemoryFeaturesAMD") {
        auto support = CheckExtensionSupport(VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_coherent_memory_features_);
    } else if (name == "VkPhysicalDeviceGpaFeaturesAMD") {
        auto support = CheckExtensionSupport(VK_AMD_GPA_INTERFACE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_gpa_features_);
    } else if (name == "VkPhysicalDeviceCustomBorderColorFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_custom_border_color_features_);
    } else if (name == "VkPhysicalDeviceBorderColorSwizzleFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_BORDER_COLOR_SWIZZLE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_border_color_swizzle_features_);
    } else if (name == "VkPhysicalDeviceExtendedDynamicStateFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_extended_dynamic_state_features_);
    } else if (name == "VkPhysicalDeviceExtendedDynamicState2FeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_extended_dynamic_state_2_features_);
    } else if (name == "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_extended_dynamic_state_3_features_);
    } else if (name == "VkPhysicalDeviceExtendedFlagsFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_EXTENDED_FLAGS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_extended_flags_features_);
    } else if (name == "VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_PARTITIONED_ACCELERATION_STRUCTURE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_partitioned_acceleration_structure_features_);
    } else if (name == "VkPhysicalDeviceDiagnosticsConfigFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_DEVICE_DIAGNOSTICS_CONFIG_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_diagnostics_config_features_);
    } else if (name == "VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_zero_initialize_workgroup_memory_features_);
    } else if (name == "VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_zero_initialize_workgroup_memory_features_);
    } else if (name == "VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_subgroup_uniform_control_flow_features_);
    } else if (name == "VkPhysicalDeviceRobustness2FeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_robustness_2_features_);
    } else if (name == "VkPhysicalDeviceRobustness2FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_ROBUSTNESS_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_robustness_2_features_);
    } else if (name == "VkPhysicalDeviceImageRobustnessFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_image_robustness_features_);
    } else if (name == "VkPhysicalDeviceImageRobustnessFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_image_robustness_features_);
    } else if (name == "VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_workgroup_memory_explicit_layout_features_);
    } else if (name == "VkPhysicalDevicePortabilitySubsetFeaturesKHR") {
#ifdef VK_ENABLE_BETA_EXTENSIONS
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_portability_subset_features_);
#else
        return false;
#endif // VK_ENABLE_BETA_EXTENSIONS
    } else if (name == "VkPhysicalDevice4444FormatsFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_4444_FORMATS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_4444_formats_features_);
    } else if (name == "VkPhysicalDeviceSubpassShadingFeaturesHUAWEI") {
        auto support = CheckExtensionSupport(VK_HUAWEI_SUBPASS_SHADING_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_subpass_shading_features_);
    } else if (name == "VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI") {
        auto support = CheckExtensionSupport(VK_HUAWEI_CLUSTER_CULLING_SHADER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_cluster_culling_shader_features_);
    } else if (name == "VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SHADER_IMAGE_ATOMIC_INT64_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_image_atomic_int_64_features_);
    } else if (name == "VkPhysicalDeviceFragmentShadingRateFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_fragment_shading_rate_features_);
    } else if (name == "VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_TERMINATE_INVOCATION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_terminate_invocation_features_);
    } else if (name == "VkPhysicalDeviceShaderTerminateInvocationFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_terminate_invocation_features_);
    } else if (name == "VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_FRAGMENT_SHADING_RATE_ENUMS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_fragment_shading_rate_enums_features_);
    } else if (name == "VkPhysicalDeviceImage2DViewOf3DFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_IMAGE_2D_VIEW_OF_3D_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_image_2_dview_of_3_dfeatures_);
    } else if (name == "VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_IMAGE_SLICED_VIEW_OF_3D_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_image_sliced_view_of_3_dfeatures_);
    } else if (name == "VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_attachment_feedback_loop_dynamic_state_features_);
    } else if (name == "VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_LEGACY_VERTEX_ATTRIBUTES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_legacy_vertex_attributes_features_);
    } else if (name == "VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE") {
        auto support = CheckExtensionSupport(VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_mutable_descriptor_type_features_);
    } else if (name == "VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_mutable_descriptor_type_features_);
    } else if (name == "VkPhysicalDeviceDepthClipControlFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_depth_clip_control_features_);
    } else if (name == "VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_ZERO_INITIALIZE_DEVICE_MEMORY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_zero_initialize_device_memory_features_);
    } else if (name == "VkPhysicalDeviceCustomResolveFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_CUSTOM_RESOLVE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_custom_resolve_features_);
    } else if (name == "VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_device_generated_commands_features_);
    } else if (name == "VkPhysicalDeviceDepthClampControlFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_DEPTH_CLAMP_CONTROL_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_depth_clamp_control_features_);
    } else if (name == "VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_vertex_input_dynamic_state_features_);
    } else if (name == "VkPhysicalDeviceExternalMemoryRDMAFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_EXTERNAL_MEMORY_RDMA_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_external_memory_rdmafeatures_);
    } else if (name == "VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_relaxed_extended_instruction_features_);
    } else if (name == "VkPhysicalDeviceColorWriteEnableFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_color_write_enable_features_);
    } else if (name == "VkPhysicalDeviceSynchronization2FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_synchronization_2_features_);
    } else if (name == "VkPhysicalDeviceSynchronization2Features") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_synchronization_2_features_);
    } else if (name == "VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_UNIFIED_IMAGE_LAYOUTS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_unified_image_layouts_features_);
    } else if (name == "VkPhysicalDeviceHostImageCopyFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_host_image_copy_features_);
    } else if (name == "VkPhysicalDeviceHostImageCopyFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_host_image_copy_features_);
    } else if (name == "VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_PRIMITIVES_GENERATED_QUERY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_primitives_generated_query_features_);
    } else if (name == "VkPhysicalDeviceLegacyDitheringFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_LEGACY_DITHERING_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_legacy_dithering_features_);
    } else if (name == "VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_multisampled_render_to_single_sampled_features_);
    } else if (name == "VkPhysicalDeviceMultisampledRenderToSwapchainFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_MULTISAMPLED_RENDER_TO_SWAPCHAIN_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_multisampled_render_to_swapchain_features_);
    } else if (name == "VkPhysicalDevicePipelineProtectedAccessFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_PIPELINE_PROTECTED_ACCESS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_pipeline_protected_access_features_);
    } else if (name == "VkPhysicalDevicePipelineProtectedAccessFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_pipeline_protected_access_features_);
    } else if (name == "VkPhysicalDeviceVideoMaintenance1FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_VIDEO_MAINTENANCE_1_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_video_maintenance_1_features_);
    } else if (name == "VkPhysicalDeviceVideoMaintenance2FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_VIDEO_MAINTENANCE_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_video_maintenance_2_features_);
    } else if (name == "VkPhysicalDeviceVideoDecodeVP9FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_VIDEO_DECODE_VP9_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_video_decode_vp_9_features_);
    } else if (name == "VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_VIDEO_ENCODE_QUANTIZATION_MAP_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_video_encode_quantization_map_features_);
    } else if (name == "VkPhysicalDeviceVideoEncodeFeedback2FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_VIDEO_ENCODE_FEEDBACK_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_video_encode_feedback_2_features_);
    } else if (name == "VkPhysicalDeviceVideoEncodeAV1FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_VIDEO_ENCODE_AV1_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_video_encode_av_1_features_);
    } else if (name == "VkPhysicalDeviceInheritedViewportScissorFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_INHERITED_VIEWPORT_SCISSOR_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_inherited_viewport_scissor_features_);
    } else if (name == "VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_YCBCR_2PLANE_444_FORMATS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_ycbcr_2_plane_444_formats_features_);
    } // Blocks nested too deeply, break
    if (name == "VkPhysicalDeviceProvokingVertexFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_provoking_vertex_features_);
    } else if (name == "VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_VIDEO_ENCODE_INTRA_REFRESH_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_video_encode_intra_refresh_features_);
    } else if (name == "VkPhysicalDeviceDescriptorBufferFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_descriptor_buffer_features_);
    } else if (name == "VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_INTEGER_DOT_PRODUCT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_integer_dot_product_features_);
    } else if (name == "VkPhysicalDeviceShaderIntegerDotProductFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_integer_dot_product_features_);
    } else if (name == "VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_fragment_shader_barycentric_features_);
    } else if (name == "VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_fragment_shader_barycentric_features_);
    } else if (name == "VkPhysicalDeviceShaderFmaFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_FMA_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_fma_features_);
    } else if (name == "VkPhysicalDeviceRayTracingMotionBlurFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_RAY_TRACING_MOTION_BLUR_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_ray_tracing_motion_blur_features_);
    } else if (name == "VkPhysicalDeviceRayTracingValidationFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_RAY_TRACING_VALIDATION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_ray_tracing_validation_features_);
    } else if (name == "VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_RAY_TRACING_LINEAR_SWEPT_SPHERES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_ray_tracing_linear_swept_spheres_features_);
    } else if (name == "VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_RGBA10X6_FORMATS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_rgba_10_x_6_formats_features_);
    } else if (name == "VkPhysicalDeviceDynamicRenderingFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_dynamic_rendering_features_);
    } else if (name == "VkPhysicalDeviceDynamicRenderingFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_dynamic_rendering_features_);
    } else if (name == "VkPhysicalDeviceImageViewMinLodFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_IMAGE_VIEW_MIN_LOD_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_image_view_min_lod_features_);
    } else if (name == "VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM") {
        auto support = CheckExtensionSupport(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_rasterization_order_attachment_access_features_);
    } else if (name == "VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_rasterization_order_attachment_access_features_);
    } else if (name == "VkPhysicalDeviceLinearColorAttachmentFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_LINEAR_COLOR_ATTACHMENT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_linear_color_attachment_features_);
    } else if (name == "VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_GRAPHICS_PIPELINE_LIBRARY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_graphics_pipeline_library_features_);
    } else if (name == "VkPhysicalDevicePipelineBinaryFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_PIPELINE_BINARY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_pipeline_binary_features_);
    } else if (name == "VkPhysicalDeviceDataGraphNeuralAcceleratorStatisticsFeaturesARM") {
        auto support = CheckExtensionSupport(VK_ARM_DATA_GRAPH_NEURAL_ACCELERATOR_STATISTICS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_data_graph_neural_accelerator_statistics_features_);
    } else if (name == "VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE") {
        auto support = CheckExtensionSupport(VK_VALVE_DESCRIPTOR_SET_HOST_MAPPING_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_descriptor_set_host_mapping_features_);
    } else if (name == "VkPhysicalDeviceNestedCommandBufferFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_NESTED_COMMAND_BUFFER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_nested_command_buffer_features_);
    } else if (name == "VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SHADER_MODULE_IDENTIFIER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_module_identifier_features_);
    } else if (name == "VkPhysicalDeviceImageCompressionControlFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_IMAGE_COMPRESSION_CONTROL_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_image_compression_control_features_);
    } else if (name == "VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_image_compression_control_swapchain_features_);
    } else if (name == "VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SUBPASS_MERGE_FEEDBACK_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_subpass_merge_feedback_features_);
    } else if (name == "VkPhysicalDeviceOpacityMicromapFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_OPACITY_MICROMAP_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_opacity_micromap_features_);
    } else if (name == "VkPhysicalDeviceOpacityMicromapFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_OPACITY_MICROMAP_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_opacity_micromap_features_ext_);
    } else if (name == "VkPhysicalDeviceDisplacementMicromapFeaturesNV") {
#ifdef VK_ENABLE_BETA_EXTENSIONS
        auto support = CheckExtensionSupport(VK_NV_DISPLACEMENT_MICROMAP_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_displacement_micromap_features_);
#else
        return false;
#endif // VK_ENABLE_BETA_EXTENSIONS
    } else if (name == "VkPhysicalDevicePipelinePropertiesFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_PIPELINE_PROPERTIES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_pipeline_properties_features_);
    } else if (name == "VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD") {
        auto support = CheckExtensionSupport(VK_AMD_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_early_and_late_fragment_tests_features_);
    } else if (name == "VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_NON_SEAMLESS_CUBE_MAP_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_non_seamless_cube_map_features_);
    } else if (name == "VkPhysicalDevicePipelineRobustnessFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_pipeline_robustness_features_);
    } else if (name == "VkPhysicalDevicePipelineRobustnessFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_pipeline_robustness_features_);
    } else if (name == "VkPhysicalDeviceShaderMultipleWaitQueuesFeaturesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_SHADER_MULTIPLE_WAIT_QUEUES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_multiple_wait_queues_features_);
    } else if (name == "VkPhysicalDeviceImageProcessingFeaturesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_IMAGE_PROCESSING_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_image_processing_features_);
    } else if (name == "VkPhysicalDeviceTilePropertiesFeaturesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_TILE_PROPERTIES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_tile_properties_features_);
    } else if (name == "VkPhysicalDeviceAmigoProfilingFeaturesSEC") {
        auto support = CheckExtensionSupport(VK_SEC_AMIGO_PROFILING_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_amigo_profiling_features_);
    } else if (name == "VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_attachment_feedback_loop_layout_features_);
    } else if (name == "VkPhysicalDeviceAddressBindingReportFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_DEVICE_ADDRESS_BINDING_REPORT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_address_binding_report_features_);
    } else if (name == "VkPhysicalDeviceOpticalFlowFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_OPTICAL_FLOW_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_optical_flow_features_);
    } else if (name == "VkPhysicalDeviceFaultFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_DEVICE_FAULT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_fault_features_ext_);
    } else if (name == "VkPhysicalDeviceFaultFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_DEVICE_FAULT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_fault_features_);
    } else if (name == "VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_PIPELINE_LIBRARY_GROUP_HANDLES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_pipeline_library_group_handles_features_);
    } else if (name == "VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM") {
        auto support = CheckExtensionSupport(VK_ARM_SHADER_CORE_BUILTINS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_core_builtins_features_);
    } else if (name == "VkPhysicalDeviceFrameBoundaryFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_FRAME_BOUNDARY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_frame_boundary_features_);
    } else if (name == "VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_dynamic_rendering_unused_attachments_features_);
    } else if (name == "VkPhysicalDeviceInternallySynchronizedQueuesFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_INTERNALLY_SYNCHRONIZED_QUEUES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_internally_synchronized_queues_features_);
    } else if (name == "VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_swapchain_maintenance_1_features_);
    } else if (name == "VkPhysicalDeviceSwapchainMaintenance1FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_swapchain_maintenance_1_features_);
    } else if (name == "VkPhysicalDeviceDepthBiasControlFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_DEPTH_BIAS_CONTROL_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_depth_bias_control_features_);
    } else if (name == "VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_ray_tracing_invocation_reorder_features_);
    } else if (name == "VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_ray_tracing_invocation_reorder_features_nv_);
    } else if (name == "VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_EXTENDED_SPARSE_ADDRESS_SPACE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_extended_sparse_address_space_features_);
    } else if (name == "VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_MULTIVIEW_PER_VIEW_VIEWPORTS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_multiview_per_view_viewports_features_);
    } else if (name == "VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_RAY_TRACING_POSITION_FETCH_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_ray_tracing_position_fetch_features_);
    } else if (name == "VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_MULTIVIEW_PER_VIEW_RENDER_AREAS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_multiview_per_view_render_areas_features_);
    } else if (name == "VkPhysicalDeviceShaderObjectFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SHADER_OBJECT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_object_features_);
    } else if (name == "VkPhysicalDeviceShaderTileImageFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SHADER_TILE_IMAGE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_tile_image_features_);
    } else if (name == "VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX") {
#ifdef VK_USE_PLATFORM_SCREEN_QNX
        auto support = CheckExtensionSupport(VK_QNX_EXTERNAL_MEMORY_SCREEN_BUFFER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_external_memory_screen_buffer_features_);
#else
        return false;
#endif // VK_USE_PLATFORM_SCREEN_QNX
    } else if (name == "VkPhysicalDeviceCooperativeMatrixFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_COOPERATIVE_MATRIX_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_cooperative_matrix_features_);
    } else if (name == "VkPhysicalDeviceCooperativeMatrixConversionFeaturesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_COOPERATIVE_MATRIX_CONVERSION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_cooperative_matrix_conversion_features_);
    } else if (name == "VkPhysicalDeviceShaderEnqueueFeaturesAMDX") {
#ifdef VK_ENABLE_BETA_EXTENSIONS
        auto support = CheckExtensionSupport(VK_AMDX_SHADER_ENQUEUE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_enqueue_features_);
#else
        return false;
#endif // VK_ENABLE_BETA_EXTENSIONS
    } else if (name == "VkPhysicalDeviceAntiLagFeaturesAMD") {
        auto support = CheckExtensionSupport(VK_AMD_ANTI_LAG_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_anti_lag_features_);
    } else if (name == "VkPhysicalDeviceTileMemoryHeapFeaturesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_TILE_MEMORY_HEAP_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_tile_memory_heap_features_);
    } else if (name == "VkPhysicalDeviceCubicClampFeaturesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_FILTER_CUBIC_CLAMP_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_cubic_clamp_features_);
    } else if (name == "VkPhysicalDeviceYcbcrDegammaFeaturesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_YCBCR_DEGAMMA_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_ycbcr_degamma_features_);
    } else if (name == "VkPhysicalDeviceCubicWeightsFeaturesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_FILTER_CUBIC_WEIGHTS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_cubic_weights_features_);
    } else if (name == "VkPhysicalDeviceImageProcessing2FeaturesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_IMAGE_PROCESSING_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_image_processing_2_features_);
    } else if (name == "VkPhysicalDeviceImageProcessing3FeaturesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_IMAGE_PROCESSING_3_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_image_processing_3_features_);
    } else if (name == "VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_DESCRIPTOR_POOL_OVERALLOCATION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_descriptor_pool_overallocation_features_);
    } else if (name == "VkPhysicalDevicePerStageDescriptorSetFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_PER_STAGE_DESCRIPTOR_SET_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_per_stage_descriptor_set_features_);
    } else if (name == "VkPhysicalDeviceExternalFormatResolveFeaturesANDROID") {
#ifdef VK_USE_PLATFORM_ANDROID_KHR
        auto support = CheckExtensionSupport(VK_ANDROID_EXTERNAL_FORMAT_RESOLVE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_external_format_resolve_features_);
#else
        return false;
#endif // VK_USE_PLATFORM_ANDROID_KHR
    } else if (name == "VkPhysicalDeviceCudaKernelLaunchFeaturesNV") {
#ifdef VK_ENABLE_BETA_EXTENSIONS
        auto support = CheckExtensionSupport(VK_NV_CUDA_KERNEL_LAUNCH_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_cuda_kernel_launch_features_);
#else
        return false;
#endif // VK_ENABLE_BETA_EXTENSIONS
    } else if (name == "VkPhysicalDeviceSchedulingControlsFeaturesARM") {
        auto support = CheckExtensionSupport(VK_ARM_SCHEDULING_CONTROLS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_scheduling_controls_features_);
    } else if (name == "VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG") {
        auto support = CheckExtensionSupport(VK_IMG_RELAXED_LINE_RASTERIZATION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_relaxed_line_rasterization_features_);
    } else if (name == "VkPhysicalDeviceRenderPassStripedFeaturesARM") {
        auto support = CheckExtensionSupport(VK_ARM_RENDER_PASS_STRIPED_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_render_pass_striped_features_);
    } else if (name == "VkPhysicalDevicePipelineOpacityMicromapFeaturesARM") {
        auto support = CheckExtensionSupport(VK_ARM_PIPELINE_OPACITY_MICROMAP_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_pipeline_opacity_micromap_features_);
    } else if (name == "VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_MAXIMAL_RECONVERGENCE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_maximal_reconvergence_features_);
    } else if (name == "VkPhysicalDeviceShaderSubgroupRotateFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_SUBGROUP_ROTATE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_subgroup_rotate_features_);
    } else if (name == "VkPhysicalDeviceShaderSubgroupRotateFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_subgroup_rotate_features_);
    } // Blocks nested too deeply, break
    if (name == "VkPhysicalDeviceShaderExpectAssumeFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_EXPECT_ASSUME_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_expect_assume_features_);
    } else if (name == "VkPhysicalDeviceShaderExpectAssumeFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_expect_assume_features_);
    } else if (name == "VkPhysicalDeviceShaderFloatControls2FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_FLOAT_CONTROLS_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_float_controls_2_features_);
    } else if (name == "VkPhysicalDeviceShaderFloatControls2Features") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_float_controls_2_features_);
    } else if (name == "VkPhysicalDeviceDynamicRenderingLocalReadFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_dynamic_rendering_local_read_features_);
    } else if (name == "VkPhysicalDeviceDynamicRenderingLocalReadFeatures") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_dynamic_rendering_local_read_features_);
    } else if (name == "VkPhysicalDeviceShaderQuadControlFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_QUAD_CONTROL_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_quad_control_features_);
    } else if (name == "VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_SHADER_ATOMIC_FLOAT16_VECTOR_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_atomic_float_16_vector_features_);
    } else if (name == "VkPhysicalDeviceMapMemoryPlacedFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_MAP_MEMORY_PLACED_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_map_memory_placed_features_);
    } else if (name == "VkPhysicalDeviceShaderBfloat16FeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_BFLOAT16_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_bfloat_16_features_);
    } else if (name == "VkPhysicalDeviceRawAccessChainsFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_RAW_ACCESS_CHAINS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_raw_access_chains_features_);
    } else if (name == "VkPhysicalDeviceCommandBufferInheritanceFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_COMMAND_BUFFER_INHERITANCE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_command_buffer_inheritance_features_);
    } else if (name == "VkPhysicalDeviceImageAlignmentControlFeaturesMESA") {
        auto support = CheckExtensionSupport(VK_MESA_IMAGE_ALIGNMENT_CONTROL_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_image_alignment_control_features_);
    } else if (name == "VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SHADER_REPLICATED_COMPOSITES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_replicated_composites_features_);
    } else if (name == "VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_PRESENT_MODE_FIFO_LATEST_READY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_present_mode_fifo_latest_ready_features_);
    } else if (name == "VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_PRESENT_MODE_FIFO_LATEST_READY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_present_mode_fifo_latest_ready_features_);
    } else if (name == "VkPhysicalDeviceCooperativeMatrix2FeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_COOPERATIVE_MATRIX_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_cooperative_matrix_2_features_);
    } else if (name == "VkPhysicalDeviceCooperativeMatrixDecodeVectorFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_COOPERATIVE_MATRIX_DECODE_VECTOR_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_cooperative_matrix_decode_vector_features_);
    } else if (name == "VkPhysicalDeviceHdrVividFeaturesHUAWEI") {
        auto support = CheckExtensionSupport(VK_HUAWEI_HDR_VIVID_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_hdr_vivid_features_);
    } else if (name == "VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_VERTEX_ATTRIBUTE_ROBUSTNESS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_vertex_attribute_robustness_features_);
    } else if (name == "VkPhysicalDeviceDenseGeometryFormatFeaturesAMDX") {
#ifdef VK_ENABLE_BETA_EXTENSIONS
        auto support = CheckExtensionSupport(VK_AMDX_DENSE_GEOMETRY_FORMAT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_dense_geometry_format_features_);
#else
        return false;
#endif // VK_ENABLE_BETA_EXTENSIONS
    } else if (name == "VkPhysicalDeviceDepthClampZeroOneFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_DEPTH_CLAMP_ZERO_ONE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_depth_clamp_zero_one_features_);
    } else if (name == "VkPhysicalDeviceDepthClampZeroOneFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_DEPTH_CLAMP_ZERO_ONE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_depth_clamp_zero_one_features_);
    } else if (name == "VkPhysicalDeviceCooperativeVectorFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_COOPERATIVE_VECTOR_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_cooperative_vector_features_);
    } else if (name == "VkPhysicalDeviceTileShadingFeaturesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_TILE_SHADING_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_tile_shading_features_);
    } else if (name == "VkPhysicalDeviceFragmentDensityMapLayeredFeaturesVALVE") {
        auto support = CheckExtensionSupport(VK_VALVE_FRAGMENT_DENSITY_MAP_LAYERED_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_fragment_density_map_layered_features_);
    } else if (name == "VkPhysicalDevicePresentMeteringFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_PRESENT_METERING_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_present_metering_features_);
    } else if (name == "VkPhysicalDeviceShaderUniformBufferUnsizedArrayFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SHADER_UNIFORM_BUFFER_UNSIZED_ARRAY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_uniform_buffer_unsized_array_features_);
    } else if (name == "VkPhysicalDeviceShaderMixedFloatDotProductFeaturesVALVE") {
        auto support = CheckExtensionSupport(VK_VALVE_SHADER_MIXED_FLOAT_DOT_PRODUCT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_mixed_float_dot_product_features_);
    } else if (name == "VkPhysicalDevicePrimitiveRestartIndexFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_PRIMITIVE_RESTART_INDEX_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_primitive_restart_index_features_);
    } else if (name == "VkPhysicalDeviceFormatPackFeaturesARM") {
        auto support = CheckExtensionSupport(VK_ARM_FORMAT_PACK_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_format_pack_features_);
    } else if (name == "VkPhysicalDeviceThrottleHintFeaturesSEC") {
        auto support = CheckExtensionSupport(VK_SEC_THROTTLE_HINT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_throttle_hint_features_);
    } else if (name == "VkPhysicalDeviceTensorFeaturesARM") {
        auto support = CheckExtensionSupport(VK_ARM_TENSORS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_tensor_features_);
    } else if (name == "VkPhysicalDeviceDescriptorBufferTensorFeaturesARM") {
        auto support = CheckExtensionSupport(VK_ARM_TENSORS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_descriptor_buffer_tensor_features_);
    } else if (name == "VkPhysicalDeviceShaderFloat8FeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SHADER_FLOAT8_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_float_8_features_);
    } else if (name == "VkPhysicalDeviceDataGraphFeaturesARM") {
        auto support = CheckExtensionSupport(VK_ARM_DATA_GRAPH_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_data_graph_features_);
    } else if (name == "VkPhysicalDevicePipelineCacheIncrementalModeFeaturesSEC") {
        auto support = CheckExtensionSupport(VK_SEC_PIPELINE_CACHE_INCREMENTAL_MODE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_pipeline_cache_incremental_mode_features_);
    } else if (name == "VkPhysicalDeviceDataGraphModelFeaturesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_DATA_GRAPH_MODEL_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_data_graph_model_features_);
    } else if (name == "VkPhysicalDeviceShaderUntypedPointersFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_UNTYPED_POINTERS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_untyped_pointers_features_);
    } else if (name == "VkPhysicalDeviceVideoEncodeRgbConversionFeaturesVALVE") {
        auto support = CheckExtensionSupport(VK_VALVE_VIDEO_ENCODE_RGB_CONVERSION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_video_encode_rgb_conversion_features_);
    } else if (name == "VkPhysicalDeviceShader64BitIndexingFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SHADER_64BIT_INDEXING_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_64_bit_indexing_features_);
    } else if (name == "VkPhysicalDeviceQueuePerfHintFeaturesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_QUEUE_PERF_HINT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_queue_perf_hint_features_);
    } else if (name == "VkPhysicalDevicePerformanceCountersByRegionFeaturesARM") {
        auto support = CheckExtensionSupport(VK_ARM_PERFORMANCE_COUNTERS_BY_REGION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_performance_counters_by_region_features_);
    } else if (name == "VkPhysicalDeviceComputeOccupancyPriorityFeaturesNV") {
        auto support = CheckExtensionSupport(VK_NV_COMPUTE_OCCUPANCY_PRIORITY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_compute_occupancy_priority_features_);
    } else if (name == "VkPhysicalDeviceShaderLongVectorFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SHADER_LONG_VECTOR_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_long_vector_features_);
    } else if (name == "VkPhysicalDeviceTextureCompressionASTC3DFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_TEXTURE_COMPRESSION_ASTC_3D_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_texture_compression_astc_3_dfeatures_);
    } else if (name == "VkPhysicalDeviceShaderSubgroupPartitionedFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SHADER_SUBGROUP_PARTITIONED_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_subgroup_partitioned_features_);
    } else if (name == "VkPhysicalDeviceShaderSplitBarrierFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SHADER_SPLIT_BARRIER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_split_barrier_features_);
    } else if (name == "VkPhysicalDeviceDescriptorHeapFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_DESCRIPTOR_HEAP_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_descriptor_heap_features_);
    } else if (name == "VkPhysicalDeviceShaderInstrumentationFeaturesARM") {
        auto support = CheckExtensionSupport(VK_ARM_SHADER_INSTRUMENTATION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_instrumentation_features_);
    } else if (name == "VkPhysicalDeviceDeviceAddressCommandsFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_DEVICE_ADDRESS_COMMANDS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_device_address_commands_features_);
    } else if (name == "VkPhysicalDeviceShaderConstantDataFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_CONSTANT_DATA_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_constant_data_features_);
    } else if (name == "VkPhysicalDeviceShaderAbortFeaturesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_ABORT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_abort_features_);
    } else if (name == "VkPhysicalDeviceDataGraphOpticalFlowFeaturesARM") {
        auto support = CheckExtensionSupport(VK_ARM_DATA_GRAPH_OPTICAL_FLOW_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_data_graph_optical_flow_features_);
    } else if (name == "VkPhysicalDeviceShaderOCPMicroscalingTypesFeaturesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SHADER_OCP_MICROSCALING_TYPES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, feature, &pdd_->physical_device_shader_ocpmicroscaling_types_features_);
    }

    return true;
}

bool JsonLoader::GetProperty(const char *device_name, bool requested_profile, const Json::Value &props, const std::string &name) {
    const Json::Value &property = props[name];

    if (name == "VkPhysicalDeviceProperties") {
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_properties_);
    } else if (name == "VkPhysicalDeviceSparseProperties") {
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_properties_.sparseProperties);
    } else if (name == "VkPhysicalDeviceLimits") {
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_properties_.limits);
    } else if (name == "VkPhysicalDevicePushConstantBankPropertiesNV") {
        auto support = CheckExtensionSupport(VK_NV_PUSH_CONSTANT_BANK_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_push_constant_bank_properties_);
    } else if (name == "VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV") {
        auto support = CheckExtensionSupport(VK_NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_device_generated_commands_properties_nv_);
    } else if (name == "VkPhysicalDeviceClusterAccelerationStructurePropertiesNV") {
        auto support = CheckExtensionSupport(VK_NV_CLUSTER_ACCELERATION_STRUCTURE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_cluster_acceleration_structure_properties_);
    } else if (name == "VkPhysicalDeviceMultiDrawPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_MULTI_DRAW_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_multi_draw_properties_);
    } else if (name == "VkPhysicalDevicePushDescriptorPropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_push_descriptor_properties_);
    } else if (name == "VkPhysicalDevicePushDescriptorProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_push_descriptor_properties_);
    } else if (name == "VkPhysicalDeviceDriverPropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_driver_properties_);
    } else if (name == "VkPhysicalDeviceDriverProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_driver_properties_);
    } else if (name == "VkPhysicalDeviceIDPropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_idproperties_);
    } else if (name == "VkPhysicalDeviceIDProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_1, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_idproperties_);
    } else if (name == "VkPhysicalDeviceMultiviewPropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_MULTIVIEW_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_multiview_properties_);
    } else if (name == "VkPhysicalDeviceMultiviewProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_1, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_multiview_properties_);
    } else if (name == "VkPhysicalDeviceDiscardRectanglePropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_DISCARD_RECTANGLES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_discard_rectangle_properties_);
    } else if (name == "VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX") {
        auto support = CheckExtensionSupport(VK_NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_multiview_per_view_attributes_properties_);
    } else if (name == "VkPhysicalDeviceSubgroupProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_1, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_subgroup_properties_);
    } else if (name == "VkPhysicalDevicePointClippingPropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_MAINTENANCE_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_point_clipping_properties_);
    } else if (name == "VkPhysicalDevicePointClippingProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_1, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_point_clipping_properties_);
    } else if (name == "VkPhysicalDeviceProtectedMemoryProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_1, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_protected_memory_properties_);
    } else if (name == "VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_sampler_filter_minmax_properties_);
    } else if (name == "VkPhysicalDeviceSamplerFilterMinmaxProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_sampler_filter_minmax_properties_);
    } else if (name == "VkPhysicalDeviceSampleLocationsPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SAMPLE_LOCATIONS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_sample_locations_properties_);
    } else if (name == "VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_blend_operation_advanced_properties_);
    } else if (name == "VkPhysicalDeviceInlineUniformBlockPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_inline_uniform_block_properties_);
    } else if (name == "VkPhysicalDeviceInlineUniformBlockProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_inline_uniform_block_properties_);
    } else if (name == "VkPhysicalDeviceMaintenance3PropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_MAINTENANCE_3_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_maintenance_3_properties_);
    } else if (name == "VkPhysicalDeviceMaintenance3Properties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_1, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_maintenance_3_properties_);
    } else if (name == "VkPhysicalDeviceMaintenance4PropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_MAINTENANCE_4_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_maintenance_4_properties_);
    } else if (name == "VkPhysicalDeviceMaintenance4Properties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_maintenance_4_properties_);
    } else if (name == "VkPhysicalDeviceMaintenance5PropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_MAINTENANCE_5_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_maintenance_5_properties_);
    } else if (name == "VkPhysicalDeviceMaintenance5Properties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_maintenance_5_properties_);
    } else if (name == "VkPhysicalDeviceMaintenance6PropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_MAINTENANCE_6_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_maintenance_6_properties_);
    } else if (name == "VkPhysicalDeviceMaintenance6Properties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_maintenance_6_properties_);
    } else if (name == "VkPhysicalDeviceMaintenance7PropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_MAINTENANCE_7_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_maintenance_7_properties_);
    } else if (name == "VkPhysicalDeviceMaintenance9PropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_MAINTENANCE_9_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_maintenance_9_properties_);
    } else if (name == "VkPhysicalDeviceMaintenance10PropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_MAINTENANCE_10_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_maintenance_10_properties_);
    } else if (name == "VkPhysicalDeviceFloatControlsPropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_float_controls_properties_);
    } else if (name == "VkPhysicalDeviceFloatControlsProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_float_controls_properties_);
    } else if (name == "VkPhysicalDeviceExternalMemoryHostPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_external_memory_host_properties_);
    } else if (name == "VkPhysicalDeviceConservativeRasterizationPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_conservative_rasterization_properties_);
    } else if (name == "VkPhysicalDeviceShaderCorePropertiesAMD") {
        auto support = CheckExtensionSupport(VK_AMD_SHADER_CORE_PROPERTIES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_shader_core_properties_);
    } else if (name == "VkPhysicalDeviceShaderCoreProperties2AMD") {
        auto support = CheckExtensionSupport(VK_AMD_SHADER_CORE_PROPERTIES_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_shader_core_properties_2_);
    } else if (name == "VkPhysicalDeviceDescriptorIndexingPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_descriptor_indexing_properties_);
    } else if (name == "VkPhysicalDeviceDescriptorIndexingProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_descriptor_indexing_properties_);
    } else if (name == "VkPhysicalDeviceTimelineSemaphorePropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_timeline_semaphore_properties_);
    } else if (name == "VkPhysicalDeviceTimelineSemaphoreProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_timeline_semaphore_properties_);
    } else if (name == "VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_vertex_attribute_divisor_properties_ext_);
    } else if (name == "VkPhysicalDeviceVertexAttributeDivisorPropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_vertex_attribute_divisor_properties_);
    } else if (name == "VkPhysicalDeviceVertexAttributeDivisorProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_vertex_attribute_divisor_properties_);
    } else if (name == "VkPhysicalDevicePCIBusInfoPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_pcibus_info_properties_);
    } else if (name == "VkPhysicalDeviceDepthStencilResolvePropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_depth_stencil_resolve_properties_);
    } else if (name == "VkPhysicalDeviceDepthStencilResolveProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_depth_stencil_resolve_properties_);
    } else if (name == "VkPhysicalDeviceTransformFeedbackPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_transform_feedback_properties_);
    } else if (name == "VkPhysicalDeviceComputeShaderDerivativesPropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_compute_shader_derivatives_properties_);
    } else if (name == "VkPhysicalDeviceCopyMemoryIndirectPropertiesNV") {
        auto support = CheckExtensionSupport(VK_NV_COPY_MEMORY_INDIRECT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_copy_memory_indirect_properties_);
    } else if (name == "VkPhysicalDeviceCopyMemoryIndirectPropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_COPY_MEMORY_INDIRECT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_copy_memory_indirect_properties_);
    } else if (name == "VkPhysicalDeviceMemoryDecompressionPropertiesNV") {
        auto support = CheckExtensionSupport(VK_NV_MEMORY_DECOMPRESSION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_memory_decompression_properties_);
    } else if (name == "VkPhysicalDeviceMemoryDecompressionPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_MEMORY_DECOMPRESSION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_memory_decompression_properties_);
    } else if (name == "VkPhysicalDeviceShadingRateImagePropertiesNV") {
        auto support = CheckExtensionSupport(VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_shading_rate_image_properties_);
    } else if (name == "VkPhysicalDeviceMeshShaderPropertiesNV") {
        auto support = CheckExtensionSupport(VK_NV_MESH_SHADER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_mesh_shader_properties_nv_);
    } else if (name == "VkPhysicalDeviceMeshShaderPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_MESH_SHADER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_mesh_shader_properties_);
    } else if (name == "VkPhysicalDeviceAccelerationStructurePropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_acceleration_structure_properties_);
    } else if (name == "VkPhysicalDeviceRayTracingPipelinePropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_ray_tracing_pipeline_properties_);
    } else if (name == "VkPhysicalDeviceRayTracingPropertiesNV") {
        auto support = CheckExtensionSupport(VK_NV_RAY_TRACING_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_ray_tracing_properties_);
    } else if (name == "VkPhysicalDeviceFragmentDensityMapPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_fragment_density_map_properties_);
    } else if (name == "VkPhysicalDeviceFragmentDensityMap2PropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_fragment_density_map_2_properties_);
    } else if (name == "VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_FRAGMENT_DENSITY_MAP_OFFSET_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_fragment_density_map_offset_properties_);
    } else if (name == "VkPhysicalDeviceFragmentDensityMapOffsetPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_FRAGMENT_DENSITY_MAP_OFFSET_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_fragment_density_map_offset_properties_);
    } else if (name == "VkPhysicalDeviceCooperativeMatrixPropertiesNV") {
        auto support = CheckExtensionSupport(VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_cooperative_matrix_properties_nv_);
    } else if (name == "VkPhysicalDevicePerformanceQueryPropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_performance_query_properties_);
    } else if (name == "VkPhysicalDeviceShaderSMBuiltinsPropertiesNV") {
        auto support = CheckExtensionSupport(VK_NV_SHADER_SM_BUILTINS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_shader_smbuiltins_properties_);
    } else if (name == "VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_texel_buffer_alignment_properties_);
    } else if (name == "VkPhysicalDeviceTexelBufferAlignmentProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_texel_buffer_alignment_properties_);
    } else if (name == "VkPhysicalDeviceSubgroupSizeControlPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_subgroup_size_control_properties_);
    } else if (name == "VkPhysicalDeviceSubgroupSizeControlProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_subgroup_size_control_properties_);
    } else if (name == "VkPhysicalDeviceSubpassShadingPropertiesHUAWEI") {
        auto support = CheckExtensionSupport(VK_HUAWEI_SUBPASS_SHADING_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_subpass_shading_properties_);
    } else if (name == "VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI") {
        auto support = CheckExtensionSupport(VK_HUAWEI_CLUSTER_CULLING_SHADER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_cluster_culling_shader_properties_);
    } else if (name == "VkPhysicalDeviceLineRasterizationPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_line_rasterization_properties_);
    } else if (name == "VkPhysicalDeviceLineRasterizationPropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_LINE_RASTERIZATION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_line_rasterization_properties_);
    } else if (name == "VkPhysicalDeviceLineRasterizationProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_line_rasterization_properties_);
    } else if (name == "VkPhysicalDeviceVulkan11Properties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_vulkan_11_properties_);
    } else if (name == "VkPhysicalDeviceVulkan12Properties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_2, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_vulkan_12_properties_);
    } else if (name == "VkPhysicalDeviceVulkan13Properties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_vulkan_13_properties_);
    } else if (name == "VkPhysicalDeviceVulkan14Properties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        pdd_->pCopySrcLayouts_.resize(64);
        pdd_->pCopyDstLayouts_.resize(64);
        pdd_->physical_device_vulkan_14_properties_.pCopySrcLayouts = pdd_->pCopySrcLayouts_.data();
        pdd_->physical_device_vulkan_14_properties_.pCopyDstLayouts = pdd_->pCopyDstLayouts_.data();
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_vulkan_14_properties_);
    } else if (name == "VkPhysicalDeviceGpaProperties2AMD") {
        auto support = CheckExtensionSupport(VK_AMD_GPA_INTERFACE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_gpa_properties_2_);
    } else if (name == "VkPhysicalDeviceToolPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_TOOLING_INFO_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_tool_properties_);
    } else if (name == "VkPhysicalDeviceToolProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_tool_properties_);
    } else if (name == "VkPhysicalDeviceCustomBorderColorPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_custom_border_color_properties_);
    } else if (name == "VkPhysicalDeviceExtendedDynamicState3PropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_extended_dynamic_state_3_properties_);
    } else if (name == "VkPhysicalDevicePartitionedAccelerationStructurePropertiesNV") {
        auto support = CheckExtensionSupport(VK_NV_PARTITIONED_ACCELERATION_STRUCTURE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_partitioned_acceleration_structure_properties_);
    } else if (name == "VkPhysicalDeviceRobustness2PropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_robustness_2_properties_);
    } else if (name == "VkPhysicalDeviceRobustness2PropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_ROBUSTNESS_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_robustness_2_properties_);
    } else if (name == "VkPhysicalDevicePortabilitySubsetPropertiesKHR") {
#ifdef VK_ENABLE_BETA_EXTENSIONS
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_portability_subset_properties_);
#else
        return false;
#endif // VK_ENABLE_BETA_EXTENSIONS
    } else if (name == "VkPhysicalDeviceFragmentShadingRatePropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_fragment_shading_rate_properties_);
    } else if (name == "VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV") {
        auto support = CheckExtensionSupport(VK_NV_FRAGMENT_SHADING_RATE_ENUMS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_fragment_shading_rate_enums_properties_);
    } else if (name == "VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_LEGACY_VERTEX_ATTRIBUTES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_legacy_vertex_attributes_properties_);
    } else if (name == "VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_device_generated_commands_properties_);
    } // Blocks nested too deeply, break
    if (name == "VkPhysicalDeviceHostImageCopyPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        pdd_->pCopySrcLayouts_.resize(64);
        pdd_->pCopyDstLayouts_.resize(64);
        pdd_->physical_device_host_image_copy_properties_.pCopySrcLayouts = pdd_->pCopySrcLayouts_.data();
        pdd_->physical_device_host_image_copy_properties_.pCopyDstLayouts = pdd_->pCopyDstLayouts_.data();
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_host_image_copy_properties_);
    } else if (name == "VkPhysicalDeviceHostImageCopyProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        pdd_->pCopySrcLayouts_.resize(64);
        pdd_->pCopyDstLayouts_.resize(64);
        pdd_->physical_device_host_image_copy_properties_.pCopySrcLayouts = pdd_->pCopySrcLayouts_.data();
        pdd_->physical_device_host_image_copy_properties_.pCopyDstLayouts = pdd_->pCopyDstLayouts_.data();
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_host_image_copy_properties_);
    } else if (name == "VkPhysicalDeviceProvokingVertexPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_provoking_vertex_properties_);
    } else if (name == "VkPhysicalDeviceDescriptorBufferPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_descriptor_buffer_properties_);
    } else if (name == "VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_descriptor_buffer_density_map_properties_);
    } else if (name == "VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_INTEGER_DOT_PRODUCT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_shader_integer_dot_product_properties_);
    } else if (name == "VkPhysicalDeviceShaderIntegerDotProductProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_3, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_shader_integer_dot_product_properties_);
    } else if (name == "VkPhysicalDeviceDrmPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_PHYSICAL_DEVICE_DRM_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_drm_properties_);
    } else if (name == "VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_fragment_shader_barycentric_properties_);
    } else if (name == "VkPhysicalDevicePipelineBinaryPropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_PIPELINE_BINARY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_pipeline_binary_properties_);
    } else if (name == "VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_GRAPHICS_PIPELINE_LIBRARY_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_graphics_pipeline_library_properties_);
    } else if (name == "VkPhysicalDeviceNestedCommandBufferPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_NESTED_COMMAND_BUFFER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_nested_command_buffer_properties_);
    } else if (name == "VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SHADER_MODULE_IDENTIFIER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_shader_module_identifier_properties_);
    } else if (name == "VkPhysicalDeviceOpacityMicromapPropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_OPACITY_MICROMAP_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_opacity_micromap_properties_);
    } else if (name == "VkPhysicalDeviceOpacityMicromapPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_OPACITY_MICROMAP_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_opacity_micromap_properties_ext_);
    } else if (name == "VkPhysicalDeviceDisplacementMicromapPropertiesNV") {
#ifdef VK_ENABLE_BETA_EXTENSIONS
        auto support = CheckExtensionSupport(VK_NV_DISPLACEMENT_MICROMAP_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_displacement_micromap_properties_);
#else
        return false;
#endif // VK_ENABLE_BETA_EXTENSIONS
    } else if (name == "VkPhysicalDevicePipelineRobustnessPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_pipeline_robustness_properties_);
    } else if (name == "VkPhysicalDevicePipelineRobustnessProperties") {
        if (!CheckVersionSupport(VK_API_VERSION_1_4, name)) return false;
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_pipeline_robustness_properties_);
    } else if (name == "VkPhysicalDeviceShaderMultipleWaitQueuesPropertiesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_SHADER_MULTIPLE_WAIT_QUEUES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_shader_multiple_wait_queues_properties_);
    } else if (name == "VkPhysicalDeviceImageProcessingPropertiesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_IMAGE_PROCESSING_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_image_processing_properties_);
    } else if (name == "VkPhysicalDeviceOpticalFlowPropertiesNV") {
        auto support = CheckExtensionSupport(VK_NV_OPTICAL_FLOW_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_optical_flow_properties_);
    } else if (name == "VkPhysicalDeviceFaultPropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_DEVICE_FAULT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_fault_properties_);
    } else if (name == "VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM") {
        auto support = CheckExtensionSupport(VK_ARM_SHADER_CORE_BUILTINS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_shader_core_builtins_properties_);
    } else if (name == "VkPhysicalDeviceRayTracingInvocationReorderPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_ray_tracing_invocation_reorder_properties_);
    } else if (name == "VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV") {
        auto support = CheckExtensionSupport(VK_NV_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_ray_tracing_invocation_reorder_properties_nv_);
    } else if (name == "VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV") {
        auto support = CheckExtensionSupport(VK_NV_EXTENDED_SPARSE_ADDRESS_SPACE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_extended_sparse_address_space_properties_);
    } else if (name == "VkPhysicalDeviceShaderCorePropertiesARM") {
        auto support = CheckExtensionSupport(VK_ARM_SHADER_CORE_PROPERTIES_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_shader_core_properties_arm_);
    } else if (name == "VkPhysicalDeviceShaderObjectPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SHADER_OBJECT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_shader_object_properties_);
    } else if (name == "VkPhysicalDeviceShaderTileImagePropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SHADER_TILE_IMAGE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_shader_tile_image_properties_);
    } else if (name == "VkPhysicalDeviceCooperativeMatrixPropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_COOPERATIVE_MATRIX_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_cooperative_matrix_properties_);
    } else if (name == "VkPhysicalDeviceShaderEnqueuePropertiesAMDX") {
#ifdef VK_ENABLE_BETA_EXTENSIONS
        auto support = CheckExtensionSupport(VK_AMDX_SHADER_ENQUEUE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_shader_enqueue_properties_);
#else
        return false;
#endif // VK_ENABLE_BETA_EXTENSIONS
    } else if (name == "VkPhysicalDeviceTileMemoryHeapPropertiesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_TILE_MEMORY_HEAP_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_tile_memory_heap_properties_);
    } else if (name == "VkPhysicalDeviceImageProcessing2PropertiesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_IMAGE_PROCESSING_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_image_processing_2_properties_);
    } else if (name == "VkPhysicalDeviceLayeredDriverPropertiesMSFT") {
        auto support = CheckExtensionSupport(VK_MSFT_LAYERED_DRIVER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_layered_driver_properties_);
    } else if (name == "VkPhysicalDeviceExternalFormatResolvePropertiesANDROID") {
#ifdef VK_USE_PLATFORM_ANDROID_KHR
        auto support = CheckExtensionSupport(VK_ANDROID_EXTERNAL_FORMAT_RESOLVE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_external_format_resolve_properties_);
#else
        return false;
#endif // VK_USE_PLATFORM_ANDROID_KHR
    } else if (name == "VkPhysicalDeviceCudaKernelLaunchPropertiesNV") {
#ifdef VK_ENABLE_BETA_EXTENSIONS
        auto support = CheckExtensionSupport(VK_NV_CUDA_KERNEL_LAUNCH_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_cuda_kernel_launch_properties_);
#else
        return false;
#endif // VK_ENABLE_BETA_EXTENSIONS
    } else if (name == "VkPhysicalDeviceSchedulingControlsPropertiesARM") {
        auto support = CheckExtensionSupport(VK_ARM_SCHEDULING_CONTROLS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_scheduling_controls_properties_);
    } else if (name == "VkPhysicalDeviceSchedulingControlsDispatchParametersPropertiesARM") {
        auto support = CheckExtensionSupport(VK_ARM_SCHEDULING_CONTROLS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_scheduling_controls_dispatch_parameters_properties_);
    } else if (name == "VkPhysicalDeviceRenderPassStripedPropertiesARM") {
        auto support = CheckExtensionSupport(VK_ARM_RENDER_PASS_STRIPED_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_render_pass_striped_properties_);
    } else if (name == "VkPhysicalDeviceMapMemoryPlacedPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_MAP_MEMORY_PLACED_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_map_memory_placed_properties_);
    } else if (name == "VkPhysicalDeviceImageAlignmentControlPropertiesMESA") {
        auto support = CheckExtensionSupport(VK_MESA_IMAGE_ALIGNMENT_CONTROL_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_image_alignment_control_properties_);
    } else if (name == "VkPhysicalDeviceCooperativeMatrix2PropertiesNV") {
        auto support = CheckExtensionSupport(VK_NV_COOPERATIVE_MATRIX_2_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_cooperative_matrix_2_properties_);
    } else if (name == "VkPhysicalDeviceCooperativeVectorPropertiesNV") {
        auto support = CheckExtensionSupport(VK_NV_COOPERATIVE_VECTOR_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_cooperative_vector_properties_);
    } else if (name == "VkPhysicalDeviceTileShadingPropertiesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_TILE_SHADING_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_tile_shading_properties_);
    } else if (name == "VkPhysicalDeviceFragmentDensityMapLayeredPropertiesVALVE") {
        auto support = CheckExtensionSupport(VK_VALVE_FRAGMENT_DENSITY_MAP_LAYERED_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_fragment_density_map_layered_properties_);
    } else if (name == "VkPhysicalDeviceExternalComputeQueuePropertiesNV") {
        auto support = CheckExtensionSupport(VK_NV_EXTERNAL_COMPUTE_QUEUE_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_external_compute_queue_properties_);
    } else if (name == "VkPhysicalDeviceTensorPropertiesARM") {
        auto support = CheckExtensionSupport(VK_ARM_TENSORS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_tensor_properties_);
    } else if (name == "VkPhysicalDeviceDescriptorBufferTensorPropertiesARM") {
        auto support = CheckExtensionSupport(VK_ARM_TENSORS_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_descriptor_buffer_tensor_properties_);
    } else if (name == "VkPhysicalDeviceQueuePerfHintPropertiesQCOM") {
        auto support = CheckExtensionSupport(VK_QCOM_QUEUE_PERF_HINT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_queue_perf_hint_properties_);
    } else if (name == "VkPhysicalDevicePerformanceCountersByRegionPropertiesARM") {
        auto support = CheckExtensionSupport(VK_ARM_PERFORMANCE_COUNTERS_BY_REGION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_performance_counters_by_region_properties_);
    } else if (name == "VkPhysicalDeviceShaderLongVectorPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SHADER_LONG_VECTOR_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_shader_long_vector_properties_);
    } else if (name == "VkPhysicalDeviceShaderSplitBarrierPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_SHADER_SPLIT_BARRIER_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_shader_split_barrier_properties_);
    } else if (name == "VkPhysicalDeviceDescriptorHeapPropertiesEXT") {
        auto support = CheckExtensionSupport(VK_EXT_DESCRIPTOR_HEAP_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_descriptor_heap_properties_);
    } else if (name == "VkPhysicalDeviceDescriptorHeapTensorPropertiesARM") {
        auto support = CheckExtensionSupport(VK_EXT_DESCRIPTOR_HEAP_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_descriptor_heap_tensor_properties_);
    } else if (name == "VkPhysicalDeviceShaderInstrumentationPropertiesARM") {
        auto support = CheckExtensionSupport(VK_ARM_SHADER_INSTRUMENTATION_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_shader_instrumentation_properties_);
    } else if (name == "VkPhysicalDeviceShaderAbortPropertiesKHR") {
        auto support = CheckExtensionSupport(VK_KHR_SHADER_ABORT_EXTENSION_NAME, name);
        if (support != ExtensionSupport::SUPPORTED) return valid(support);
        return GetStruct(device_name, requested_profile, property, &pdd_->physical_device_shader_abort_properties_);
    }

    return true;
}

bool JsonLoader::GetFormat(const char *device_name, bool requested_profile, const Json::Value &formats, const std::string &format_name, MapOfVkFormatProperties *dest,
                           MapOfVkFormatProperties3 *dest3) {
    (void)requested_profile;

    VkFormat format = StringToFormat(format_name);
    VkFormatProperties profile_properties = {};
    VkFormatProperties3 profile_properties_3 = {VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3};
    const auto &member = formats[format_name];
    for (const auto &name : member.getMemberNames()) {
        const auto &props = member[name];
        if (name == "VkFormatProperties") {
            for (const auto &feature : props["linearTilingFeatures"]) {
                profile_properties.linearTilingFeatures |= StringToVkFormatFeatureFlags(feature.asString());
            }
            for (const auto &feature : props["optimalTilingFeatures"]) {
                profile_properties.optimalTilingFeatures |= StringToVkFormatFeatureFlags(feature.asString());
            }
            for (const auto &feature : props["bufferFeatures"]) {
                profile_properties.bufferFeatures |= StringToVkFormatFeatureFlags(feature.asString());
            }
        } else if (name == "VkFormatProperties2" || name == "VkFormatProperties2KHR") {
            const auto &format_properties = props["formatProperties"];
            for (const auto &feature : format_properties["linearTilingFeatures"]) {
                profile_properties.linearTilingFeatures |= StringToVkFormatFeatureFlags(feature.asString());
            }
            for (const auto &feature : format_properties["optimalTilingFeatures"]) {
                profile_properties.optimalTilingFeatures |= StringToVkFormatFeatureFlags(feature.asString());
            }
            for (const auto &feature : format_properties["bufferFeatures"]) {
                profile_properties.bufferFeatures |= StringToVkFormatFeatureFlags(feature.asString());
            }
        } else if (name == "VkFormatProperties3" || name == "VkFormatProperties3KHR") {
            for (const auto &feature : props["linearTilingFeatures"]) {
                profile_properties_3.linearTilingFeatures |= StringToVkFormatFeatureFlags2(feature.asString());
            }
            for (const auto &feature : props["optimalTilingFeatures"]) {
                profile_properties_3.optimalTilingFeatures |= StringToVkFormatFeatureFlags2(feature.asString());
            }
            for (const auto &feature : props["bufferFeatures"]) {
                profile_properties_3.bufferFeatures |= StringToVkFormatFeatureFlags2(feature.asString());
            }
        }
    }

    profile_properties_3.linearTilingFeatures |= profile_properties.linearTilingFeatures;
    profile_properties_3.optimalTilingFeatures |= profile_properties.optimalTilingFeatures;
    profile_properties_3.bufferFeatures |= profile_properties.bufferFeatures;

    profile_properties.linearTilingFeatures |= static_cast<VkFormatFeatureFlags>(profile_properties_3.linearTilingFeatures);
    profile_properties.optimalTilingFeatures |= static_cast<VkFormatFeatureFlags>(profile_properties_3.optimalTilingFeatures);
    profile_properties.bufferFeatures |= static_cast<VkFormatFeatureFlags>(profile_properties_3.bufferFeatures);

    (*dest)[format] = profile_properties;
    (*dest3)[format] = profile_properties_3;

    if (IsASTCHDRFormat(format) && !device_has_astc_hdr) {
        // We already notified that ASTC HDR is not supported, no spamming
        return false;
    }
    if (IsASTCLDRFormat(format) && !device_has_astc) {
        // We already notified that ASTC is not supported, no spamming
        return false;
    }
    if ((IsETC2Format(format) || IsEACFormat(format)) && !device_has_etc2) {
        // We already notified that ETC2 is not supported, no spamming
        return false;
    }
    if (IsBCFormat(format) && !device_has_bc) {
        // We already notified that BC is not supported, no spamming
        return false;
    }
    if (IsPVRTCFormat(format) &&!device_has_pvrtc) {
        // We already notified that PVRTC is not supported, no spamming
        return false;
    }

    bool valid = true;

    const VkFormatProperties &device_properties = pdd_->device_formats_[format];
    if (!HasFlags(device_properties.linearTilingFeatures, profile_properties.linearTilingFeatures)) {
        WarnMissingFormatFeatures(&layer_settings, device_name, format_name, "linearTilingFeatures", profile_properties.linearTilingFeatures,
                                  device_properties.linearTilingFeatures);
        valid = false;
    }
    if (!HasFlags(device_properties.optimalTilingFeatures, profile_properties.optimalTilingFeatures)) {
        WarnMissingFormatFeatures(&layer_settings, device_name, format_name, "optimalTilingFeatures", profile_properties.optimalTilingFeatures,
                                  device_properties.optimalTilingFeatures);
        valid = false;
    }
    if (!HasFlags(device_properties.bufferFeatures, profile_properties.bufferFeatures)) {
        WarnMissingFormatFeatures(&layer_settings, device_name, format_name, "bufferFeatures", profile_properties.bufferFeatures,
                                  device_properties.bufferFeatures);
        valid = false;
    }

    const VkFormatProperties3 &device_properties_3 = pdd_->device_formats_3_[format];
    if (!HasFlags(device_properties_3.linearTilingFeatures, profile_properties_3.linearTilingFeatures)) {
        WarnMissingFormatFeatures2(&layer_settings, device_name, format_name, "linearTilingFeatures", profile_properties_3.linearTilingFeatures,
                                   device_properties_3.linearTilingFeatures);
        valid = false;
    }
    if (!HasFlags(device_properties_3.optimalTilingFeatures, profile_properties_3.optimalTilingFeatures)) {
        WarnMissingFormatFeatures2(&layer_settings, device_name, format_name, "optimalTilingFeatures", profile_properties_3.optimalTilingFeatures,
                                   device_properties_3.optimalTilingFeatures);
        valid = false;
    }
    if (!HasFlags(device_properties_3.bufferFeatures, profile_properties_3.bufferFeatures)) {
        WarnMissingFormatFeatures2(&layer_settings, device_name, format_name, "bufferFeatures", profile_properties_3.bufferFeatures,
                                   device_properties_3.bufferFeatures);
        valid = false;
    }

    return valid;
}

bool JsonLoader::CheckVersionSupport(uint32_t version, const std::string &name) {
    if (pdd_->GetEffectiveVersion() < version) {
        LogMessage(&layer_settings,
            DEBUG_REPORT_ERROR_BIT,
            "Profile sets %s which is provided by Vulkan version %s, but the current effective API version is %s.\n",
                     name.c_str(), StringAPIVersion(version).c_str(), StringAPIVersion(pdd_->GetEffectiveVersion()).c_str());
        return false;
    }
    return true;
}

JsonLoader::ExtensionSupport JsonLoader::CheckExtensionSupport(const char *extension, const std::string &name) {
    for (const auto &ext : excluded_extensions_) {
        if (ext == extension) {
            LogMessage(&layer_settings, DEBUG_REPORT_NOTIFICATION_BIT,
                       "Profile requires %s capabilities, but %s is excluded, device values are used.\n", name.c_str(),
                                extension);
            return JsonLoader::ExtensionSupport::EXCLUDED;
        }
    }
    if (layer_settings.simulate.capabilities & SIMULATE_EXTENSIONS_BIT) {
        if (!PhysicalDeviceData::HasSimulatedExtension(pdd_, extension)) {
            LogMessage(&layer_settings, DEBUG_REPORT_ERROR_BIT,
                "Profile requires %s capabilitiess, but %s is not required by the profile, device values are used.\n",
                         name.c_str(), extension);
            if (layer_settings.log.debug_fail_on_error) {
                return JsonLoader::ExtensionSupport::UNSUPPORTED;
            }
        }
    } else {
        if (!PhysicalDeviceData::HasExtension(pdd_, extension)) {
            LogMessage(&layer_settings,
                DEBUG_REPORT_WARNING_BIT,
                "Profile requires by %s capabilities, but %s is not supported by the device.\n", name.c_str(), extension);
        }
    }
    return JsonLoader::ExtensionSupport::SUPPORTED;
}

bool JsonLoader::valid(ExtensionSupport support) {
    if (support == JsonLoader::ExtensionSupport::UNSUPPORTED) {
        return false;
    }
    return true;
}

bool JsonLoader::GetQueueFamilyProperties(const char* device_name, const Json::Value &qf_props, QueueFamilyProperties *dest) {
    for (const auto &name : qf_props.getMemberNames()) {
        const auto &props = qf_props[name];
        if (name == "VkQueueFamilyProperties") {
            for (const auto &feature : props["queueFlags"]) {
                dest->properties_2.queueFamilyProperties.queueFlags |= StringToVkQueueFlags(feature.asString());
            }
            dest->properties_2.queueFamilyProperties.queueCount = static_cast<uint32_t>(props["queueCount"].asInt());
            dest->properties_2.queueFamilyProperties.timestampValidBits = props["timestampValidBits"].asUInt();
            const auto &minImagetransferGranularity = props["minImageTransferGranularity"];
            dest->properties_2.queueFamilyProperties.minImageTransferGranularity.width =
                minImagetransferGranularity["width"].asUInt();
            dest->properties_2.queueFamilyProperties.minImageTransferGranularity.height =
                minImagetransferGranularity["height"].asUInt();
            dest->properties_2.queueFamilyProperties.minImageTransferGranularity.depth =
                minImagetransferGranularity["depth"].asUInt();
        } else if (name == "VkQueueFamilyProperties2" || name == "VkQueueFamilyProperties2KHR") {
            const auto &props2 = props["queueFamilyProperties"];
            for (const auto &feature : props2["queueFlags"]) {
                dest->properties_2.queueFamilyProperties.queueFlags |= StringToVkQueueFlags(feature.asString());
            }
            dest->properties_2.queueFamilyProperties.queueCount = static_cast<uint32_t>(props2["queueCount"].asInt());
            dest->properties_2.queueFamilyProperties.timestampValidBits = props2["timestampValidBits"].asUInt();
            const auto &minImagetransferGranularity = props2["minImageTransferGranularity"];
            dest->properties_2.queueFamilyProperties.minImageTransferGranularity.width =
                minImagetransferGranularity["width"].asUInt();
            dest->properties_2.queueFamilyProperties.minImageTransferGranularity.height =
                minImagetransferGranularity["height"].asUInt();
            dest->properties_2.queueFamilyProperties.minImageTransferGranularity.depth =
                minImagetransferGranularity["depth"].asUInt();
        } else if (name == "VkQueueFamilyOwnershipTransferPropertiesKHR") {
            for (const auto &feature : props["optimalImageTransferToQueueFamilies"]) {
                dest->ownership_transfer_properties_.optimalImageTransferToQueueFamilies |= feature.asUInt();
            }
        } else if (name == "VkQueueFamilyOptimalImageTransferGranularityPropertiesKHR") {
            const auto &optimalImageTransferGranularity = props["optimalImageTransferGranularity"];
            dest->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.width =
                optimalImageTransferGranularity["width"].asUInt();
            dest->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.height =
                optimalImageTransferGranularity["height"].asUInt();
            dest->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.depth =
                optimalImageTransferGranularity["depth"].asUInt();
        } else if (name == "VkQueueFamilyGlobalPriorityPropertiesKHR" || name == "VkQueueFamilyGlobalPriorityPropertiesEXT") {
            uint32_t i = 0;
            for (const auto &feature : props["priorities"]) {
                dest->global_priority_properties_.priorities[i++] = StringToVkQueueGlobalPriorityKHR(feature.asString());
            }
            dest->global_priority_properties_.priorityCount = props["priorityCount"].asUInt();
        } else if (name == "VkQueueFamilyVideoPropertiesKHR") {
            for (const auto &feature : props["videoCodecOperations"]) {
                dest->video_properties_.videoCodecOperations |= StringToVkVideoCodecOperationFlagsKHR(feature.asString());
            }
        } else if (name == "VkQueueFamilyCheckpointProperties2NV") {
            for (const auto &feature : props["checkpointExecutionStageMask"]) {
                dest->checkpoint_properties_2_.checkpointExecutionStageMask |= StringToVkPipelineStageFlags2(feature.asString());
            }
        } else if (name == "VkQueueFamilyCheckpointPropertiesNV") {
            for (const auto &feature : props["checkpointExecutionStageMask"]) {
                dest->checkpoint_properties_.checkpointExecutionStageMask |= StringToVkPipelineStageFlags(feature.asString());
            }
        } else if (name == "VkQueueFamilyQueryResultStatusPropertiesKHR") {
            dest->query_result_status_properties_.queryResultStatusSupport = props["queryResultStatusSupport"].asBool() ? VK_TRUE : VK_FALSE;
        }
    }

    bool valid = true;

    bool supported = false;
    for (const auto &device_qfp : pdd_->device_queue_family_properties_) {
        if (!QueueFamilyMatch(device_qfp.properties_2.queueFamilyProperties, dest->properties_2.queueFamilyProperties)) {
            continue;
        }
        if ((device_qfp.ownership_transfer_properties_.optimalImageTransferToQueueFamilies & dest->ownership_transfer_properties_.optimalImageTransferToQueueFamilies) !=
             dest->ownership_transfer_properties_.optimalImageTransferToQueueFamilies) {
            continue;
        }
        if (dest->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.width > 0 &&
            device_qfp.optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.width >
                dest->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.width) {
            continue;
        }
        if (dest->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.height > 0 &&
            device_qfp.optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.height >
                dest->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.height) {
            continue;
        }
        if (dest->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.depth > 0 &&
            device_qfp.optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.depth >
                dest->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.depth) {
            continue;
        }
        if (!GlobalPriorityMatch(device_qfp.global_priority_properties_, dest->global_priority_properties_)) {
            continue;
        }
        if ((device_qfp.video_properties_.videoCodecOperations & dest->video_properties_.videoCodecOperations) !=
            dest->video_properties_.videoCodecOperations) {
            continue;
        }
        if ((device_qfp.checkpoint_properties_.checkpointExecutionStageMask &
             dest->checkpoint_properties_.checkpointExecutionStageMask) !=
            dest->checkpoint_properties_.checkpointExecutionStageMask) {
            continue;
        }
        if ((device_qfp.checkpoint_properties_2_.checkpointExecutionStageMask &
             dest->checkpoint_properties_2_.checkpointExecutionStageMask) !=
            dest->checkpoint_properties_2_.checkpointExecutionStageMask) {
            continue;
        }
        if (device_qfp.query_result_status_properties_.queryResultStatusSupport != dest->query_result_status_properties_.queryResultStatusSupport) {
            continue;
        }
        supported = true;
        break;
    }
    if (!supported) {
        std::string message =
            format("Device (%s) has no queue family that supports VkQueueFamilyProperties [queueFlags: %s, queueCount: %" PRIu32
                   ", timestampValidBits: %" PRIu32 ", minImageTransferGranularity: [%" PRIu32 ", %" PRIu32 ", %" PRIu32 "]]",
                   device_name,
                   GetQueueFlagsToString(dest->properties_2.queueFamilyProperties.queueFlags).c_str(),
                   dest->properties_2.queueFamilyProperties.queueCount, dest->properties_2.queueFamilyProperties.timestampValidBits,
                   dest->properties_2.queueFamilyProperties.minImageTransferGranularity.width,
                   dest->properties_2.queueFamilyProperties.minImageTransferGranularity.height,
                   dest->properties_2.queueFamilyProperties.minImageTransferGranularity.depth);
        if (dest->ownership_transfer_properties_.optimalImageTransferToQueueFamilies > 0) {
            message += format(", VkQueueFamilyOwnershipTransferPropertiesKHR [optimalImageTransferToQueueFamilies: %" PRIu32 "]",
                              dest->ownership_transfer_properties_.optimalImageTransferToQueueFamilies);
        }
        if (dest->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.width > 0 ||
            dest->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.height > 0 ||
            dest->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.depth > 0) {
            message += format(", VkQueueFamilyOptimalImageTransferGranularityPropertiesKHR [optimalImageTransferGranularity: [%" PRIu32
                              ", %" PRIu32 ", %" PRIu32 "]]",
                              dest->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.width,
                              dest->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.height,
                              dest->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.depth);
        }
        if (dest->global_priority_properties_.priorityCount > 0) {
            std::string priorities = "[";
            for (uint32_t i = 0; i < dest->global_priority_properties_.priorityCount; ++i) {
                if (i > 0) {
                    priorities += ", ";
                }
                priorities += string_VkQueueGlobalPriority(dest->global_priority_properties_.priorities[i]);
            }
            priorities += "]";

            message += format(", VkQueueFamilyGlobalPriorityPropertiesKHR [priorityCount: %" PRIu32 ", priorities: %s]",
                              dest->global_priority_properties_.priorityCount, priorities.c_str());
        }
        if (dest->video_properties_.videoCodecOperations > 0) {
            message += format(", VkQueueFamilyVideoPropertiesKHR [videoCodecOperations: %s]",
                              string_VkVideoCodecOperationFlagsKHR(dest->video_properties_.videoCodecOperations).c_str());
        }
        if (dest->checkpoint_properties_.checkpointExecutionStageMask > 0) {
            message += format(", VkQueueFamilyCheckpointPropertiesNV [checkpointExecutionStageMask: %s]",
                              string_VkPipelineStageFlags(dest->checkpoint_properties_.checkpointExecutionStageMask).c_str());
        }
        if (dest->checkpoint_properties_2_.checkpointExecutionStageMask > 0) {
            message += format(", VkQueueFamilyCheckpointProperties2NV [checkpointExecutionStageMask: %s]",
                              string_VkPipelineStageFlags2(dest->checkpoint_properties_2_.checkpointExecutionStageMask).c_str());
        }
        if (dest->query_result_status_properties_.queryResultStatusSupport) {
            message += format(", VkQueueFamilyQueryResultStatusPropertiesKHR [queryResultStatusSupport: VK_TRUE]");
        }
        message += ".\n";
        LogMessage(&layer_settings, DEBUG_REPORT_WARNING_BIT, message.c_str());
        valid = false;
    }

    return valid;
}

bool QueueFamilyAndExtensionsMatch(const QueueFamilyProperties &device, const QueueFamilyProperties &profile) {
    if (!QueueFamilyMatch(device.properties_2.queueFamilyProperties, profile.properties_2.queueFamilyProperties)) {
        return false;
    }
    if ((device.ownership_transfer_properties_.optimalImageTransferToQueueFamilies & profile.ownership_transfer_properties_.optimalImageTransferToQueueFamilies) !=
         profile.ownership_transfer_properties_.optimalImageTransferToQueueFamilies) {
        return false;
    }
    if (profile.optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.width > 0 &&
        device.optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.width >
            profile.optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.width) {
        return false;
    }
    if (profile.optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.height > 0 &&
        device.optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.height >
            profile.optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.height) {
        return false;
    }
    if (profile.optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.depth > 0 &&
        device.optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.depth >
            profile.optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.depth) {
        return false;
    }
    if (!GlobalPriorityMatch(device.global_priority_properties_, profile.global_priority_properties_)) {
        return false;
    }
    if ((device.video_properties_.videoCodecOperations & profile.video_properties_.videoCodecOperations) !=
        profile.video_properties_.videoCodecOperations) {
        return false;
    }
    if ((device.checkpoint_properties_.checkpointExecutionStageMask &
         profile.checkpoint_properties_.checkpointExecutionStageMask) !=
        profile.checkpoint_properties_.checkpointExecutionStageMask) {
        return false;
    }
    if ((device.checkpoint_properties_2_.checkpointExecutionStageMask &
         profile.checkpoint_properties_2_.checkpointExecutionStageMask) !=
        profile.checkpoint_properties_2_.checkpointExecutionStageMask) {
        return false;
    }
    if (device.query_result_status_properties_.queryResultStatusSupport != profile.query_result_status_properties_.queryResultStatusSupport) {
        return false;
    }
    return true;
}

void CopyUnsetQueueFamilyProperties(const QueueFamilyProperties *device, QueueFamilyProperties *profile) {
    if (profile->properties_2.queueFamilyProperties.queueFlags == 0) {
        profile->properties_2.queueFamilyProperties.queueFlags = device->properties_2.queueFamilyProperties.queueFlags;
    }
    if (profile->properties_2.queueFamilyProperties.queueCount == 0) {
        profile->properties_2.queueFamilyProperties.queueCount = device->properties_2.queueFamilyProperties.queueCount;
    }
    if (profile->properties_2.queueFamilyProperties.timestampValidBits == 0) {
        profile->properties_2.queueFamilyProperties.timestampValidBits =
            device->properties_2.queueFamilyProperties.timestampValidBits;
    }
    if (profile->properties_2.queueFamilyProperties.minImageTransferGranularity.width == 0) {
        profile->properties_2.queueFamilyProperties.minImageTransferGranularity.width =
            device->properties_2.queueFamilyProperties.minImageTransferGranularity.width;
    }
    if (profile->properties_2.queueFamilyProperties.minImageTransferGranularity.height == 0) {
        profile->properties_2.queueFamilyProperties.minImageTransferGranularity.height =
            device->properties_2.queueFamilyProperties.minImageTransferGranularity.height;
    }
    if (profile->properties_2.queueFamilyProperties.minImageTransferGranularity.depth == 0) {
        profile->properties_2.queueFamilyProperties.minImageTransferGranularity.depth =
            device->properties_2.queueFamilyProperties.minImageTransferGranularity.depth;
    }
    if (profile->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.width == 0) {
        profile->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.width =
            device->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.width;
    }
    if (profile->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.height == 0) {
        profile->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.height =
            device->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.height;
    }
    if (profile->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.depth == 0) {
        profile->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.depth =
            device->optimal_image_transfer_granularity_properties_.optimalImageTransferGranularity.depth;
    }
}

bool JsonLoader::OrderQueueFamilyProperties(ArrayOfVkQueueFamilyProperties *qfp) {
    if (qfp->empty()) {
        return true;
    }
    // If device has less queue families than needed we can't load all profile queue families
    if (pdd_->device_queue_family_properties_.size() < qfp->size()) {
        return false;
    }
    // Find all permutations and see if any of them supports profile queue families
    std::vector<uint32_t> permutations(pdd_->device_queue_family_properties_.size());
    uint32_t count = static_cast<uint32_t>(permutations.size());
    for (uint32_t i = 0; i < count; ++i) {
        permutations[i] = i;
    }
    do {
        bool match = true;
        for (uint32_t i = 0; i < count; ++i) {
            if (permutations[i] < qfp->size() &&
                !QueueFamilyAndExtensionsMatch(pdd_->device_queue_family_properties_[i], (*qfp)[permutations[i]])) {
                match = false;
                break;
            }
        }
        if (match) {
            // Empty queue families at the end are not needed
            while (permutations[count - 1] >= qfp->size()) {
                --count;
            }
            ArrayOfVkQueueFamilyProperties ordered;
            for (uint32_t i = 0; i < count; ++i) {
                if (permutations[i] < qfp->size()) {
                    ordered.push_back((*qfp)[permutations[i]]);
                } else {
                    ordered.push_back(QueueFamilyProperties());
                }
            }
            *qfp = ordered;
            for (uint32_t i = 0; i < count; ++i) {
                CopyUnsetQueueFamilyProperties(&pdd_->device_queue_family_properties_[i], &(*qfp)[i]);
            }
            return true;
        }
    } while (std::next_permutation(permutations.begin(), permutations.end()));
    LogMessage(&layer_settings, DEBUG_REPORT_WARNING_BIT,
               "Device supports all individual profile queue families, but not all of them simultaneously.\n");
    return false;
}

void JsonLoader::AddPromotedExtensions(uint32_t api_version) {
	const uint32_t minor = VK_API_VERSION_MINOR(api_version);
	const uint32_t major = VK_API_VERSION_MAJOR(api_version);
	LogMessage(&layer_settings, DEBUG_REPORT_NOTIFICATION_BIT,
	"- Adding promoted extensions to core in Vulkan (%" PRIu32 ".%" PRIu32 ").\n", major, minor);

    static const std::vector<const char *> promoted_1_1 = {
        VK_KHR_MULTIVIEW_EXTENSION_NAME,
        VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
        VK_KHR_DEVICE_GROUP_EXTENSION_NAME,
        VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME,
        VK_KHR_MAINTENANCE_1_EXTENSION_NAME,
        VK_KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME,
        VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME,
        VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME,
        VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME,
        VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME,
        VK_KHR_16BIT_STORAGE_EXTENSION_NAME,
        VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME,
        VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME,
        VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME,
        VK_KHR_MAINTENANCE_2_EXTENSION_NAME,
        VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME,
        VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME,
        VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME,
        VK_KHR_RELAXED_BLOCK_LAYOUT_EXTENSION_NAME,
        VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME,
        VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME,
        VK_KHR_BIND_MEMORY_2_EXTENSION_NAME,
        VK_KHR_MAINTENANCE_3_EXTENSION_NAME,
    };
    if (api_version >= VK_API_VERSION_1_1) {
        for (const auto& ext : promoted_1_1) {
            VkExtensionProperties extension;
            strcpy(extension.extensionName, ext);
            extension.specVersion = 1;
            if (!PhysicalDeviceData::HasSimulatedExtension(pdd_, ext)) {
                pdd_->simulation_extensions_.insert({ext, extension});
            }
            pdd_->map_of_extension_properties_.insert({ext, extension});
        }
    }
    static const std::vector<const char *> promoted_1_2 = {
        VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME,
        VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME,
        VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME,
        VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME,
        VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME,
        VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME,
        VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME,
        VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_EXTENSION_NAME,
        VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME,
        VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME,
        VK_KHR_8BIT_STORAGE_EXTENSION_NAME,
        VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME,
        VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME,
        VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME,
        VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME,
        VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME,
        VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME,
        VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME,
        VK_KHR_SPIRV_1_4_EXTENSION_NAME,
        VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME,
        VK_EXT_SEPARATE_STENCIL_USAGE_EXTENSION_NAME,
        VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME,
        VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME,
        VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME,
    };
    if (api_version >= VK_API_VERSION_1_2) {
        for (const auto& ext : promoted_1_2) {
            VkExtensionProperties extension;
            strcpy(extension.extensionName, ext);
            extension.specVersion = 1;
            if (!PhysicalDeviceData::HasSimulatedExtension(pdd_, ext)) {
                pdd_->simulation_extensions_.insert({ext, extension});
            }
            pdd_->map_of_extension_properties_.insert({ext, extension});
        }
    }
    static const std::vector<const char *> promoted_1_3 = {
        VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME,
        VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME,
        VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME,
        VK_EXT_PIPELINE_CREATION_FEEDBACK_EXTENSION_NAME,
        VK_KHR_SHADER_TERMINATE_INVOCATION_EXTENSION_NAME,
        VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME,
        VK_EXT_TOOLING_INFO_EXTENSION_NAME,
        VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME,
        VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME,
        VK_KHR_SHADER_INTEGER_DOT_PRODUCT_EXTENSION_NAME,
        VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME,
        VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME,
        VK_EXT_PRIVATE_DATA_EXTENSION_NAME,
        VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME,
        VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME,
        VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_EXTENSION_NAME,
        VK_EXT_YCBCR_2PLANE_444_FORMATS_EXTENSION_NAME,
        VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME,
        VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME,
        VK_EXT_4444_FORMATS_EXTENSION_NAME,
        VK_KHR_FORMAT_FEATURE_FLAGS_2_EXTENSION_NAME,
        VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME,
        VK_KHR_MAINTENANCE_4_EXTENSION_NAME,
    };
    if (api_version >= VK_API_VERSION_1_3) {
        for (const auto& ext : promoted_1_3) {
            VkExtensionProperties extension;
            strcpy(extension.extensionName, ext);
            extension.specVersion = 1;
            if (!PhysicalDeviceData::HasSimulatedExtension(pdd_, ext)) {
                pdd_->simulation_extensions_.insert({ext, extension});
            }
            pdd_->map_of_extension_properties_.insert({ext, extension});
        }
    }
    static const std::vector<const char *> promoted_1_4 = {
        VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME,
        VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME,
        VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME,
        VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME,
        VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME,
        VK_KHR_MAP_MEMORY_2_EXTENSION_NAME,
        VK_KHR_SHADER_SUBGROUP_ROTATE_EXTENSION_NAME,
        VK_EXT_PIPELINE_PROTECTED_ACCESS_EXTENSION_NAME,
        VK_KHR_MAINTENANCE_5_EXTENSION_NAME,
        VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME,
        VK_KHR_LOAD_STORE_OP_NONE_EXTENSION_NAME,
        VK_KHR_SHADER_FLOAT_CONTROLS_2_EXTENSION_NAME,
        VK_KHR_INDEX_TYPE_UINT8_EXTENSION_NAME,
        VK_KHR_LINE_RASTERIZATION_EXTENSION_NAME,
        VK_KHR_SHADER_EXPECT_ASSUME_EXTENSION_NAME,
        VK_KHR_MAINTENANCE_6_EXTENSION_NAME,
    };
    if (api_version >= VK_API_VERSION_1_4) {
        for (const auto& ext : promoted_1_4) {
            VkExtensionProperties extension;
            strcpy(extension.extensionName, ext);
            extension.specVersion = 1;
            if (!PhysicalDeviceData::HasSimulatedExtension(pdd_, ext)) {
                pdd_->simulation_extensions_.insert({ext, extension});
            }
            pdd_->map_of_extension_properties_.insert({ext, extension});
        }
    }
}

VkResult JsonLoader::ReadProfile(const char *device_name, const Json::Value& root, const std::vector<std::vector<std::string>> &capabilities, bool requested_profile, bool enable_warnings) {
    bool failed = false;

    uint32_t properties_api_version = 0;
    uint32_t simulated_version = 0;

    const auto &cap_definisions = root["capabilities"];
    for (const auto &capability_variants : capabilities) {
        for (const auto &cap_variant : capability_variants) {
            const auto &cap_definision = cap_definisions[cap_variant];

            const auto &properties = cap_definision["properties"];
            if (properties.isMember("VkPhysicalDeviceProperties") && properties["VkPhysicalDeviceProperties"].isMember("apiVersion")) {
                properties_api_version = static_cast<uint32_t>(properties["VkPhysicalDeviceProperties"]["apiVersion"].asInt());
                simulated_version = properties_api_version;
            } else if (layer_settings.simulate.capabilities & SIMULATE_API_VERSION_BIT) {
                simulated_version = profile_api_version_;
            }
        }
    }
    if (simulated_version != 0 && requested_profile) {
        AddPromotedExtensions(simulated_version);
    }

    for (const auto &capability_variants : capabilities) {
        for (const auto &capability_variant : capability_variants) {
            const auto &cap_definision = cap_definisions[capability_variant];
            const auto &properties = cap_definision["properties"];

            if (VK_API_VERSION_PATCH(this->profile_api_version_) > VK_API_VERSION_PATCH(pdd_->physical_device_properties_.apiVersion)) {
                LogMessage(&layer_settings, DEBUG_REPORT_WARNING_BIT,
                    "Profile apiVersion (%" PRIu32 ".%" PRIu32 ".%" PRIu32 ") is greater than the device apiVersion (%" PRIu32 ".%" PRIu32 ".%" PRIu32 ").\n",
                        VK_API_VERSION_MAJOR(this->profile_api_version_),
                        VK_API_VERSION_MINOR(this->profile_api_version_),
                        VK_API_VERSION_PATCH(this->profile_api_version_),
                        VK_API_VERSION_MAJOR(pdd_->physical_device_properties_.apiVersion),
                        VK_API_VERSION_MINOR(pdd_->physical_device_properties_.apiVersion),
                        VK_API_VERSION_PATCH(pdd_->physical_device_properties_.apiVersion));
                failed = true;
            }

            if (layer_settings.simulate.capabilities & SIMULATE_EXTENSIONS_BIT) {
                const auto &extensions = cap_definision["extensions"];

                pdd_->map_of_extension_properties_.reserve(extensions.size());
                for (const auto &e : extensions.getMemberNames()) {
                    VkExtensionProperties extension;
                    strcpy(extension.extensionName, e.c_str());
                    extension.specVersion = static_cast<uint32_t>(extensions[e].asInt());

                    bool found = pdd_->map_of_extension_properties_.count(e) > 0;

                    if (IsInstanceExtension(e.c_str())) {
                        LogMessage(&layer_settings, DEBUG_REPORT_NOTIFICATION_BIT,
                            "Required %s extension is an instance extension. The Profiles layer can't override instance extension, the extension is ignored.\n", e.c_str());
                    }

                    if (!found) {
                        bool supported_on_device = pdd_->device_extensions_.count(e) > 0;

                        if (!supported_on_device) {
                            failed = true;
                        }
                        pdd_->map_of_extension_properties_.insert({e, extension});
                        if (!PhysicalDeviceData::HasSimulatedExtension(pdd_, extension.extensionName)) {
                            pdd_->simulation_extensions_.insert({e, extension});
                        }
                    }
                }
            }

            if (layer_settings.simulate.capabilities & SIMULATE_FEATURES_BIT) {
                const auto &features = cap_definision["features"];

                bool duplicated = !WarnDuplicatedFeature(features);
                if (duplicated) {
                    failed = true;
                }

                for (const auto &feature : features.getMemberNames()) {
                    if (features.isMember("VkPhysicalDeviceVulkan11Features")) {
                        pdd_->vulkan_1_1_features_written_ = true;
                    }
                    if (features.isMember("VkPhysicalDeviceVulkan12Features")) {
                        pdd_->vulkan_1_2_features_written_ = true;
                    }
                    if (features.isMember("VkPhysicalDeviceVulkan13Features")) {
                        pdd_->vulkan_1_3_features_written_ = true;
                    }
                    if (features.isMember("VkPhysicalDeviceVulkan14Features")) {
                        pdd_->vulkan_1_4_features_written_ = true;
                    }
                    bool success = GetFeature(device_name, enable_warnings, features, feature);
                    if (!success) {
                        failed = true;
                    }
                }
            }

            if (layer_settings.simulate.capabilities & SIMULATE_PROPERTIES_BIT) {
                bool duplicated = !WarnDuplicatedProperty(properties);
                if (duplicated) {
                    failed = true;
                }

                if (properties.isMember("VkPhysicalDeviceVulkan11Properties")) {
                    pdd_->vulkan_1_1_properties_written_ = true;
                }
                if (properties.isMember("VkPhysicalDeviceVulkan12Properties")) {
                    pdd_->vulkan_1_2_properties_written_ = true;
                }
                if (properties.isMember("VkPhysicalDeviceVulkan13Properties")) {
                    pdd_->vulkan_1_3_properties_written_ = true;
                }
                if (properties.isMember("VkPhysicalDeviceVulkan14Properties")) {
                    pdd_->vulkan_1_4_properties_written_ = true;
                }
                for (const auto &prop : properties.getMemberNames()) {
                    bool success = GetProperty(device_name, enable_warnings, properties, prop);
                    if (!success) {
                        failed = true;
                    }
                }
            }

            if (layer_settings.simulate.capabilities & SIMULATE_FORMATS_BIT) {
                const auto &formats = cap_definision["formats"];

                for (const auto &format : formats.getMemberNames()) {
                    bool success = GetFormat(device_name, enable_warnings, formats, format, &pdd_->map_of_format_properties_, &pdd_->map_of_format_properties_3_);
                    if (!success) {
                        failed = true;
                    }
                }
            }

            if (layer_settings.simulate.capabilities & SIMULATE_QUEUE_FAMILY_PROPERTIES_BIT) {
                const auto &qf_props = cap_definision["queueFamiliesProperties"];

                bool queue_families_supported = true;
                for (const auto &qfp : qf_props) {
                    pdd_->arrayof_queue_family_properties_.emplace_back();
                    bool success = GetQueueFamilyProperties(device_name, qfp, &pdd_->arrayof_queue_family_properties_.back());
                    if (!success) {
                        queue_families_supported = false;
                        failed = true;
                    }
                }
                if (queue_families_supported) {
                    bool success = OrderQueueFamilyProperties(&pdd_->arrayof_queue_family_properties_);
                    if (!success) {
                        failed = true;
                    }
                }
            }
        }
    }

    if (layer_settings.simulate.capabilities & (SIMULATE_VIDEO_CAPABILITIES_BIT | SIMULATE_VIDEO_FORMATS_BIT)) {
        // Handle video profiles

        struct JsonVideoProfileData {
            JsonVideoProfileInfo info{};
            JsonVideoProfileCaps caps{};
            std::vector<JsonVideoProfileFormat> formats{};
        };
        std::vector<JsonVideoProfileData> parsed_video_profiles{};

        for (const auto &capability_variants : capabilities) {
            for (const auto &capability_variant : capability_variants) {
                const auto &cap_definition = cap_definisions[capability_variant];
                if (cap_definition.isMember("videoProfiles")) {
                    const auto &json_video_profiles = cap_definition["videoProfiles"];
                    parsed_video_profiles.reserve(json_video_profiles.size());
                    for (const auto &json_video_profile : json_video_profiles) {
                        JsonVideoProfileData video_profile{};

                        video_profile.info = JsonVideoProfileInfo(json_video_profile);
                        if (!video_profile.info.IsValid()) {
                            LogMessage(&layer_settings, DEBUG_REPORT_ERROR_BIT, "Invalid video profile info defined in the profile\n");
                            failed = true;
                            continue;
                        }

                        video_profile.caps = JsonVideoProfileCaps(json_video_profile);
                        if (!video_profile.caps.IsValid()) {
                            LogMessage(&layer_settings, DEBUG_REPORT_ERROR_BIT, "Invalid video profile capabilities defined in the profile\n");
                            failed = true;
                            continue;
                        }

                        if (json_video_profile.isMember("formats")) {
                            const auto &formats = json_video_profile["formats"];
                            video_profile.formats.reserve(formats.size());
                            for (const auto &format : formats) {
                                JsonVideoProfileFormat fmt(format);
                                if (fmt.IsValid()) {
                                    video_profile.formats.push_back(std::move(fmt));
                                } else {
                                    LogMessage(&layer_settings, DEBUG_REPORT_ERROR_BIT, "Invalid video profile format defined in the profile\n");
                                    failed = true;
                                    continue;
                                }
                            }
                        }

                        parsed_video_profiles.push_back(std::move(video_profile));
                    }
                }
            }
        }

        if (!parsed_video_profiles.empty()) {
            auto for_each_matching_video_profile = [&](const VideoProfileInfoChain &video_profile_info,
                                                    std::function<void(const JsonVideoProfileData&)> callback) {
                for (const auto &parsed_video_profile : parsed_video_profiles) {
                    if (parsed_video_profile.info.IsMatching(video_profile_info)) {
                        callback(parsed_video_profile);
                    }
                }
            };
            auto for_each_matching_video_profile_format = [&](const VideoProfileInfoChain &video_profile_info,
                                                            std::function<void(const JsonVideoProfileFormat&)> callback) {
                for_each_matching_video_profile(video_profile_info, [&](const JsonVideoProfileData &json_video_profile) {
                    for (const auto &json_video_format : json_video_profile.formats) {
                        callback(json_video_format);
                    }
                });
            };
            auto check_api_version = [&](uint32_t api_version) { return this->profile_api_version_ >= api_version; };
            auto check_extension = [&](const char* extension) { return PhysicalDeviceData::HasSimulatedExtension(pdd_, extension); };

            ForEachVideoProfile([&](const VkVideoProfileInfoKHR& info, const char *name) {
                std::string device_and_profile_name = std::string(device_name) + ", video profile '" + name + "'";
                bool insert_video_profile_data = false;
                VideoProfileData video_profile{};

                // Construct and verify video profile info chain
                video_profile.info = VideoProfileInfoChain(&info);
                if (!video_profile.info.valid) {
                    LogMessage(&layer_settings, DEBUG_REPORT_ERROR_BIT, "Invalid video profile info chain for video profile '%s'\n", name);
                    failed = true;
                    return;
                }

                // Construct and verify video profile capabilities chain
                video_profile.caps = VideoCapabilitiesChain(info.videoCodecOperation, check_api_version, check_extension);
                if (!video_profile.caps.valid) {
                    LogMessage(&layer_settings, DEBUG_REPORT_ERROR_BIT, "Invalid video capabilities chain for video profile '%s'\n", name);
                    failed = true;
                    return;
                }

                // Track whether the video profile is supported by the device or profile, as simulation flags indicate
                bool supported = false;

                // Initialize capabilities with the physical device supported video profile data, if available
                auto pd_video_profile = pdd_->set_of_device_video_profiles_.find(video_profile);
                if (pd_video_profile != pdd_->set_of_device_video_profiles_.end()) {
                    // We update and not copy the capabilities object here because the supported API version and
                    // extensions may be different between the physical device and the simulated device so
                    // the list of structures supported and available in the pNext chain may also be different
                    video_profile.caps.UpdateFrom(pd_video_profile->caps);
                    supported = true;
                }

                if (layer_settings.simulate.capabilities & SIMULATE_VIDEO_CAPABILITIES_BIT) {
                    // Find matching video profiles defined in the profile and aggregate their video capabilities
                    bool found_matching = false;
                    bool found_matching_completely_defined = false;
                    JsonVideoProfileCaps merged_caps{};
                    for_each_matching_video_profile(video_profile.info, [&](const JsonVideoProfileData &json_video_profile) {
                        found_matching = true;
                        if (!found_matching_completely_defined &&
                            json_video_profile.info.IsComplete(video_profile.info)) {
                            found_matching_completely_defined = true;
                        }

                        bool success = merged_caps.Combine(&layer_settings, json_video_profile.caps);
                        if (!success) {
                            LogMessage(&layer_settings, DEBUG_REPORT_ERROR_BIT,
                                       "Failed to merge video capabilities for video profile '%s'\n", name);
                            failed = true;
                        }
                    });

                    if (found_matching) {
                        bool supported_by_device = supported;
                        if (!supported_by_device && found_matching_completely_defined) {
                            LogMessage(&layer_settings, DEBUG_REPORT_WARNING_BIT,
                                       "Simulating video profile '%s' that is not supported by the device\n", name);
                            supported = true;
                        }

                        if (supported) {
                            // Replace video capabilities with the values defined in the profile
                            if (supported_by_device) {
                                if (!merged_caps.Override(&layer_settings, video_profile.caps, name, enable_warnings)) {
                                    failed = true;
                                }
                            } else {
                                merged_caps.CopyTo(video_profile.caps);
                            }

                            // Special case: if neither distinct nor coincide output is supported by a decode profile
                            // then enable distinct by default
                            const VkVideoDecodeCapabilityFlagsKHR output_mode_flags = VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR |
                                                                                    VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR;
                            if ((video_profile.caps.video_decode_capabilities_.flags & output_mode_flags) == 0) {
                                video_profile.caps.video_decode_capabilities_.flags |= VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR;
                            }

                            // Make sure the video profile will be inserted
                            insert_video_profile_data = true;
                        }
                    } else {
                        supported = false;
                    }
                }

                if (layer_settings.simulate.capabilities & SIMULATE_VIDEO_FORMATS_BIT && supported) {
                    // Go through each video format category supported by the video profile
                    for (const auto usage : video_profile.GetSupportedFormatCategories()) {
                        std::vector<VideoFormatPropertiesChain> formats{};
                        SetOfVideoProfileFormats device_formats{};

                        // The initial set of formats is taken from the physical device supported ones, if there are any,
                        // and they match any of the profile defined ones
                        if (pd_video_profile != pdd_->set_of_device_video_profiles_.end()) {
                            auto pd_video_formats = pd_video_profile->formats.find(usage);
                            if (pd_video_formats != pd_video_profile->formats.end()) {
                                for (const auto &pd_video_format : pd_video_formats->second) {
                                    bool found_matching = false;
                                    for_each_matching_video_profile_format(video_profile.info, [&](const JsonVideoProfileFormat &json_video_format) {
                                        if (json_video_format.IsMatchingUsage(usage) &&
                                            json_video_format.IsMatching(pd_video_format)) {
                                            found_matching = true;
                                        }
                                    });
                                    if (found_matching) {
                                        // We create and update a new format object here because the supported API version and
                                        // extensions may be different between the physical device and the simulated device so
                                        // the list of structures supported and available in the pNext chain may also be different
                                        VideoFormatPropertiesChain format(info.videoCodecOperation, usage, check_api_version, check_extension);
                                        format.UpdateFrom(pd_video_format);
                                        formats.push_back(format);
                                        device_formats.insert(format);
                                    }
                                }
                            }
                        }

                        // Then, additional formats are added that are fully defined in the profile and do not match
                        // any of the existing ones already included
                        for_each_matching_video_profile_format(video_profile.info, [&](const JsonVideoProfileFormat &json_video_format) {
                            if (!json_video_format.IsMatchingUsage(usage)) return;

                            bool found_matching = false;
                            for (const auto &format : formats) {
                                if (json_video_format.IsMatching(format)) {
                                    found_matching = true;
                                    break;
                                }
                            }
                            if (!found_matching) {
                                VideoFormatPropertiesChain format(info.videoCodecOperation, usage, check_api_version, check_extension);
                                if (json_video_format.IsComplete(format)) {
                                    json_video_format.CopyTo(format);
                                    LogMessage(&layer_settings, DEBUG_REPORT_WARNING_BIT,
                                               "Simulating video format %s for video profile '%s' that is not supported by the device\n",
                                               vkFormatToString(format.video_format_properties_.format).c_str(), name);
                                    formats.push_back(format);
                                }
                            }
                        });

                        // Now it is time to find all matching video formats defined in the profile and aggregate their properties
                        for (auto &format : formats) {
                            JsonVideoProfileFormat merged_props{};
                            for_each_matching_video_profile_format(video_profile.info, [&](const JsonVideoProfileFormat &json_video_format) {
                                if (json_video_format.IsMatchingUsage(usage) &&
                                    json_video_format.IsMatching(format)) {
                                    bool success = merged_props.Combine(&layer_settings, json_video_format);
                                    if (!success) {
                                        LogMessage(&layer_settings, DEBUG_REPORT_ERROR_BIT,
                                                   "Failed to merge video format %s data for video profile '%s'\n",
                                                   vkFormatToString(format.video_format_properties_.format).c_str(), name);
                                        failed = true;
                                    }
                                }
                            });
                            // Replace video format properties with the values defined in the profile
                            // Only enable warnings if we're replacing the properties of a device supported video format
                            if (device_formats.find(format) != device_formats.end()) {
                                if (!merged_props.Override(&layer_settings, format, name, enable_warnings)) {
                                    failed = true;
                                }
                            } else {
                                merged_props.Override(&layer_settings, format, name, false);
                            }

                            // Make sure that usage is kept even if the profile data did not explicitly include it
                            format.video_format_properties_.imageUsageFlags |= usage;
                        }

                        // Special case: if coincide decode output mode is supported, then we need to have at least one
                        // format that supports both decode output and decode DPB usage, so if no such format is found
                        // then replace coincide decode output mode with distinct
                        // if necessary
                        if (video_profile.caps.video_decode_capabilities_.flags & VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR) {
                            const VkImageUsageFlags coincide_usage = VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR;
                            bool found_coincide_format = false;
                            for (const auto &format : formats) {
                                if ((format.video_format_properties_.imageUsageFlags & coincide_usage) == coincide_usage) {
                                    found_coincide_format = true;
                                    break;
                                }
                            }
                            if (!found_coincide_format) {
                                video_profile.caps.video_decode_capabilities_.flags ^= VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR;
                                video_profile.caps.video_decode_capabilities_.flags |= VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR;
                            }
                        }

                        // Store the formats and make sure the video profile will be inserted
                        for (const auto &format : formats) {
                            video_profile.formats[usage].insert(format);
                        }
                        insert_video_profile_data = true;
                    }
                }

                // Insert the video profile data if any profile simulated video capability or video format indicates so
                if (insert_video_profile_data) {
                    pdd_->set_of_video_profiles_.insert(video_profile);
                }
            });
        }
    }

    if (requested_profile) {
        if (properties_api_version != 0) {
            LogMessage(&layer_settings, DEBUG_REPORT_NOTIFICATION_BIT,
                "- VkPhysicalDeviceProperties API version: %" PRIu32 ".%" PRIu32 ".%" PRIu32 ". Using the API version specified by the profile VkPhysicalDeviceProperties structure.\n",
                VK_API_VERSION_MAJOR(properties_api_version), VK_API_VERSION_MINOR(properties_api_version), VK_API_VERSION_PATCH(properties_api_version));
        } else if (layer_settings.simulate.capabilities & SIMULATE_API_VERSION_BIT) {
            LogMessage(&layer_settings, DEBUG_REPORT_NOTIFICATION_BIT,
                "- VkPhysicalDeviceProperties API version: %" PRIu32 ".%" PRIu32 ".%" PRIu32". Using the API version specified by the profile.\n",
                VK_API_VERSION_MAJOR(this->profile_api_version_), VK_API_VERSION_MINOR(this->profile_api_version_), VK_API_VERSION_PATCH(this->profile_api_version_));

            pdd_->physical_device_properties_.apiVersion = this->profile_api_version_;
        } else {
            LogMessage(&layer_settings, DEBUG_REPORT_NOTIFICATION_BIT,
                "- VkPhysicalDeviceProperties API version: %" PRIu32 ".%" PRIu32 ".%" PRIu32 ". Using the device version.\n",
                    VK_API_VERSION_MAJOR(pdd_->physical_device_properties_.apiVersion),
                    VK_API_VERSION_MINOR(pdd_->physical_device_properties_.apiVersion),
                    VK_API_VERSION_PATCH(pdd_->physical_device_properties_.apiVersion));
        }
    }

    if (failed && layer_settings.log.debug_fail_on_error) {
        return VK_ERROR_INITIALIZATION_FAILED;
    }

    return VK_SUCCESS;
}

VkResult JsonLoader::LoadFile(const std::string& filename) {
    if (filename.empty()) {
        return VK_SUCCESS;
    }
    std::ifstream json_file(filename);
    if (!json_file) {
        LogMessage(&layer_settings, DEBUG_REPORT_ERROR_BIT, "Fail to open file \"%s\"\n", filename.c_str());
        return VK_SUCCESS;
    }

    Json::Value root = Json::nullValue;
    Json::CharReaderBuilder builder;
    std::string errs;
    bool success = Json::parseFromStream(builder, json_file, &root, &errs);
    if (!success) {
        LogMessage(&layer_settings, DEBUG_REPORT_ERROR_BIT, "Fail to parse file \"%s\" {\n%s}\n", filename.c_str(), errs.c_str());
        return VK_SUCCESS;
    }
    json_file.close();

    if (root.type() != Json::objectValue) {
        LogMessage(&layer_settings, DEBUG_REPORT_ERROR_BIT, "Json document root is not an object in file \"%s\"\n", filename.c_str());
        return VK_SUCCESS;
    }

    const Json::Value& schema_node = root["$schema"];
    if (schema_node == Json::Value::nullSingleton()) {
        return VK_SUCCESS;
    }

    const std::string &schema = schema_node.asCString();
    if (schema.find("https://schema.khronos.org/vulkan/profiles") == std::string::npos) {
        return VK_SUCCESS;
    }

    LogMessage(&layer_settings, DEBUG_REPORT_NOTIFICATION_BIT, "Loading \"%s\"\n", filename.c_str());

    if (layer_settings.simulate.profile_validation) {
        JsonValidator validator;
        if (!validator.Init()) {
            LogMessage(&layer_settings, DEBUG_REPORT_WARNING_BIT,
                "%s could not find the profile schema file to validate filename. This operation requires the Vulkan SDK to be installed. Skipping profile file validation.\n",
                kLayerName, filename.c_str());
        } else if (!validator.Check(root)) {
            LogMessage(&layer_settings, DEBUG_REPORT_ERROR_BIT,
                "%s is not a valid JSON profile file.\n", filename.c_str());
            if (layer_settings.log.debug_fail_on_error) {
                return VK_ERROR_INITIALIZATION_FAILED;
            } else {
                return VK_SUCCESS;
            }
        }
    }

    this->profiles_file_roots_.insert(std::pair(filename, root));

    return VK_SUCCESS;
}

VkResult JsonLoader::LoadProfilesDatabase() {
    if (!layer_settings.simulate.profile_file.empty()) {
        VkResult result = this->LoadFile(layer_settings.simulate.profile_file);
        if (result != VK_SUCCESS) {
            return result;
        }
    }

    for (std::size_t i = 0, n = layer_settings.simulate.profile_dirs.size(); i < n; ++i) {
        const std::string& path = layer_settings.simulate.profile_dirs[i];

        if (fs::is_regular_file(path)) {
            this->LoadFile(path);
            continue;
        }

        for (const auto& entry : fs::directory_iterator(path)) {
            if (fs::is_directory(entry.path())) {
                continue;
            }

            const std::string& file_path = entry.path().generic_string();
            if (!EndsWith(file_path, ".json")) {
                continue;
            }

            VkResult result = this->LoadFile(file_path);
            if (result != VK_SUCCESS) {
                continue;
            }
        }
    }

    LogFoundProfiles();

    ReadProfileApiVersion();

    return VK_SUCCESS;
}

void JsonLoader::LogFoundProfiles() {
    for (const auto& root : this->profiles_file_roots_) {
        LogMessage(&layer_settings, DEBUG_REPORT_NOTIFICATION_BIT, "Profiles found in '%s' file:\n", root.first.c_str());

        const Json::Value &profiles = root.second["profiles"];

        for (const std::string &profile : profiles.getMemberNames()) {
            LogMessage(&layer_settings, DEBUG_REPORT_NOTIFICATION_BIT, "- %s\n", profile.c_str());
        }
    }
}

const Json::Value& JsonLoader::FindRootFromProfileName(const std::string& profile_name) const {
    for (const auto& root : this->profiles_file_roots_) {
        const Json::Value &profiles = root.second["profiles"];

        for (const auto &profile : profiles.getMemberNames()) {
            if (profile_name.empty() || profile_name == "${VP_DEFAULT}" || profile == profile_name) {
                return root.second;
            }
        }
    }

    return Json::Value::nullSingleton();
}

void JsonLoader::ReadProfileApiVersion() {
    const std::string &profile_name = layer_settings.simulate.profile_name;
    const Json::Value &profiles = FindRootFromProfileName(profile_name)["profiles"];
    bool found_profile = false;
    for (const auto &profile : profiles.getMemberNames()) {
        if (profile_name.empty() || profile_name == "${VP_DEFAULT}" || profile == profile_name) {
            const std::string version_string = profiles[profile]["api-version"].asCString();

            uint32_t api_major = 0;
            uint32_t api_minor = 0;
            uint32_t api_patch = 0;
            std::sscanf(version_string.c_str(), "%u.%u.%u", &api_major, &api_minor, &api_patch);
            profile_api_version_ = VK_MAKE_API_VERSION(0, api_major, api_minor, api_patch);
            found_profile = true;
            break;
        }
    }
    if (!found_profile && profiles) {
        // Systematically load the first and default profile when the profile is not found
        const auto profile = profiles.getMemberNames()[0];
        const std::string version_string = profiles[profile]["api-version"].asCString();

        uint32_t api_major = 0;
        uint32_t api_minor = 0;
        uint32_t api_patch = 0;
        std::sscanf(version_string.c_str(), "%u.%u.%u", &api_major, &api_minor, &api_patch);
        profile_api_version_ = VK_MAKE_API_VERSION(0, api_major, api_minor, api_patch);
    }

    for (const auto& extension : layer_settings.simulate.exclude_device_extensions) {
        if (extension.empty()) continue;
        excluded_extensions_.push_back(extension);
    }
    for (const auto& format : layer_settings.simulate.exclude_formats) {
        if (format.empty()) continue;
        excluded_formats_.push_back(format);
    }
}

void JsonLoader::CollectProfiles(const std::string& profile_name, std::vector<std::string>& results) const {
    const auto &root = FindRootFromProfileName(profile_name);

    if (root != Json::Value::nullSingleton()) {
        const Json::Value &profiles = root["profiles"];
        std::vector<std::vector<std::string>> capabilities;

        for (const auto &profile : profiles.getMemberNames()) {
            if (profile == profile_name) {
                const auto &required_profiles = profiles[profile]["profiles"];

                for (const auto &required_profile : required_profiles) {
                    this->CollectProfiles(required_profile.asString().c_str(), results);
                }

                break;  // load a single profile
            }
        }
    }

    results.push_back(profile_name);
}

VkResult JsonLoader::LoadDevice(const char* device_name, PhysicalDeviceData *pdd) {
    pdd_ = pdd;

    const std::string &requested_profile_name = layer_settings.simulate.profile_name;

    if (this->profiles_file_roots_.empty() && (requested_profile_name.empty() || requested_profile_name == "${VP_DEFAULT}")) {
        return VK_SUCCESS;
    }

    VkResult result = VK_SUCCESS;

    std::vector<std::string> required_profiles;
    CollectProfiles(requested_profile_name, required_profiles);

    for (const std::string& profile_name : required_profiles) {
        const auto& root = FindRootFromProfileName(profile_name);

        if (root == Json::Value::nullSingleton()) {
            if (requested_profile_name == profile_name) {
                LogMessage(&layer_settings, DEBUG_REPORT_ERROR_BIT, "- '%s' profile not found.\n", profile_name.c_str());
            } else {
                LogMessage(&layer_settings, DEBUG_REPORT_ERROR_BIT, "- '%s' profile required by '%s' not found.\n", profile_name.c_str(), requested_profile_name.c_str());
            }

            result = VK_ERROR_UNKNOWN;
        } else {
            if (requested_profile_name == profile_name) {
                LogMessage(&layer_settings, DEBUG_REPORT_NOTIFICATION_BIT, "- Overriding device capabilities with the '%s' profile capabilities.\n", profile_name.c_str());
            } else {
                LogMessage(&layer_settings, DEBUG_REPORT_NOTIFICATION_BIT, "- Overriding device capabilities with the '%s' profile capabilities required by the requested '%s' profile.\n", profile_name.c_str(), requested_profile_name.c_str());
            }

            const Json::Value &profiles = root["profiles"];
            std::vector<std::vector<std::string>> capabilities;

            bool found_profile = false;
            for (const auto &profile : profiles.getMemberNames()) {
                if (profile_name.empty() || profile_name == "${VP_DEFAULT}" || profile == profile_name) {
                    const auto &caps = profiles[profile]["capabilities"];

                    for (const auto &cap : caps) {
                        std::vector<std::string> cap_variants;
                        if (cap.isArray()) {
                            for (const auto &cap_variant : cap) {
                                cap_variants.push_back(cap_variant.asString());
                            }
                        } else {
                            cap_variants.push_back(cap.asString());
                        }
                        capabilities.push_back(cap_variants);
                    }

                    found_profile = true;
                    break;  // load a single profile
                }
            }
            if (!found_profile && profiles) {
                // Systematically load the first and default profile
                const auto profile = profiles.getMemberNames()[0];
                const auto &caps = profiles[profile]["capabilities"];

                for (const auto &cap : caps) {
                    std::vector<std::string> cap_variants;
                    if (cap.isArray()) {
                        for (const auto &cap_variant : cap) {
                            cap_variants.push_back(cap_variant.asString());
                        }
                    } else {
                        cap_variants.push_back(cap.asString());
                    }
                    capabilities.push_back(cap_variants);
                }
            }

            if (capabilities.empty()) {
                return VK_SUCCESS;
            }

            const Json::Value schema_value = root["$schema"];
            if (!schema_value.isString()) {
                LogMessage(&layer_settings, DEBUG_REPORT_ERROR_BIT, "JSON element \"$schema\" is not a string\n");
                return layer_settings.log.debug_fail_on_error ? VK_ERROR_INITIALIZATION_FAILED : VK_SUCCESS;
            }

            const std::string schema = schema_value.asCString();
            if (schema.find(SCHEMA_URI_BASE) == std::string::npos) {
                LogMessage(&layer_settings, DEBUG_REPORT_ERROR_BIT, "Document schema \"%s\" not supported by %s\n", schema.c_str(), kLayerName);
                return layer_settings.log.debug_fail_on_error ? VK_ERROR_INITIALIZATION_FAILED : VK_SUCCESS;
            }

            const std::size_t size_schema = schema.size();
            const std::size_t size_base = std::strlen(SCHEMA_URI_BASE);
            const std::size_t size_version = std::strlen(".json#");
            const std::string version = schema.substr(size_base, size_schema - size_base - size_version);

            uint32_t version_major = 0;
            uint32_t version_minor = 0;
            uint32_t version_patch = 0;
            std::sscanf(version.c_str(), "%u.%u.%u", &version_major, &version_minor, &version_patch);
            if (VK_HEADER_VERSION < version_patch) {
                LogMessage(&layer_settings, DEBUG_REPORT_WARNING_BIT,
                    "%s is built against Vulkan Header %d but the profile is written against Vulkan Header %d.\n\t- All newer capabilities in the profile will be ignored by the layer.\n",
                    kLayerName, VK_HEADER_VERSION, version_patch);
            }

            VkResult tmp_result = VK_SUCCESS;
            if (layer_settings.simulate.capabilities & SIMULATE_EXTENSIONS_BIT) {
                pdd_->simulation_extensions_.clear();
            }

            tmp_result = ReadProfile(device_name, root, capabilities, requested_profile_name == profile_name, required_profiles.size() == 1);
            if (tmp_result != VK_SUCCESS) {
                result = tmp_result;
            }
        }

        if (result != VK_SUCCESS) {
            break;
        }
    }

    return result;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSubgroupProperties *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceSubgroupProperties)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, subgroupSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_FLAG_WARN(member, supportedStages, false, requested_profile);
        GET_VALUE_FLAG_WARN(member, supportedOperations, false, requested_profile);
        GET_VALUE_WARN(member, quadOperationsInAllStages, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceProtectedMemoryProperties *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceProtectedMemoryProperties)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, protectedNoFault, true, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVulkan11Properties *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVulkan11Properties)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GetArray(device_name, parent, member, "deviceUUID", dest->deviceUUID, true);
        GetArray(device_name, parent, member, "driverUUID", dest->driverUUID, true);
        GetArray(device_name, parent, member, "deviceLUID", dest->deviceLUID, true);
        GET_VALUE_WARN(member, deviceNodeMask, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, deviceLUIDValid, true, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, subgroupSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_FLAG_WARN(member, subgroupSupportedStages, false, requested_profile);
        GET_VALUE_FLAG_WARN(member, subgroupSupportedOperations, false, requested_profile);
        GET_VALUE_WARN(member, subgroupQuadOperationsInAllStages, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_ENUM_WARN(member, pointClippingBehavior, true, requested_profile, WarnIfNotEqualEnum);
        GET_VALUE_WARN(member, maxMultiviewViewCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxMultiviewInstanceIndex, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, protectedNoFault, true, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, maxPerSetDescriptors, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxMemoryAllocationSize, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVulkan12Properties *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVulkan12Properties)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_ENUM_WARN(member, driverID, true, requested_profile, WarnIfNotEqualEnum);
        GetArray(device_name, parent, member, "driverName", dest->driverName, true);
        GetArray(device_name, parent, member, "driverInfo", dest->driverInfo, true);
        GET_VALUE_ENUM_WARN(member, denormBehaviorIndependence, true, requested_profile, WarnIfNotEqualEnum);
        GET_VALUE_ENUM_WARN(member, roundingModeIndependence, true, requested_profile, WarnIfNotEqualEnum);
        GET_VALUE_WARN(member, shaderSignedZeroInfNanPreserveFloat16, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSignedZeroInfNanPreserveFloat32, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSignedZeroInfNanPreserveFloat64, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderDenormPreserveFloat16, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderDenormPreserveFloat32, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderDenormPreserveFloat64, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderDenormFlushToZeroFloat16, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderDenormFlushToZeroFloat32, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderDenormFlushToZeroFloat64, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderRoundingModeRTEFloat16, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderRoundingModeRTEFloat32, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderRoundingModeRTEFloat64, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderRoundingModeRTZFloat16, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderRoundingModeRTZFloat32, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderRoundingModeRTZFloat64, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, maxUpdateAfterBindDescriptorsInAllPools, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, shaderUniformBufferArrayNonUniformIndexingNative, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSampledImageArrayNonUniformIndexingNative, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderStorageBufferArrayNonUniformIndexingNative, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderStorageImageArrayNonUniformIndexingNative, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderInputAttachmentArrayNonUniformIndexingNative, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, robustBufferAccessUpdateAfterBind, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, quadDivergentImplicitLod, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, maxPerStageDescriptorUpdateAfterBindSamplers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorUpdateAfterBindUniformBuffers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorUpdateAfterBindStorageBuffers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorUpdateAfterBindSampledImages, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorUpdateAfterBindStorageImages, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorUpdateAfterBindInputAttachments, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageUpdateAfterBindResources, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindSamplers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindUniformBuffers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindUniformBuffersDynamic, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindStorageBuffers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindStorageBuffersDynamic, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindSampledImages, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindStorageImages, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindInputAttachments, false, requested_profile, WarnIfGreater);
        GET_VALUE_FLAG_WARN(member, supportedDepthResolveModes, false, requested_profile);
        GET_VALUE_FLAG_WARN(member, supportedStencilResolveModes, false, requested_profile);
        GET_VALUE_WARN(member, independentResolveNone, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, independentResolve, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, filterMinmaxSingleComponentFormats, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, filterMinmaxImageComponentMapping, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, maxTimelineSemaphoreValueDifference, false, requested_profile, WarnIfGreater);
        GET_VALUE_FLAG_WARN(member, framebufferIntegerColorSampleCounts, false, requested_profile);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVulkan13Properties *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVulkan13Properties)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, minSubgroupSize, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, maxSubgroupSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxComputeWorkgroupSubgroups, false, requested_profile, WarnIfGreater);
        GET_VALUE_FLAG_WARN(member, requiredSubgroupSizeStages, false, requested_profile);
        GET_VALUE_WARN(member, maxInlineUniformBlockSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorInlineUniformBlocks, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetInlineUniformBlocks, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindInlineUniformBlocks, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxInlineUniformTotalSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, integerDotProduct8BitUnsignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct8BitSignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct8BitMixedSignednessAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct4x8BitPackedUnsignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct4x8BitPackedSignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct4x8BitPackedMixedSignednessAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct16BitUnsignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct16BitSignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct16BitMixedSignednessAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct32BitUnsignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct32BitSignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct32BitMixedSignednessAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct64BitUnsignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct64BitSignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct64BitMixedSignednessAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating8BitUnsignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating8BitSignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating16BitUnsignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating16BitSignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating32BitUnsignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating32BitSignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating64BitUnsignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating64BitSignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, storageTexelBufferOffsetAlignmentBytes, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, storageTexelBufferOffsetSingleTexelAlignment, true, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, uniformTexelBufferOffsetAlignmentBytes, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, uniformTexelBufferOffsetSingleTexelAlignment, true, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, maxBufferSize, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVulkan14Properties *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVulkan14Properties)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, lineSubPixelPrecisionBits, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxVertexAttribDivisor, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, supportsNonZeroFirstInstance, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, maxPushDescriptors, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, dynamicRenderingLocalReadDepthStencilAttachments, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, dynamicRenderingLocalReadMultisampledAttachments, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, earlyFragmentMultisampleCoverageAfterSampleCounting, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, earlyFragmentSampleMaskTestBeforeSampleCounting, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, depthStencilSwizzleOneSupport, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, polygonModePointSize, true, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, nonStrictSinglePixelWideLinesUseParallelogram, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, nonStrictWideLinesUseParallelogram, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, blockTexelViewCompatibleMultipleLayers, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, maxCombinedImageSamplerDescriptorCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, fragmentShadingRateClampCombinerInputs, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_ENUM_WARN(member, defaultRobustnessStorageBuffers, true, requested_profile, WarnIfNotEqualEnum);
        GET_VALUE_ENUM_WARN(member, defaultRobustnessUniformBuffers, true, requested_profile, WarnIfNotEqualEnum);
        GET_VALUE_ENUM_WARN(member, defaultRobustnessVertexInputs, true, requested_profile, WarnIfNotEqualEnum);
        GET_VALUE_ENUM_WARN(member, defaultRobustnessImages, true, requested_profile, WarnIfNotEqualEnum);
        GET_VALUE_WARN(member, copySrcLayoutCount, true, requested_profile, WarnIfNotEqual32u);
        GetArray(device_name, parent, member, "pCopySrcLayouts", dest->pCopySrcLayouts, &dest->copySrcLayoutCount, false);
        GET_VALUE_WARN(member, copyDstLayoutCount, true, requested_profile, WarnIfNotEqual32u);
        GetArray(device_name, parent, member, "pCopyDstLayouts", dest->pCopyDstLayouts, &dest->copyDstLayoutCount, false);
        GetArray(device_name, parent, member, "optimalTilingLayoutUUID", dest->optimalTilingLayoutUUID, true);
        GET_VALUE_WARN(member, identicalMemoryTypeRequirements, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceProtectedMemoryFeatures *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceProtectedMemoryFeatures)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, protectedMemory, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderDrawParameterFeatures *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderDrawParameterFeatures)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderDrawParameters, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVulkan11Features *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVulkan11Features)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, storageBuffer16BitAccess, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, uniformAndStorageBuffer16BitAccess, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, storagePushConstant16, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, storageInputOutput16, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, multiview, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, multiviewGeometryShader, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, multiviewTessellationShader, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, variablePointersStorageBuffer, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, variablePointers, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, protectedMemory, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, samplerYcbcrConversion, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderDrawParameters, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVulkan12Features *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVulkan12Features)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, samplerMirrorClampToEdge, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, drawIndirectCount, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, storageBuffer8BitAccess, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, uniformAndStorageBuffer8BitAccess, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, storagePushConstant8, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderBufferInt64Atomics, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSharedInt64Atomics, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderFloat16, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderInt8, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderInputAttachmentArrayDynamicIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderUniformTexelBufferArrayDynamicIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderStorageTexelBufferArrayDynamicIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderUniformBufferArrayNonUniformIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSampledImageArrayNonUniformIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderStorageBufferArrayNonUniformIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderStorageImageArrayNonUniformIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderInputAttachmentArrayNonUniformIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderUniformTexelBufferArrayNonUniformIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderStorageTexelBufferArrayNonUniformIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingUniformBufferUpdateAfterBind, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingSampledImageUpdateAfterBind, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingStorageImageUpdateAfterBind, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingStorageBufferUpdateAfterBind, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingUniformTexelBufferUpdateAfterBind, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingStorageTexelBufferUpdateAfterBind, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingUpdateUnusedWhilePending, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingPartiallyBound, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingVariableDescriptorCount, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, runtimeDescriptorArray, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, samplerFilterMinmax, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, scalarBlockLayout, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, imagelessFramebuffer, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, uniformBufferStandardLayout, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSubgroupExtendedTypes, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, separateDepthStencilLayouts, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, hostQueryReset, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, timelineSemaphore, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, bufferDeviceAddress, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, bufferDeviceAddressCaptureReplay, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, bufferDeviceAddressMultiDevice, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, vulkanMemoryModel, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, vulkanMemoryModelDeviceScope, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, vulkanMemoryModelAvailabilityVisibilityChains, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderOutputViewportIndex, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderOutputLayer, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, subgroupBroadcastDynamicId, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVulkan13Features *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVulkan13Features)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, robustImageAccess, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, inlineUniformBlock, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingInlineUniformBlockUpdateAfterBind, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, pipelineCreationCacheControl, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, privateData, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderDemoteToHelperInvocation, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderTerminateInvocation, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, subgroupSizeControl, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, computeFullSubgroups, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, synchronization2, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, textureCompressionASTC_HDR, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderZeroInitializeWorkgroupMemory, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, dynamicRendering, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderIntegerDotProduct, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, maintenance4, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVulkan14Features *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVulkan14Features)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, globalPriorityQuery, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSubgroupRotate, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSubgroupRotateClustered, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderFloatControls2, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderExpectAssume, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, rectangularLines, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, bresenhamLines, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, smoothLines, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, stippledRectangularLines, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, stippledBresenhamLines, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, stippledSmoothLines, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, vertexAttributeInstanceRateDivisor, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, vertexAttributeInstanceRateZeroDivisor, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, indexTypeUint8, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, dynamicRenderingLocalRead, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, maintenance5, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, maintenance6, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, pipelineProtectedAccess, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, pipelineRobustness, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, hostImageCopy, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, pushDescriptor, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTransformFeedbackPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceTransformFeedbackPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxTransformFeedbackStreams, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTransformFeedbackBuffers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTransformFeedbackBufferSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTransformFeedbackStreamDataSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTransformFeedbackBufferDataSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTransformFeedbackBufferDataStride, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, transformFeedbackQueries, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, transformFeedbackStreamsLinesTriangles, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, transformFeedbackRasterizationStreamSelect, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, transformFeedbackDraw, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTransformFeedbackFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceTransformFeedbackFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, transformFeedback, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, geometryStreams, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDynamicRenderingFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDynamicRenderingFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, dynamicRendering, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCornerSampledImageFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCornerSampledImageFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, cornerSampledImage, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMultiviewPropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMultiviewPropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxMultiviewViewCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxMultiviewInstanceIndex, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMultiviewFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMultiviewFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, multiview, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, multiviewGeometryShader, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, multiviewTessellationShader, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, textureCompressionASTC_HDR, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceASTCDecodeFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceASTCDecodeFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, decodeModeSharedExponent, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelineRobustnessPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePipelineRobustnessPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_ENUM_WARN(member, defaultRobustnessStorageBuffers, true, requested_profile, WarnIfNotEqualEnum);
        GET_VALUE_ENUM_WARN(member, defaultRobustnessUniformBuffers, true, requested_profile, WarnIfNotEqualEnum);
        GET_VALUE_ENUM_WARN(member, defaultRobustnessVertexInputs, true, requested_profile, WarnIfNotEqualEnum);
        GET_VALUE_ENUM_WARN(member, defaultRobustnessImages, true, requested_profile, WarnIfNotEqualEnum);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelineRobustnessFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePipelineRobustnessFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, pipelineRobustness, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceIDPropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceIDPropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GetArray(device_name, parent, member, "deviceUUID", dest->deviceUUID, true);
        GetArray(device_name, parent, member, "driverUUID", dest->driverUUID, true);
        GetArray(device_name, parent, member, "deviceLUID", dest->deviceLUID, false);
        GET_VALUE_WARN(member, deviceNodeMask, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, deviceLUIDValid, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePushDescriptorPropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePushDescriptorPropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxPushDescriptors, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceConditionalRenderingFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceConditionalRenderingFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, conditionalRendering, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, inheritedConditionalRendering, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFloat16Int8FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFloat16Int8FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderFloat16, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderInt8, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevice16BitStorageFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevice16BitStorageFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, storageBuffer16BitAccess, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, uniformAndStorageBuffer16BitAccess, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, storagePushConstant16, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, storageInputOutput16, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, perViewPositionAllComponents, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDiscardRectanglePropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDiscardRectanglePropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxDiscardRectangles, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceConservativeRasterizationPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceConservativeRasterizationPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, primitiveOverestimationSize, true, requested_profile, WarnIfNotEqualFloat);
        GET_VALUE_WARN(member, maxExtraPrimitiveOverestimationSize, false, requested_profile, WarnIfGreaterFloat);
        GET_VALUE_WARN(member, extraPrimitiveOverestimationSizeGranularity, false, requested_profile, WarnIfLesserFloat);
        GET_VALUE_WARN(member, primitiveUnderestimation, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, conservativePointAndLineRasterization, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, degenerateTrianglesRasterized, true, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, degenerateLinesRasterized, true, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, fullyCoveredFragmentShaderInputVariable, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, conservativeRasterizationPostDepthCoverage, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDepthClipEnableFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDepthClipEnableFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, depthClipEnable, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImagelessFramebufferFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceImagelessFramebufferFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, imagelessFramebuffer, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, relaxedLineRasterization, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePerformanceQueryPropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePerformanceQueryPropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, allowCommandBufferQueryCopies, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePerformanceQueryFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePerformanceQueryFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, performanceCounterQueryPools, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, performanceCounterMultipleQueryPools, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePointClippingPropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePointClippingPropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_ENUM_WARN(member, pointClippingBehavior, true, requested_profile, WarnIfNotEqualEnum);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVariablePointerFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVariablePointerFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, variablePointersStorageBuffer, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, variablePointers, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, filterMinmaxSingleComponentFormats, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, filterMinmaxImageComponentMapping, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceGpaProperties2AMD *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceGpaProperties2AMD)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, revisionId, true, requested_profile, WarnIfNotEqual32u);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceGpaFeaturesAMD *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceGpaFeaturesAMD)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, perfCounters, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, streamingPerfCounters, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, sqThreadTracing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, clockModes, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

#ifdef VK_ENABLE_BETA_EXTENSIONS
bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderEnqueuePropertiesAMDX *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderEnqueuePropertiesAMDX)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxExecutionGraphDepth, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxExecutionGraphShaderOutputNodes, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxExecutionGraphShaderPayloadSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxExecutionGraphShaderPayloadCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, executionGraphDispatchAddressAlignment, true, requested_profile, WarnIfNotEqual32u);
        GetArray(device_name, parent, member, "maxExecutionGraphWorkgroupCount", dest->maxExecutionGraphWorkgroupCount, false);
        GET_VALUE_WARN(member, maxExecutionGraphWorkgroups, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

#endif // VK_ENABLE_BETA_EXTENSIONS
#ifdef VK_ENABLE_BETA_EXTENSIONS
bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderEnqueueFeaturesAMDX *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderEnqueueFeaturesAMDX)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderEnqueue, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderMeshEnqueue, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

#endif // VK_ENABLE_BETA_EXTENSIONS
bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorHeapPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDescriptorHeapPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, samplerHeapAlignment, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, resourceHeapAlignment, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxSamplerHeapSize, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, maxResourceHeapSize, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, minSamplerHeapReservedRange, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, minSamplerHeapReservedRangeWithEmbedded, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, minResourceHeapReservedRange, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, samplerDescriptorSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, imageDescriptorSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, bufferDescriptorSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, samplerDescriptorAlignment, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, imageDescriptorAlignment, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, bufferDescriptorAlignment, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPushDataSize, false, requested_profile, WarnIfLesser);
        GET_VALUE_SIZE_T_WARN(member, imageCaptureReplayOpaqueDataSize, true, requested_profile, WarnIfNotEqualSizet);
        GET_VALUE_WARN(member, maxDescriptorHeapEmbeddedSamplers, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, samplerYcbcrConversionCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, sparseDescriptorHeaps, true, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, protectedDescriptorHeaps, true, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorHeapTensorPropertiesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDescriptorHeapTensorPropertiesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, tensorDescriptorSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, tensorDescriptorAlignment, false, requested_profile, WarnIfGreater);
        GET_VALUE_SIZE_T_WARN(member, tensorCaptureReplayOpaqueDataSize, true, requested_profile, WarnIfNotEqualSizet);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorHeapFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDescriptorHeapFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, descriptorHeap, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorHeapCaptureReplay, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceInlineUniformBlockPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceInlineUniformBlockPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxInlineUniformBlockSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorInlineUniformBlocks, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetInlineUniformBlocks, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindInlineUniformBlocks, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceInlineUniformBlockFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceInlineUniformBlockFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, inlineUniformBlock, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingInlineUniformBlockUpdateAfterBind, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderBfloat16FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderBfloat16FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderBFloat16Type, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderBFloat16DotProduct, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderBFloat16CooperativeMatrix, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSampleLocationsPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceSampleLocationsPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_FLAG_WARN(member, sampleLocationSampleCounts, false, requested_profile);
        GET_VALUE_WARN(member, maxSampleLocationGridSize, false, requested_profile, WarnIfGreater);
        GetArray(device_name, parent, member, "sampleLocationCoordinateRange", dest->sampleLocationCoordinateRange, false);
        GET_VALUE_WARN(member, sampleLocationSubPixelBits, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, variableSampleLocations, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, advancedBlendMaxColorAttachments, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, advancedBlendIndependentBlend, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, advancedBlendNonPremultipliedSrcColor, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, advancedBlendNonPremultipliedDstColor, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, advancedBlendCorrelatedOverlap, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, advancedBlendAllOperations, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, advancedBlendCoherentOperations, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceAccelerationStructurePropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceAccelerationStructurePropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxGeometryCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxInstanceCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPrimitiveCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorAccelerationStructures, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorUpdateAfterBindAccelerationStructures, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetAccelerationStructures, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindAccelerationStructures, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, minAccelerationStructureScratchOffsetAlignment, false, requested_profile, WarnIfLesser);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceAccelerationStructureFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceAccelerationStructureFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, accelerationStructure, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, accelerationStructureCaptureReplay, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, accelerationStructureIndirectBuild, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, accelerationStructureHostCommands, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingAccelerationStructureUpdateAfterBind, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingPipelinePropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRayTracingPipelinePropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderGroupHandleSize, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, maxRayRecursionDepth, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxShaderGroupStride, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, shaderGroupBaseAlignment, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, shaderGroupHandleCaptureReplaySize, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, maxRayDispatchInvocationCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, shaderGroupHandleAlignment, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, maxRayHitAttributeSize, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingPipelineFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRayTracingPipelineFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, rayTracingPipeline, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, rayTracingPipelineShaderGroupHandleCaptureReplay, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, rayTracingPipelineShaderGroupHandleCaptureReplayMixed, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, rayTracingPipelineTraceRaysIndirect, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, rayTraversalPrimitiveCulling, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayQueryFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRayQueryFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, rayQuery, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderSMBuiltinsPropertiesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderSMBuiltinsPropertiesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderSMCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, shaderWarpsPerSM, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderSMBuiltinsFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderSMBuiltinsFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderSMBuiltins, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, samplerYcbcrConversion, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorIndexingPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDescriptorIndexingPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxUpdateAfterBindDescriptorsInAllPools, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, shaderUniformBufferArrayNonUniformIndexingNative, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSampledImageArrayNonUniformIndexingNative, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderStorageBufferArrayNonUniformIndexingNative, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderStorageImageArrayNonUniformIndexingNative, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderInputAttachmentArrayNonUniformIndexingNative, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, robustBufferAccessUpdateAfterBind, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, quadDivergentImplicitLod, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, maxPerStageDescriptorUpdateAfterBindSamplers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorUpdateAfterBindUniformBuffers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorUpdateAfterBindStorageBuffers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorUpdateAfterBindSampledImages, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorUpdateAfterBindStorageImages, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorUpdateAfterBindInputAttachments, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageUpdateAfterBindResources, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindSamplers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindUniformBuffers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindUniformBuffersDynamic, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindStorageBuffers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindStorageBuffersDynamic, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindSampledImages, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindStorageImages, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindInputAttachments, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorIndexingFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDescriptorIndexingFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderInputAttachmentArrayDynamicIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderUniformTexelBufferArrayDynamicIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderStorageTexelBufferArrayDynamicIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderUniformBufferArrayNonUniformIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSampledImageArrayNonUniformIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderStorageBufferArrayNonUniformIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderStorageImageArrayNonUniformIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderInputAttachmentArrayNonUniformIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderUniformTexelBufferArrayNonUniformIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderStorageTexelBufferArrayNonUniformIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingUniformBufferUpdateAfterBind, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingSampledImageUpdateAfterBind, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingStorageImageUpdateAfterBind, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingStorageBufferUpdateAfterBind, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingUniformTexelBufferUpdateAfterBind, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingStorageTexelBufferUpdateAfterBind, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingUpdateUnusedWhilePending, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingPartiallyBound, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingVariableDescriptorCount, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, runtimeDescriptorArray, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShadingRateImagePropertiesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShadingRateImagePropertiesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shadingRateTexelSize, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, shadingRatePaletteSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, shadingRateMaxCoarseSamples, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShadingRateImageFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShadingRateImageFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shadingRateImage, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shadingRateCoarseSampleOrder, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingPropertiesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRayTracingPropertiesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderGroupHandleSize, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, maxRecursionDepth, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxShaderGroupStride, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, shaderGroupBaseAlignment, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, maxGeometryCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxInstanceCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTriangleCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetAccelerationStructures, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, representativeFragmentTest, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance3PropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMaintenance3PropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxPerSetDescriptors, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxMemoryAllocationSize, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCooperativeMatrixConversionFeaturesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCooperativeMatrixConversionFeaturesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, cooperativeMatrixConversion, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceElapsedTimerQueryFeaturesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceElapsedTimerQueryFeaturesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, elapsedTimerQuery, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderSubgroupExtendedTypes, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevice8BitStorageFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevice8BitStorageFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, storageBuffer8BitAccess, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, uniformAndStorageBuffer8BitAccess, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, storagePushConstant8, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExternalMemoryHostPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceExternalMemoryHostPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, minImportedHostPointerAlignment, false, requested_profile, WarnIfLesser);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderAtomicInt64FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderAtomicInt64FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderBufferInt64Atomics, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSharedInt64Atomics, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderClockFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderClockFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderSubgroupClock, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderDeviceClock, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderCorePropertiesAMD *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderCorePropertiesAMD)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderEngineCount, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, shaderArraysPerEngineCount, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, computeUnitsPerShaderArray, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, simdPerComputeUnit, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, wavefrontsPerSimd, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, wavefrontSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, sgprsPerSimd, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, minSgprAllocation, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, maxSgprAllocation, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, sgprAllocationGranularity, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, vgprsPerSimd, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, minVgprAllocation, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, maxVgprAllocation, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, vgprAllocationGranularity, false, requested_profile, WarnIfLesser);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxVertexAttribDivisor, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, vertexAttributeInstanceRateDivisor, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, vertexAttributeInstanceRateZeroDivisor, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDriverPropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDriverPropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_ENUM_WARN(member, driverID, true, requested_profile, WarnIfNotEqualEnum);
        GetArray(device_name, parent, member, "driverName", dest->driverName, true);
        GetArray(device_name, parent, member, "driverInfo", dest->driverInfo, true);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFloatControlsPropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFloatControlsPropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_ENUM_WARN(member, denormBehaviorIndependence, true, requested_profile, WarnIfNotEqualEnum);
        GET_VALUE_ENUM_WARN(member, roundingModeIndependence, true, requested_profile, WarnIfNotEqualEnum);
        GET_VALUE_WARN(member, shaderSignedZeroInfNanPreserveFloat16, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSignedZeroInfNanPreserveFloat32, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSignedZeroInfNanPreserveFloat64, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderDenormPreserveFloat16, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderDenormPreserveFloat32, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderDenormPreserveFloat64, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderDenormFlushToZeroFloat16, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderDenormFlushToZeroFloat32, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderDenormFlushToZeroFloat64, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderRoundingModeRTEFloat16, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderRoundingModeRTEFloat32, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderRoundingModeRTEFloat64, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderRoundingModeRTZFloat16, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderRoundingModeRTZFloat32, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderRoundingModeRTZFloat64, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDepthStencilResolvePropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDepthStencilResolvePropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_FLAG_WARN(member, supportedDepthResolveModes, false, requested_profile);
        GET_VALUE_FLAG_WARN(member, supportedStencilResolveModes, false, requested_profile);
        GET_VALUE_WARN(member, independentResolveNone, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, independentResolve, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceComputeShaderDerivativesFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceComputeShaderDerivativesFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, computeDerivativeGroupQuads, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, computeDerivativeGroupLinear, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMeshShaderPropertiesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMeshShaderPropertiesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxDrawMeshTasksCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTaskWorkGroupInvocations, false, requested_profile, WarnIfGreater);
        GetArray(device_name, parent, member, "maxTaskWorkGroupSize", dest->maxTaskWorkGroupSize, false);
        GET_VALUE_WARN(member, maxTaskTotalMemorySize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTaskOutputCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxMeshWorkGroupInvocations, false, requested_profile, WarnIfGreater);
        GetArray(device_name, parent, member, "maxMeshWorkGroupSize", dest->maxMeshWorkGroupSize, false);
        GET_VALUE_WARN(member, maxMeshTotalMemorySize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxMeshOutputVertices, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxMeshOutputPrimitives, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxMeshMultiviewViewCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, meshOutputPerVertexGranularity, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, meshOutputPerPrimitiveGranularity, false, requested_profile, WarnIfLesser);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMeshShaderFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMeshShaderFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, taskShader, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, meshShader, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, fragmentShaderBarycentric, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderImageFootprintFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderImageFootprintFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, imageFootprint, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExclusiveScissorFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceExclusiveScissorFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, exclusiveScissor, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTimelineSemaphorePropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceTimelineSemaphorePropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxTimelineSemaphoreValueDifference, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTimelineSemaphoreFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceTimelineSemaphoreFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, timelineSemaphore, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePresentTimingFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePresentTimingFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, presentTiming, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, presentAtAbsoluteTime, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, presentAtRelativeTime, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderIntegerFunctions2, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVulkanMemoryModelFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVulkanMemoryModelFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, vulkanMemoryModel, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, vulkanMemoryModelDeviceScope, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, vulkanMemoryModelAvailabilityVisibilityChains, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePCIBusInfoPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePCIBusInfoPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, pciDomain, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, pciBus, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, pciDevice, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, pciFunction, true, requested_profile, WarnIfNotEqual32u);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderTerminateInvocation, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentDensityMapPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFragmentDensityMapPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, minFragmentDensityTexelSize, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, maxFragmentDensityTexelSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, fragmentDensityInvocations, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentDensityMapFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFragmentDensityMapFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, fragmentDensityMap, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, fragmentDensityMapDynamic, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, fragmentDensityMapNonSubsampledImages, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceScalarBlockLayoutFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceScalarBlockLayoutFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, scalarBlockLayout, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSubgroupSizeControlPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceSubgroupSizeControlPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, minSubgroupSize, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, maxSubgroupSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxComputeWorkgroupSubgroups, false, requested_profile, WarnIfGreater);
        GET_VALUE_FLAG_WARN(member, requiredSubgroupSizeStages, false, requested_profile);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSubgroupSizeControlFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceSubgroupSizeControlFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, subgroupSizeControl, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, computeFullSubgroups, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentShadingRatePropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFragmentShadingRatePropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, minFragmentShadingRateAttachmentTexelSize, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, maxFragmentShadingRateAttachmentTexelSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxFragmentShadingRateAttachmentTexelSizeAspectRatio, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, primitiveFragmentShadingRateWithMultipleViewports, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, layeredShadingRateAttachments, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, fragmentShadingRateNonTrivialCombinerOps, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, maxFragmentSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxFragmentSizeAspectRatio, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxFragmentShadingRateCoverageSamples, false, requested_profile, WarnIfGreater);
        GET_VALUE_ENUM_WARN(member, maxFragmentShadingRateRasterizationSamples, false, requested_profile, WarnIfNotEqualEnum);
        GET_VALUE_WARN(member, fragmentShadingRateWithShaderDepthStencilWrites, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, fragmentShadingRateWithSampleMask, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, fragmentShadingRateWithShaderSampleMask, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, fragmentShadingRateWithConservativeRasterization, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, fragmentShadingRateWithFragmentShaderInterlock, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, fragmentShadingRateWithCustomSampleLocations, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, fragmentShadingRateStrictMultiplyCombiner, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentShadingRateFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFragmentShadingRateFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, pipelineFragmentShadingRate, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, primitiveFragmentShadingRate, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, attachmentFragmentShadingRate, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderCoreProperties2AMD *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderCoreProperties2AMD)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_FLAG_WARN(member, shaderCoreFeatures, false, requested_profile);
        GET_VALUE_WARN(member, activeComputeUnitCount, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCoherentMemoryFeaturesAMD *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCoherentMemoryFeaturesAMD)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, deviceCoherentMemory, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderConstantDataFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderConstantDataFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderConstantData, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDynamicRenderingLocalReadFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDynamicRenderingLocalReadFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, dynamicRenderingLocalRead, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderAbortPropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderAbortPropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxShaderAbortMessageSize, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderAbortFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderAbortFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderAbort, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderImageInt64Atomics, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, sparseImageInt64Atomics, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderQuadControlFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderQuadControlFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderQuadControl, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMemoryPriorityFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMemoryPriorityFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, memoryPriority, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, dedicatedAllocationImageAliasing, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, separateDepthStencilLayouts, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceBufferAddressFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceBufferAddressFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, bufferDeviceAddress, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, bufferDeviceAddressCaptureReplay, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, bufferDeviceAddressMultiDevice, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePresentWaitFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePresentWaitFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, presentWait, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCooperativeMatrixPropertiesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCooperativeMatrixPropertiesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_FLAG_WARN(member, cooperativeMatrixSupportedStages, false, requested_profile);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCooperativeMatrixFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCooperativeMatrixFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, cooperativeMatrix, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, cooperativeMatrixRobustBufferAccess, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCoverageReductionModeFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCoverageReductionModeFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, coverageReductionMode, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, fragmentShaderSampleInterlock, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, fragmentShaderPixelInterlock, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, fragmentShaderShadingRateInterlock, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceYcbcrImageArraysFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceYcbcrImageArraysFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, ycbcrImageArrays, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, uniformBufferStandardLayout, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceProvokingVertexPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceProvokingVertexPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, provokingVertexModePerPipeline, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, transformFeedbackPreservesTriangleFanProvokingVertex, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceProvokingVertexFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceProvokingVertexFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, provokingVertexLast, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, transformFeedbackPreservesProvokingVertex, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceBufferDeviceAddressFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceBufferDeviceAddressFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, bufferDeviceAddress, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, bufferDeviceAddressCaptureReplay, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, bufferDeviceAddressMultiDevice, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceLineRasterizationPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceLineRasterizationPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, lineSubPixelPrecisionBits, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceLineRasterizationFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceLineRasterizationFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, rectangularLines, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, bresenhamLines, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, smoothLines, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, stippledRectangularLines, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, stippledBresenhamLines, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, stippledSmoothLines, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderAtomicFloatFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderBufferFloat32Atomics, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderBufferFloat32AtomicAdd, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderBufferFloat64Atomics, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderBufferFloat64AtomicAdd, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSharedFloat32Atomics, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSharedFloat32AtomicAdd, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSharedFloat64Atomics, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSharedFloat64AtomicAdd, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderImageFloat32Atomics, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderImageFloat32AtomicAdd, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, sparseImageFloat32Atomics, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, sparseImageFloat32AtomicAdd, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceHostQueryResetFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceHostQueryResetFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, hostQueryReset, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceIndexTypeUint8FeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceIndexTypeUint8FeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, indexTypeUint8, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceExtendedDynamicStateFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, extendedDynamicState, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, pipelineExecutableInfo, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceHostImageCopyPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceHostImageCopyPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, copySrcLayoutCount, true, requested_profile, WarnIfNotEqual32u);
        GetArray(device_name, parent, member, "pCopySrcLayouts", dest->pCopySrcLayouts, &dest->copySrcLayoutCount, false);
        GET_VALUE_WARN(member, copyDstLayoutCount, true, requested_profile, WarnIfNotEqual32u);
        GetArray(device_name, parent, member, "pCopyDstLayouts", dest->pCopyDstLayouts, &dest->copyDstLayoutCount, false);
        GetArray(device_name, parent, member, "optimalTilingLayoutUUID", dest->optimalTilingLayoutUUID, true);
        GET_VALUE_WARN(member, identicalMemoryTypeRequirements, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceHostImageCopyFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceHostImageCopyFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, hostImageCopy, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMapMemoryPlacedPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMapMemoryPlacedPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, minPlacedMemoryMapAlignment, false, requested_profile, WarnIfLesser);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMapMemoryPlacedFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMapMemoryPlacedFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, memoryMapPlaced, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, memoryMapRangePlaced, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, memoryUnmapReserve, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderBufferFloat16Atomics, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderBufferFloat16AtomicAdd, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderBufferFloat16AtomicMinMax, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderBufferFloat32AtomicMinMax, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderBufferFloat64AtomicMinMax, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSharedFloat16Atomics, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSharedFloat16AtomicAdd, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSharedFloat16AtomicMinMax, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSharedFloat32AtomicMinMax, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSharedFloat64AtomicMinMax, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderImageFloat32AtomicMinMax, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, sparseImageFloat32AtomicMinMax, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, swapchainMaintenance1, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderDemoteToHelperInvocation, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxGraphicsShaderGroupCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxIndirectSequenceCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxIndirectCommandsTokenCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxIndirectCommandsStreamCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxIndirectCommandsTokenOffset, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxIndirectCommandsStreamStride, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, minSequencesCountBufferOffsetAlignment, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, minSequencesIndexBufferOffsetAlignment, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, minIndirectCommandsBufferOffsetAlignment, false, requested_profile, WarnIfLesser);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, deviceGeneratedCommands, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceInheritedViewportScissorFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceInheritedViewportScissorFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, inheritedViewportScissor2D, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, integerDotProduct8BitUnsignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct8BitSignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct8BitMixedSignednessAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct4x8BitPackedUnsignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct4x8BitPackedSignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct4x8BitPackedMixedSignednessAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct16BitUnsignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct16BitSignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct16BitMixedSignednessAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct32BitUnsignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct32BitSignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct32BitMixedSignednessAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct64BitUnsignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct64BitSignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProduct64BitMixedSignednessAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating8BitUnsignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating8BitSignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating16BitUnsignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating16BitSignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating32BitUnsignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating32BitSignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating64BitUnsignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating64BitSignedAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderIntegerDotProduct, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, storageTexelBufferOffsetAlignmentBytes, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, storageTexelBufferOffsetSingleTexelAlignment, true, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, uniformTexelBufferOffsetAlignmentBytes, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, uniformTexelBufferOffsetSingleTexelAlignment, true, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, texelBufferAlignment, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDepthBiasControlFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDepthBiasControlFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, depthBiasControl, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, leastRepresentableValueForceUnormRepresentation, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, floatRepresentation, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, depthBiasExact, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDeviceMemoryReportFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDeviceMemoryReportFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, deviceMemoryReport, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRobustness2PropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRobustness2PropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, robustStorageBufferAccessSizeAlignment, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, robustUniformBufferAccessSizeAlignment, false, requested_profile, WarnIfLesser);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRobustness2FeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRobustness2FeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, robustBufferAccess2, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, robustImageAccess2, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, nullDescriptor, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCustomBorderColorPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCustomBorderColorPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxCustomBorderColorSamplers, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCustomBorderColorFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCustomBorderColorFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, customBorderColors, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, customBorderColorWithoutFormat, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTextureCompressionASTC3DFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceTextureCompressionASTC3DFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, textureCompressionASTC_3D, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePresentBarrierFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePresentBarrierFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, presentBarrier, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePresentIdFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePresentIdFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, presentId, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePrivateDataFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePrivateDataFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, privateData, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, pipelineCreationCacheControl, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDiagnosticsConfigFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDiagnosticsConfigFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, diagnosticsConfig, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceQueuePerfHintPropertiesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceQueuePerfHintPropertiesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_FLAG_WARN(member, supportedQueues, false, requested_profile);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceQueuePerfHintFeaturesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceQueuePerfHintFeaturesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, queuePerfHint, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageProcessing3FeaturesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceImageProcessing3FeaturesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, imageGatherLinear, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, imageGatherExtendedModes, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, blockMatchExtendedClampToEdge, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderMultipleWaitQueuesPropertiesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderMultipleWaitQueuesPropertiesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxShaderWaitQueues, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderMultipleWaitQueuesFeaturesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderMultipleWaitQueuesFeaturesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderMultipleWaitQueues, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderSplitBarrierPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderSplitBarrierPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, splitBarrierReservedSharedMemory, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderSplitBarrierFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderSplitBarrierFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderSplitBarrier, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

#ifdef VK_ENABLE_BETA_EXTENSIONS
bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCudaKernelLaunchPropertiesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCudaKernelLaunchPropertiesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, computeCapabilityMinor, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, computeCapabilityMajor, false, requested_profile, WarnIfLesser);
    }
    return valid;
}

#endif // VK_ENABLE_BETA_EXTENSIONS
#ifdef VK_ENABLE_BETA_EXTENSIONS
bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCudaKernelLaunchFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCudaKernelLaunchFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, cudaKernelLaunchFeatures, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

#endif // VK_ENABLE_BETA_EXTENSIONS
bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTileShadingPropertiesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceTileShadingPropertiesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxApronSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, preferNonCoherent, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, tileGranularity, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, maxTileShadingRate, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTileShadingFeaturesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceTileShadingFeaturesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, tileShading, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, tileShadingFragmentStage, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, tileShadingColorAttachments, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, tileShadingDepthAttachments, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, tileShadingStencilAttachments, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, tileShadingInputAttachments, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, tileShadingSampledAttachments, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, tileShadingPerTileDraw, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, tileShadingPerTileDispatch, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, tileShadingDispatchTile, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, tileShadingApron, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, tileShadingAnisotropicApron, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, tileShadingAtomicOps, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, tileShadingImageProcessing, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSynchronization2FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceSynchronization2FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, synchronization2, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorBufferPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDescriptorBufferPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, combinedImageSamplerDescriptorSingleArray, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, bufferlessPushDescriptors, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, allowSamplerImageViewPostSubmitCreation, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBufferOffsetAlignment, true, requested_profile, WarnIfNotEqual64u);
        GET_VALUE_WARN(member, maxDescriptorBufferBindings, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxResourceDescriptorBufferBindings, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxSamplerDescriptorBufferBindings, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxEmbeddedImmutableSamplerBindings, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxEmbeddedImmutableSamplers, false, requested_profile, WarnIfGreater);
        GET_VALUE_SIZE_T_WARN(member, bufferCaptureReplayDescriptorDataSize, true, requested_profile, WarnIfNotEqualSizet);
        GET_VALUE_SIZE_T_WARN(member, imageCaptureReplayDescriptorDataSize, true, requested_profile, WarnIfNotEqualSizet);
        GET_VALUE_SIZE_T_WARN(member, imageViewCaptureReplayDescriptorDataSize, true, requested_profile, WarnIfNotEqualSizet);
        GET_VALUE_SIZE_T_WARN(member, samplerCaptureReplayDescriptorDataSize, true, requested_profile, WarnIfNotEqualSizet);
        GET_VALUE_SIZE_T_WARN(member, accelerationStructureCaptureReplayDescriptorDataSize, true, requested_profile, WarnIfNotEqualSizet);
        GET_VALUE_SIZE_T_WARN(member, samplerDescriptorSize, false, requested_profile, WarnIfGreaterSizet);
        GET_VALUE_SIZE_T_WARN(member, combinedImageSamplerDescriptorSize, false, requested_profile, WarnIfGreaterSizet);
        GET_VALUE_SIZE_T_WARN(member, sampledImageDescriptorSize, false, requested_profile, WarnIfGreaterSizet);
        GET_VALUE_SIZE_T_WARN(member, storageImageDescriptorSize, false, requested_profile, WarnIfGreaterSizet);
        GET_VALUE_SIZE_T_WARN(member, uniformTexelBufferDescriptorSize, false, requested_profile, WarnIfGreaterSizet);
        GET_VALUE_SIZE_T_WARN(member, robustUniformTexelBufferDescriptorSize, false, requested_profile, WarnIfGreaterSizet);
        GET_VALUE_SIZE_T_WARN(member, storageTexelBufferDescriptorSize, false, requested_profile, WarnIfGreaterSizet);
        GET_VALUE_SIZE_T_WARN(member, robustStorageTexelBufferDescriptorSize, false, requested_profile, WarnIfGreaterSizet);
        GET_VALUE_SIZE_T_WARN(member, uniformBufferDescriptorSize, false, requested_profile, WarnIfGreaterSizet);
        GET_VALUE_SIZE_T_WARN(member, robustUniformBufferDescriptorSize, false, requested_profile, WarnIfGreaterSizet);
        GET_VALUE_SIZE_T_WARN(member, storageBufferDescriptorSize, false, requested_profile, WarnIfGreaterSizet);
        GET_VALUE_SIZE_T_WARN(member, robustStorageBufferDescriptorSize, false, requested_profile, WarnIfGreaterSizet);
        GET_VALUE_SIZE_T_WARN(member, inputAttachmentDescriptorSize, false, requested_profile, WarnIfGreaterSizet);
        GET_VALUE_SIZE_T_WARN(member, accelerationStructureDescriptorSize, false, requested_profile, WarnIfGreaterSizet);
        GET_VALUE_WARN(member, maxSamplerDescriptorBufferRange, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxResourceDescriptorBufferRange, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, samplerDescriptorBufferAddressSpaceSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, resourceDescriptorBufferAddressSpaceSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, descriptorBufferAddressSpaceSize, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_SIZE_T_WARN(member, combinedImageSamplerDensityMapDescriptorSize, false, requested_profile, WarnIfGreaterSizet);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorBufferFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDescriptorBufferFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, descriptorBuffer, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBufferCaptureReplay, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBufferImageLayoutIgnored, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBufferPushDescriptors, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDeviceAddressCommandsFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDeviceAddressCommandsFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, deviceAddressCommands, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, graphicsPipelineLibraryFastLinking, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, graphicsPipelineLibraryIndependentInterpolationDecoration, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, graphicsPipelineLibrary, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderEarlyAndLateFragmentTests, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, triStripVertexOrderIndependentOfProvokingVertex, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderSubgroupUniformControlFlow, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderZeroInitializeWorkgroupMemory, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_ENUM_WARN(member, maxFragmentShadingRateInvocationCount, false, requested_profile, WarnIfNotEqualEnum);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, fragmentShadingRateEnums, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, supersampleFragmentShadingRates, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, noInvocationFragmentShadingRates, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingMotionBlurFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRayTracingMotionBlurFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, rayTracingMotionBlur, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, rayTracingMotionBlurPipelineTraceRaysIndirect, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMeshShaderPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMeshShaderPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxTaskWorkGroupTotalCount, false, requested_profile, WarnIfGreater);
        GetArray(device_name, parent, member, "maxTaskWorkGroupCount", dest->maxTaskWorkGroupCount, false);
        GET_VALUE_WARN(member, maxTaskWorkGroupInvocations, false, requested_profile, WarnIfGreater);
        GetArray(device_name, parent, member, "maxTaskWorkGroupSize", dest->maxTaskWorkGroupSize, false);
        GET_VALUE_WARN(member, maxTaskPayloadSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTaskSharedMemorySize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTaskPayloadAndSharedMemorySize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxMeshWorkGroupTotalCount, false, requested_profile, WarnIfGreater);
        GetArray(device_name, parent, member, "maxMeshWorkGroupCount", dest->maxMeshWorkGroupCount, false);
        GET_VALUE_WARN(member, maxMeshWorkGroupInvocations, false, requested_profile, WarnIfGreater);
        GetArray(device_name, parent, member, "maxMeshWorkGroupSize", dest->maxMeshWorkGroupSize, false);
        GET_VALUE_WARN(member, maxMeshSharedMemorySize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxMeshPayloadAndSharedMemorySize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxMeshOutputMemorySize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxMeshPayloadAndOutputMemorySize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxMeshOutputComponents, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxMeshOutputVertices, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxMeshOutputPrimitives, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxMeshOutputLayers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxMeshMultiviewViewCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, meshOutputPerVertexGranularity, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, meshOutputPerPrimitiveGranularity, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, maxPreferredTaskWorkGroupInvocations, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPreferredMeshWorkGroupInvocations, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, prefersLocalInvocationVertexOutput, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, prefersLocalInvocationPrimitiveOutput, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, prefersCompactVertexOutput, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, prefersCompactPrimitiveOutput, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMeshShaderFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMeshShaderFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, taskShader, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, meshShader, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, multiviewMeshShader, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, primitiveFragmentShadingRateMeshShader, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, meshShaderQueries, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, ycbcr2plane444Formats, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentDensityMap2PropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFragmentDensityMap2PropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, subsampledLoads, true, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, subsampledCoarseReconstructionEarlyAccess, true, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, maxSubsampledArrayLayers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetSubsampledSamplers, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentDensityMap2FeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFragmentDensityMap2FeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, fragmentDensityMapDeferred, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageRobustnessFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceImageRobustnessFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, robustImageAccess, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, workgroupMemoryExplicitLayout, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, workgroupMemoryExplicitLayoutScalarBlockLayout, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, workgroupMemoryExplicitLayout8BitAccess, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, workgroupMemoryExplicitLayout16BitAccess, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageCompressionControlFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceImageCompressionControlFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, imageCompressionControl, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, attachmentFeedbackLoopLayout, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevice4444FormatsFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevice4444FormatsFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, formatA4R4G4B4, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, formatA4B4G4R4, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFaultFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFaultFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, deviceFault, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, deviceFaultVendorBinary, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, rasterizationOrderColorAttachmentAccess, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, rasterizationOrderDepthAttachmentAccess, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, rasterizationOrderStencilAttachmentAccess, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, formatRgba10x6WithoutYCbCrSampler, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, mutableDescriptorType, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, vertexInputDynamicState, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDrmPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDrmPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, hasPrimary, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, hasRender, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, primaryMajor, true, requested_profile, WarnIfNotEquali64);
        GET_VALUE_WARN(member, primaryMinor, true, requested_profile, WarnIfNotEquali64);
        GET_VALUE_WARN(member, renderMajor, true, requested_profile, WarnIfNotEquali64);
        GET_VALUE_WARN(member, renderMinor, true, requested_profile, WarnIfNotEquali64);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceAddressBindingReportFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceAddressBindingReportFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, reportAddressBinding, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDepthClipControlFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDepthClipControlFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, depthClipControl, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, primitiveTopologyListRestart, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, primitiveTopologyPatchListRestart, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, presentModeFifoLatestReady, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSubpassShadingPropertiesHUAWEI *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceSubpassShadingPropertiesHUAWEI)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxSubpassShadingWorkgroupSizeAspectRatio, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSubpassShadingFeaturesHUAWEI *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceSubpassShadingFeaturesHUAWEI)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, subpassShading, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceInvocationMaskFeaturesHUAWEI *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceInvocationMaskFeaturesHUAWEI)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, invocationMask, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExternalMemoryRDMAFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceExternalMemoryRDMAFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, externalMemoryRDMA, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelinePropertiesFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePipelinePropertiesFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, pipelinePropertiesIdentifier, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFrameBoundaryFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFrameBoundaryFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, frameBoundary, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, multisampledRenderToSingleSampled, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExtendedDynamicState2FeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceExtendedDynamicState2FeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, extendedDynamicState2, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState2LogicOp, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState2PatchControlPoints, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceColorWriteEnableFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceColorWriteEnableFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, colorWriteEnable, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, primitivesGeneratedQuery, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, primitivesGeneratedQueryWithRasterizerDiscard, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, primitivesGeneratedQueryWithNonZeroStreams, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, rayTracingMaintenance1, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, rayTracingPipelineTraceRaysIndirect2, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderUntypedPointersFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderUntypedPointersFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderUntypedPointers, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, globalPriorityQuery, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVideoEncodeRgbConversionFeaturesVALVE *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVideoEncodeRgbConversionFeaturesVALVE)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, videoEncodeRgbConversion, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageViewMinLodFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceImageViewMinLodFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, minLod, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMultiDrawPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMultiDrawPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxMultiDrawCount, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMultiDrawFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMultiDrawFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, multiDraw, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImage2DViewOf3DFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceImage2DViewOf3DFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, image2DViewOf3D, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, sampler2DViewOf3D, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderTileImagePropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderTileImagePropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderTileImageCoherentReadAccelerated, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderTileImageReadSampleFromPixelRateInvocation, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderTileImageReadFromHelperInvocation, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderTileImageFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderTileImageFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderTileImageColorReadAccess, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderTileImageDepthReadAccess, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderTileImageStencilReadAccess, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceOpacityMicromapPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceOpacityMicromapPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxOpacity2StateSubdivisionLevel, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxOpacity4StateSubdivisionLevel, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceOpacityMicromapFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceOpacityMicromapFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, micromap, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, micromapCaptureReplay, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, micromapHostCommands, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

#ifdef VK_ENABLE_BETA_EXTENSIONS
bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDisplacementMicromapPropertiesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDisplacementMicromapPropertiesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxDisplacementMicromapSubdivisionLevel, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

#endif // VK_ENABLE_BETA_EXTENSIONS
#ifdef VK_ENABLE_BETA_EXTENSIONS
bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDisplacementMicromapFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDisplacementMicromapFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, displacementMicromap, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

#endif // VK_ENABLE_BETA_EXTENSIONS
bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GetArray(device_name, parent, member, "maxWorkGroupCount", dest->maxWorkGroupCount, false);
        GetArray(device_name, parent, member, "maxWorkGroupSize", dest->maxWorkGroupSize, false);
        GET_VALUE_WARN(member, maxOutputClusterCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, indirectBufferOffsetAlignment, true, requested_profile, WarnIfNotEqual64u);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, clustercullingShader, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, multiviewClusterCullingShader, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceBorderColorSwizzleFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceBorderColorSwizzleFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, borderColorSwizzle, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, borderColorSwizzleFromImage, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, pageableDeviceLocalMemory, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance4PropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMaintenance4PropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxBufferSize, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance4FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMaintenance4FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maintenance4, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderCorePropertiesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderCorePropertiesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, pixelRate, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, texelRate, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, fmaRate, true, requested_profile, WarnIfNotEqual32u);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderSubgroupRotateFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderSubgroupRotateFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderSubgroupRotate, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSubgroupRotateClustered, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSchedulingControlsPropertiesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceSchedulingControlsPropertiesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_FLAG_WARN(member, schedulingControlsFlags, false, requested_profile);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSchedulingControlsDispatchParametersPropertiesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceSchedulingControlsDispatchParametersPropertiesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, schedulingControlsMaxWarpsCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, schedulingControlsMaxQueuedBatchesCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, schedulingControlsMaxWorkGroupBatchSize, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSchedulingControlsFeaturesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceSchedulingControlsFeaturesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, schedulingControls, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, imageSlicedViewOf3D, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, descriptorSetHostMapping, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDepthClampZeroOneFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDepthClampZeroOneFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, depthClampZeroOne, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, nonSeamlessCubeMap, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRenderPassStripedPropertiesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRenderPassStripedPropertiesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, renderPassStripeGranularity, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, maxRenderPassStripes, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRenderPassStripedFeaturesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRenderPassStripedFeaturesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, renderPassStriped, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, fragmentDensityOffsetGranularity, false, requested_profile, WarnIfLesser);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, fragmentDensityMapOffset, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCopyMemoryIndirectPropertiesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCopyMemoryIndirectPropertiesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_FLAG_WARN(member, supportedQueues, false, requested_profile);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCopyMemoryIndirectFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCopyMemoryIndirectFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, indirectCopy, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMemoryDecompressionPropertiesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMemoryDecompressionPropertiesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_FLAG_WARN(member, decompressionMethods, false, requested_profile);
        GET_VALUE_WARN(member, maxDecompressionIndirectCount, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMemoryDecompressionFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMemoryDecompressionFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, memoryDecompression, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, deviceGeneratedCompute, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, deviceGeneratedComputePipelines, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, deviceGeneratedComputeCaptureReplay, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, spheres, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, linearSweptSpheres, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceLinearColorAttachmentFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceLinearColorAttachmentFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, linearColorAttachment, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderMaximalReconvergence, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, imageCompressionControlSwapchain, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageProcessingPropertiesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceImageProcessingPropertiesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxWeightFilterPhases, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxWeightFilterDimension, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxBlockMatchRegion, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxBoxFilterBlockSize, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageProcessingFeaturesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceImageProcessingFeaturesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, textureSampleWeighted, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, textureBoxFilter, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, textureBlockMatch, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceNestedCommandBufferPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceNestedCommandBufferPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxCommandBufferNestingLevel, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceNestedCommandBufferFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceNestedCommandBufferFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, nestedCommandBuffer, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, nestedCommandBufferRendering, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, nestedCommandBufferSimultaneousUse, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExtendedDynamicState3PropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceExtendedDynamicState3PropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, dynamicPrimitiveTopologyUnrestricted, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExtendedDynamicState3FeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, extendedDynamicState3TessellationDomainOrigin, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3DepthClampEnable, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3PolygonMode, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3RasterizationSamples, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3SampleMask, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3AlphaToCoverageEnable, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3AlphaToOneEnable, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3LogicOpEnable, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3ColorBlendEnable, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3ColorBlendEquation, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3ColorWriteMask, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3RasterizationStream, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3ConservativeRasterizationMode, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3ExtraPrimitiveOverestimationSize, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3DepthClipEnable, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3SampleLocationsEnable, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3ColorBlendAdvanced, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3ProvokingVertexMode, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3LineRasterizationMode, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3LineStippleEnable, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3DepthClipNegativeOneToOne, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3ViewportWScalingEnable, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3ViewportSwizzle, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3CoverageToColorEnable, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3CoverageToColorLocation, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3CoverageModulationMode, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3CoverageModulationTableEnable, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3CoverageModulationTable, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3CoverageReductionMode, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3RepresentativeFragmentTestEnable, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, extendedDynamicState3ShadingRateImageEnable, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, subpassMergeFeedback, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTensorPropertiesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceTensorPropertiesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxTensorDimensionCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTensorElements, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerDimensionTensorElements, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTensorStride, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTensorSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTensorShaderAccessArrayLength, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTensorShaderAccessSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetStorageTensors, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorSetStorageTensors, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindStorageTensors, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorUpdateAfterBindStorageTensors, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, shaderStorageTensorArrayNonUniformIndexingNative, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_FLAG_WARN(member, shaderTensorSupportedStages, false, requested_profile);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorBufferTensorPropertiesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDescriptorBufferTensorPropertiesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_SIZE_T_WARN(member, tensorCaptureReplayDescriptorDataSize, true, requested_profile, WarnIfNotEqualSizet);
        GET_VALUE_SIZE_T_WARN(member, tensorViewCaptureReplayDescriptorDataSize, true, requested_profile, WarnIfNotEqualSizet);
        GET_VALUE_SIZE_T_WARN(member, tensorDescriptorSize, false, requested_profile, WarnIfGreaterSizet);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTensorFeaturesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceTensorFeaturesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, tensorNonPacked, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderTensorAccess, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderStorageTensorArrayDynamicIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderStorageTensorArrayNonUniformIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, descriptorBindingStorageTensorUpdateAfterBind, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, tensors, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorBufferTensorFeaturesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDescriptorBufferTensorFeaturesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, descriptorBufferTensorDescriptors, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GetArray(device_name, parent, member, "shaderModuleIdentifierAlgorithmUUID", dest->shaderModuleIdentifierAlgorithmUUID, true);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderModuleIdentifier, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceOpticalFlowPropertiesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceOpticalFlowPropertiesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_FLAG_WARN(member, supportedOutputGridSizes, false, requested_profile);
        GET_VALUE_FLAG_WARN(member, supportedHintGridSizes, false, requested_profile);
        GET_VALUE_WARN(member, hintSupported, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, costSupported, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, bidirectionalFlowSupported, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, globalFlowSupported, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, minWidth, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, minHeight, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, maxWidth, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, maxHeight, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, maxNumRegionsOfInterest, true, requested_profile, WarnIfNotEqual32u);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceOpticalFlowFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceOpticalFlowFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, opticalFlow, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceLegacyDitheringFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceLegacyDitheringFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, legacyDithering, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelineProtectedAccessFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePipelineProtectedAccessFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, pipelineProtectedAccess, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

#ifdef VK_USE_PLATFORM_ANDROID_KHR
bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExternalFormatResolvePropertiesANDROID *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceExternalFormatResolvePropertiesANDROID)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, nullColorAttachmentWithExternalFormatResolve, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_ENUM_WARN(member, externalFormatResolveChromaOffsetX, true, requested_profile, WarnIfNotEqualEnum);
        GET_VALUE_ENUM_WARN(member, externalFormatResolveChromaOffsetY, true, requested_profile, WarnIfNotEqualEnum);
    }
    return valid;
}

#endif // VK_USE_PLATFORM_ANDROID_KHR
#ifdef VK_USE_PLATFORM_ANDROID_KHR
bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExternalFormatResolveFeaturesANDROID *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceExternalFormatResolveFeaturesANDROID)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, externalFormatResolve, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

#endif // VK_USE_PLATFORM_ANDROID_KHR
bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance5PropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMaintenance5PropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, earlyFragmentMultisampleCoverageAfterSampleCounting, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, earlyFragmentSampleMaskTestBeforeSampleCounting, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, depthStencilSwizzleOneSupport, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, polygonModePointSize, true, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, nonStrictSinglePixelWideLinesUseParallelogram, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, nonStrictWideLinesUseParallelogram, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance5FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMaintenance5FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maintenance5, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceAntiLagFeaturesAMD *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceAntiLagFeaturesAMD)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, antiLag, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

#ifdef VK_ENABLE_BETA_EXTENSIONS
bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDenseGeometryFormatFeaturesAMDX *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDenseGeometryFormatFeaturesAMDX)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, denseGeometryFormat, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

#endif // VK_ENABLE_BETA_EXTENSIONS
bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePresentId2FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePresentId2FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, presentId2, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePresentWait2FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePresentWait2FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, presentWait2, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, rayTracingPositionFetch, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderObjectPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderObjectPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GetArray(device_name, parent, member, "shaderBinaryUUID", dest->shaderBinaryUUID, true);
        GET_VALUE_WARN(member, shaderBinaryVersion, true, requested_profile, WarnIfNotEqual32u);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderObjectFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderObjectFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderObject, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelineBinaryPropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePipelineBinaryPropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, pipelineBinaryInternalCache, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, pipelineBinaryInternalCacheControl, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, pipelineBinaryPrefersInternalCache, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, pipelineBinaryPrecompiledInternalCache, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, pipelineBinaryCompressedData, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelineBinaryFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePipelineBinaryFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, pipelineBinaries, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTilePropertiesFeaturesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceTilePropertiesFeaturesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, tileProperties, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceAmigoProfilingFeaturesSEC *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceAmigoProfilingFeaturesSEC)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, amigoProfiling, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, multiviewPerViewViewports, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_ENUM_WARN(member, rayTracingInvocationReorderReorderingHint, true, requested_profile, WarnIfNotEqualEnum);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, rayTracingInvocationReorder, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCooperativeVectorPropertiesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCooperativeVectorPropertiesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_FLAG_WARN(member, cooperativeVectorSupportedStages, false, requested_profile);
        GET_VALUE_WARN(member, cooperativeVectorTrainingFloat16Accumulation, true, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, cooperativeVectorTrainingFloat32Accumulation, true, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, maxCooperativeVectorComponents, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCooperativeVectorFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCooperativeVectorFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, cooperativeVector, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, cooperativeVectorTraining, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, extendedSparseAddressSpaceSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_FLAG_WARN(member, extendedSparseImageUsageFlags, false, requested_profile);
        GET_VALUE_FLAG_WARN(member, extendedSparseBufferUsageFlags, false, requested_profile);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, extendedSparseAddressSpace, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, nativeUnalignedPerformance, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, legacyVertexAttributes, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderCoreMask, false, requested_profile, WarnIfNotEqual64u);
        GET_VALUE_WARN(member, shaderCoreCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, shaderWarpsPerCore, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderCoreBuiltins, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, pipelineLibraryGroupHandles, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, dynamicRenderingUnusedAttachments, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceInternallySynchronizedQueuesFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceInternallySynchronizedQueuesFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, internallySynchronizedQueues, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCooperativeMatrixPropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCooperativeMatrixPropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_FLAG_WARN(member, cooperativeMatrixSupportedStages, false, requested_profile);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCooperativeMatrixFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCooperativeMatrixFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, cooperativeMatrix, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, cooperativeMatrixRobustBufferAccess, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDataGraphFeaturesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDataGraphFeaturesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, dataGraph, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, dataGraphUpdateAfterBind, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, dataGraphSpecializationConstants, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, dataGraphDescriptorBuffer, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, dataGraphShaderModule, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, multiviewPerViewRenderAreas, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceComputeShaderDerivativesPropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceComputeShaderDerivativesPropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, meshAndTaskShaderDerivatives, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVideoEncodeAV1FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVideoEncodeAV1FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, videoEncodeAV1, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVideoDecodeVP9FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVideoDecodeVP9FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, videoDecodeVP9, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVideoMaintenance1FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVideoMaintenance1FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, videoMaintenance1, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePerStageDescriptorSetFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePerStageDescriptorSetFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, perStageDescriptorSet, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, dynamicPipelineLayout, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageProcessing2PropertiesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceImageProcessing2PropertiesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxBlockMatchWindow, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageProcessing2FeaturesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceImageProcessing2FeaturesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, textureBlockMatch2, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCubicWeightsFeaturesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCubicWeightsFeaturesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, selectableCubicWeights, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceYcbcrDegammaFeaturesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceYcbcrDegammaFeaturesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, ycbcrDegamma, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCubicClampFeaturesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCubicClampFeaturesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, cubicRangeClamp, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, attachmentFeedbackLoopDynamicState, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVertexAttributeDivisorPropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVertexAttributeDivisorPropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxVertexAttribDivisor, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, supportsNonZeroFirstInstance, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, unifiedImageLayouts, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, unifiedImageLayoutsVideo, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderFloatControls2FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderFloatControls2FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderFloatControls2, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

#ifdef VK_USE_PLATFORM_SCREEN_QNX
bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, screenBufferImport, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

#endif // VK_USE_PLATFORM_SCREEN_QNX
bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceLayeredDriverPropertiesMSFT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceLayeredDriverPropertiesMSFT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_ENUM_WARN(member, underlyingAPI, true, requested_profile, WarnIfNotEqualEnum);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderExpectAssumeFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderExpectAssumeFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderExpectAssume, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance6PropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMaintenance6PropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, blockTexelViewCompatibleMultipleLayers, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, maxCombinedImageSamplerDescriptorCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, fragmentShadingRateClampCombinerInputs, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance6FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMaintenance6FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maintenance6, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, descriptorPoolOverallocation, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTileMemoryHeapPropertiesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceTileMemoryHeapPropertiesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, queueSubmitBoundary, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, tileBufferTransfers, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceTileMemoryHeapFeaturesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceTileMemoryHeapFeaturesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, tileMemoryHeap, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCopyMemoryIndirectFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCopyMemoryIndirectFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, indirectMemoryCopy, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, indirectMemoryToImageCopy, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, videoEncodeIntraRefresh, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, videoEncodeQuantizationMap, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRawAccessChainsFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRawAccessChainsFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderRawAccessChains, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExternalComputeQueuePropertiesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceExternalComputeQueuePropertiesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, externalDataSize, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, maxExternalQueues, true, requested_profile, WarnIfNotEqual32u);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderRelaxedExtendedInstruction, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCommandBufferInheritanceFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCommandBufferInheritanceFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, commandBufferInheritance, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance7PropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMaintenance7PropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, robustFragmentShadingRateAttachmentAccess, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, separateDepthStencilAttachmentAccess, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, maxDescriptorSetTotalUniformBuffersDynamic, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetTotalStorageBuffersDynamic, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetTotalBuffersDynamic, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindTotalUniformBuffersDynamic, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindTotalStorageBuffersDynamic, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUpdateAfterBindTotalBuffersDynamic, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance7FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMaintenance7FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maintenance7, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderFloat16VectorAtomics, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderReplicatedComposites, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderFloat8FeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderFloat8FeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderFloat8, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderFloat8CooperativeMatrix, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingValidationFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRayTracingValidationFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, rayTracingValidation, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceClusterAccelerationStructurePropertiesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceClusterAccelerationStructurePropertiesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxVerticesPerCluster, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTrianglesPerCluster, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, clusterScratchByteAlignment, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, clusterByteAlignment, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, clusterTemplateByteAlignment, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, clusterBottomLevelByteAlignment, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, clusterTemplateBoundsByteAlignment, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, maxClusterGeometryIndex, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceClusterAccelerationStructureFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceClusterAccelerationStructureFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, clusterAccelerationStructure, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePartitionedAccelerationStructurePropertiesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePartitionedAccelerationStructurePropertiesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxPartitionCount, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, partitionedAccelerationStructure, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxIndirectPipelineCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxIndirectShaderObjectCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxIndirectSequenceCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxIndirectCommandsTokenCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxIndirectCommandsTokenOffset, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxIndirectCommandsIndirectStride, false, requested_profile, WarnIfGreater);
        GET_VALUE_FLAG_WARN(member, supportedIndirectCommandsInputModes, false, requested_profile);
        GET_VALUE_FLAG_WARN(member, supportedIndirectCommandsShaderStages, false, requested_profile);
        GET_VALUE_FLAG_WARN(member, supportedIndirectCommandsShaderStagesPipelineBinding, false, requested_profile);
        GET_VALUE_FLAG_WARN(member, supportedIndirectCommandsShaderStagesShaderBinding, false, requested_profile);
        GET_VALUE_WARN(member, deviceGeneratedCommandsTransformFeedback, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, deviceGeneratedCommandsMultiDrawIndirectCount, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, deviceGeneratedCommands, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, dynamicGeneratedPipelineLayout, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFaultPropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFaultPropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxDeviceFaultCount, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFaultFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFaultFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, deviceFault, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, deviceFaultVendorBinary, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, deviceFaultReportMasked, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, deviceFaultDeviceLostOnMasked, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance8FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMaintenance8FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maintenance8, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageAlignmentControlPropertiesMESA *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceImageAlignmentControlPropertiesMESA)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, supportedImageAlignmentMask, false, requested_profile, WarnIfNotEqual32u);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceImageAlignmentControlFeaturesMESA *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceImageAlignmentControlFeaturesMESA)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, imageAlignmentControl, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderFmaFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderFmaFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderFmaFloat16, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderFmaFloat32, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderFmaFloat64, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePushConstantBankPropertiesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePushConstantBankPropertiesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxGraphicsPushConstantBanks, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxComputePushConstantBanks, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxGraphicsPushDataBanks, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxComputePushDataBanks, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePushConstantBankFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePushConstantBankFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, pushConstantBank, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingInvocationReorderPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRayTracingInvocationReorderPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_ENUM_WARN(member, rayTracingInvocationReorderReorderingHint, true, requested_profile, WarnIfNotEqualEnum);
        GET_VALUE_WARN(member, maxShaderBindingTableRecordIndex, false, requested_profile, WarnIfLesser);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, rayTracingInvocationReorder, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDepthClampControlFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDepthClampControlFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, depthClampControl, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance9PropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMaintenance9PropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, image2DViewOf3DSparse, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_ENUM_WARN(member, defaultVertexAttributeValue, true, requested_profile, WarnIfNotEqualEnum);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance9FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMaintenance9FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maintenance9, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVideoMaintenance2FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVideoMaintenance2FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, videoMaintenance2, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceHdrVividFeaturesHUAWEI *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceHdrVividFeaturesHUAWEI)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, hdrVivid, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCooperativeMatrix2PropertiesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCooperativeMatrix2PropertiesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, cooperativeMatrixWorkgroupScopeMaxWorkgroupSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, cooperativeMatrixFlexibleDimensionsMaxDimension, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, cooperativeMatrixWorkgroupScopeReservedSharedMemory, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCooperativeMatrix2FeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCooperativeMatrix2FeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, cooperativeMatrixWorkgroupScope, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, cooperativeMatrixFlexibleDimensions, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, cooperativeMatrixReductions, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, cooperativeMatrixConversions, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, cooperativeMatrixPerElementOperations, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, cooperativeMatrixTensorAddressing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, cooperativeMatrixBlockLoads, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelineOpacityMicromapFeaturesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePipelineOpacityMicromapFeaturesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, pipelineOpacityMicromap, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVideoEncodeFeedback2FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVideoEncodeFeedback2FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, videoEncodeFeedback2, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePerformanceCountersByRegionPropertiesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePerformanceCountersByRegionPropertiesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxPerRegionPerformanceCounters, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, performanceCounterRegionSize, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, rowStrideAlignment, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, regionAlignment, true, requested_profile, WarnIfNotEqual32u);
        GET_VALUE_WARN(member, identityTransformOrder, true, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePerformanceCountersByRegionFeaturesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePerformanceCountersByRegionFeaturesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, performanceCountersByRegion, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderInstrumentationPropertiesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderInstrumentationPropertiesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, numMetrics, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, perBasicBlockGranularity, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderInstrumentationFeaturesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderInstrumentationFeaturesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderInstrumentation, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, vertexAttributeRobustness, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFormatPackFeaturesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFormatPackFeaturesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, formatPack, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentDensityMapLayeredPropertiesVALVE *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFragmentDensityMapLayeredPropertiesVALVE)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxFragmentDensityMapLayers, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFragmentDensityMapLayeredFeaturesVALVE *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFragmentDensityMapLayeredFeaturesVALVE)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, fragmentDensityMapLayered, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePresentMeteringFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePresentMeteringFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, presentMetering, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMultisampledRenderToSwapchainFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMultisampledRenderToSwapchainFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, multisampledRenderToSwapchain, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, zeroInitializeDeviceMemory, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceOpacityMicromapPropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceOpacityMicromapPropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxOpacity2StateSubdivisionLevel, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxOpacity4StateSubdivisionLevel, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxOpacityLossy4StateSubdivisionLevel, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxMicromapTriangles, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceOpacityMicromapFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceOpacityMicromapFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, micromap, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShader64BitIndexingFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShader64BitIndexingFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shader64BitIndexing, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCustomResolveFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCustomResolveFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, customResolve, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDataGraphModelFeaturesQCOM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDataGraphModelFeaturesQCOM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, dataGraphModel, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance10PropertiesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMaintenance10PropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, rgba4OpaqueBlackSwizzled, true, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, resolveSrgbFormatAppliesTransferFunction, true, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, resolveSrgbFormatSupportsTransferFunctionControl, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance10FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMaintenance10FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maintenance10, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDataGraphOpticalFlowFeaturesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDataGraphOpticalFlowFeaturesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, dataGraphOpticalFlow, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderLongVectorPropertiesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderLongVectorPropertiesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxVectorComponents, false, requested_profile, WarnIfGreater);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderLongVectorFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderLongVectorFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, longVector, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePipelineCacheIncrementalModeFeaturesSEC *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePipelineCacheIncrementalModeFeaturesSEC)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, pipelineCacheIncrementalMode, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderUniformBufferUnsizedArrayFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderUniformBufferUnsizedArrayFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderUniformBufferUnsizedArray, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceComputeOccupancyPriorityFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceComputeOccupancyPriorityFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, computeOccupancyPriority, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceMaintenance11FeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceMaintenance11FeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maintenance11, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderSubgroupPartitionedFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderSubgroupPartitionedFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderSubgroupPartitioned, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceExtendedFlagsFeaturesKHR *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceExtendedFlagsFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, extendedFlags, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderOCPMicroscalingTypesFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderOCPMicroscalingTypesFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderFloat4, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderFloat6, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderFloat8UnsignedE8M0, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderMXInt8, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceShaderMixedFloatDotProductFeaturesVALVE *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceShaderMixedFloatDotProductFeaturesVALVE)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, shaderMixedFloatDotProductFloat16AccFloat32, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderMixedFloatDotProductFloat16AccFloat16, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderMixedFloatDotProductBFloat16Acc, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderMixedFloatDotProductFloat8AccFloat32, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceThrottleHintFeaturesSEC *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceThrottleHintFeaturesSEC)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, throttleHint, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceDataGraphNeuralAcceleratorStatisticsFeaturesARM *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceDataGraphNeuralAcceleratorStatisticsFeaturesARM)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, dataGraphNeuralAcceleratorStatistics, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePrimitiveRestartIndexFeaturesEXT *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePrimitiveRestartIndexFeaturesEXT)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, primitiveRestartIndex, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceCooperativeMatrixDecodeVectorFeaturesNV *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceCooperativeMatrixDecodeVectorFeaturesNV)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, cooperativeMatrixDecodeVector, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceFeatures *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceFeatures)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, robustBufferAccess, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, fullDrawIndexUint32, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, imageCubeArray, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, independentBlend, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, geometryShader, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, tessellationShader, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, sampleRateShading, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, dualSrcBlend, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, logicOp, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, multiDrawIndirect, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, drawIndirectFirstInstance, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, depthClamp, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, depthBiasClamp, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, fillModeNonSolid, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, depthBounds, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, wideLines, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, largePoints, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, alphaToOne, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, multiViewport, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, samplerAnisotropy, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, textureCompressionETC2, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, textureCompressionASTC_LDR, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, textureCompressionBC, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, occlusionQueryPrecise, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, pipelineStatisticsQuery, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, vertexPipelineStoresAndAtomics, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, fragmentStoresAndAtomics, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderTessellationAndGeometryPointSize, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderImageGatherExtended, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderStorageImageExtendedFormats, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderStorageImageMultisample, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderStorageImageReadWithoutFormat, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderStorageImageWriteWithoutFormat, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderUniformBufferArrayDynamicIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderSampledImageArrayDynamicIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderStorageBufferArrayDynamicIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderStorageImageArrayDynamicIndexing, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderClipDistance, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderCullDistance, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderFloat64, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderInt64, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderInt16, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderResourceResidency, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, shaderResourceMinLod, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, sparseBinding, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, sparseResidencyBuffer, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, sparseResidencyImage2D, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, sparseResidencyImage3D, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, sparseResidency2Samples, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, sparseResidency4Samples, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, sparseResidency8Samples, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, sparseResidency16Samples, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, sparseResidencyAliased, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, variableMultisampleRate, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, inheritedQueries, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}


bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePortabilitySubsetFeaturesKHR *dest) {
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePortabilitySubsetFeaturesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        if (layer_settings.simulate.emulate_portability) {
            dest->constantAlphaColorBlendFactors = layer_settings.portability.constantAlphaColorBlendFactors;
            dest->events = layer_settings.portability.events;
            dest->imageViewFormatReinterpretation = layer_settings.portability.imageViewFormatReinterpretation;
            dest->imageViewFormatSwizzle = layer_settings.portability.imageViewFormatSwizzle;
            dest->imageView2DOn3DImage = layer_settings.portability.imageView2DOn3DImage;
            dest->multisampleArrayImage = layer_settings.portability.multisampleArrayImage;
            dest->mutableComparisonSamplers = layer_settings.portability.mutableComparisonSamplers;
            dest->pointPolygons = layer_settings.portability.pointPolygons;
            dest->samplerMipLodBias = layer_settings.portability.samplerMipLodBias;
            dest->separateStencilMaskRef = layer_settings.portability.separateStencilMaskRef;
            dest->shaderSampleRateInterpolationFunctions = layer_settings.portability.shaderSampleRateInterpolationFunctions;
            dest->tessellationIsolines = layer_settings.portability.tessellationIsolines;
            dest->tessellationPointMode = layer_settings.portability.tessellationPointMode;
            dest->triangleFans = layer_settings.portability.triangleFans;
            dest->vertexAttributeAccessBeyondStride = layer_settings.portability.vertexAttributeAccessBeyondStride;
        } else {
            GET_VALUE_WARN(member, constantAlphaColorBlendFactors, false, requested_profile, WarnIfNotEqualBool);
            GET_VALUE_WARN(member, events, false, requested_profile, WarnIfNotEqualBool);
            GET_VALUE_WARN(member, imageViewFormatReinterpretation, false, requested_profile, WarnIfNotEqualBool);
            GET_VALUE_WARN(member, imageViewFormatSwizzle, false, requested_profile, WarnIfNotEqualBool);
            GET_VALUE_WARN(member, imageView2DOn3DImage, false, requested_profile, WarnIfNotEqualBool);
            GET_VALUE_WARN(member, multisampleArrayImage, false, requested_profile, WarnIfNotEqualBool);
            GET_VALUE_WARN(member, mutableComparisonSamplers, false, requested_profile, WarnIfNotEqualBool);
            GET_VALUE_WARN(member, pointPolygons, false, requested_profile, WarnIfNotEqualBool);
            GET_VALUE_WARN(member, samplerMipLodBias, false, requested_profile, WarnIfNotEqualBool);
            GET_VALUE_WARN(member, separateStencilMaskRef, false, requested_profile, WarnIfNotEqualBool);
            GET_VALUE_WARN(member, shaderSampleRateInterpolationFunctions, false, requested_profile, WarnIfNotEqualBool);
            GET_VALUE_WARN(member, tessellationIsolines, false, requested_profile, WarnIfNotEqualBool);
            GET_VALUE_WARN(member, tessellationPointMode, false, requested_profile, WarnIfNotEqualBool);
            GET_VALUE_WARN(member, triangleFans, false, requested_profile, WarnIfNotEqualBool);
            GET_VALUE_WARN(member, vertexAttributeAccessBeyondStride, false, requested_profile, WarnIfNotEqualBool);
        }
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceProperties *dest) {
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceProperties)\n");
    bool valid = true;
    if (!GetStruct(device_name, requested_profile, parent["limits"], &dest->limits)) {
        valid = false;
    }
    if (!GetStruct(device_name, requested_profile, parent["sparseProperties"], &dest->sparseProperties)) {
        valid = false;
    }
    for (const auto &prop : parent.getMemberNames()) {
        GET_VALUE(prop, apiVersion, false, requested_profile);
        GET_VALUE(prop, driverVersion, true, requested_profile);
        GET_VALUE(prop, vendorID, true, requested_profile);
        GET_VALUE(prop, deviceID, true, requested_profile);
        GET_VALUE_ENUM_WARN(prop, deviceType, true, requested_profile, WarnIfNotEqualEnum);
        GetArray(device_name, parent, prop, "deviceName", dest->deviceName, true);         // size < VK_MAX_PHYSICAL_DEVICE_NAME_SIZE
        GetArray(device_name, parent, prop, "pipelineCacheUUID", dest->pipelineCacheUUID, true);  // size == VK_UUID_SIZE*/
    }
    return valid;
}
bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceLimits *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceLimits)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, maxImageDimension1D, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxImageDimension2D, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxImageDimension3D, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxImageDimensionCube, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxImageArrayLayers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTexelBufferElements, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxUniformBufferRange, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxStorageBufferRange, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPushConstantsSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxMemoryAllocationCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxSamplerAllocationCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, bufferImageGranularity, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, sparseAddressSpaceSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxBoundDescriptorSets, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorSamplers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorUniformBuffers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorStorageBuffers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorSampledImages, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorStorageImages, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageDescriptorInputAttachments, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxPerStageResources, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetSamplers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUniformBuffers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetUniformBuffersDynamic, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetStorageBuffers, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetStorageBuffersDynamic, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetSampledImages, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetStorageImages, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDescriptorSetInputAttachments, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxVertexInputAttributes, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxVertexInputBindings, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxVertexInputAttributeOffset, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxVertexInputBindingStride, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxVertexOutputComponents, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTessellationGenerationLevel, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTessellationPatchSize, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTessellationControlPerVertexInputComponents, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTessellationControlPerVertexOutputComponents, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTessellationControlPerPatchOutputComponents, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTessellationControlTotalOutputComponents, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTessellationEvaluationInputComponents, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxTessellationEvaluationOutputComponents, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxGeometryShaderInvocations, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxGeometryInputComponents, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxGeometryOutputComponents, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxGeometryOutputVertices, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxGeometryTotalOutputComponents, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxFragmentInputComponents, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxFragmentOutputAttachments, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxFragmentDualSrcAttachments, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxFragmentCombinedOutputResources, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxComputeSharedMemorySize, false, requested_profile, WarnIfGreater);
        GetArray(device_name, parent, member, "maxComputeWorkGroupCount", dest->maxComputeWorkGroupCount, false);
        GET_VALUE_WARN(member, maxComputeWorkGroupInvocations, false, requested_profile, WarnIfGreater);
        GetArray(device_name, parent, member, "maxComputeWorkGroupSize", dest->maxComputeWorkGroupSize, false);
        GET_VALUE_WARN(member, subPixelPrecisionBits, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, subTexelPrecisionBits, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, mipmapPrecisionBits, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDrawIndexedIndexValue, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxDrawIndirectCount, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxSamplerLodBias, false, requested_profile, WarnIfGreaterFloat);
        GET_VALUE_WARN(member, maxSamplerAnisotropy, false, requested_profile, WarnIfGreaterFloat);
        GET_VALUE_WARN(member, maxViewports, false, requested_profile, WarnIfGreater);
        GetArray(device_name, parent, member, "maxViewportDimensions", dest->maxViewportDimensions, false);
        GetArray(device_name, parent, member, "viewportBoundsRange", dest->viewportBoundsRange, false);
        GET_VALUE_WARN(member, viewportSubPixelBits, false, requested_profile, WarnIfGreater);
        GET_VALUE_SIZE_T_WARN(member, minMemoryMapAlignment, false, requested_profile, WarnIfGreaterSizet);
        GET_VALUE_WARN(member, minTexelBufferOffsetAlignment, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, minUniformBufferOffsetAlignment, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, minStorageBufferOffsetAlignment, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, minTexelOffset, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, maxTexelOffset, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, minTexelGatherOffset, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, maxTexelGatherOffset, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, minInterpolationOffset, false, requested_profile, WarnIfLesserFloat);
        GET_VALUE_WARN(member, maxInterpolationOffset, false, requested_profile, WarnIfGreaterFloat);
        GET_VALUE_WARN(member, subPixelInterpolationOffsetBits, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxFramebufferWidth, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxFramebufferHeight, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxFramebufferLayers, false, requested_profile, WarnIfGreater);
        GET_VALUE_FLAG_WARN(member, framebufferColorSampleCounts, false, requested_profile);
        GET_VALUE_FLAG_WARN(member, framebufferDepthSampleCounts, false, requested_profile);
        GET_VALUE_FLAG_WARN(member, framebufferStencilSampleCounts, false, requested_profile);
        GET_VALUE_FLAG_WARN(member, framebufferNoAttachmentsSampleCounts, false, requested_profile);
        GET_VALUE_WARN(member, maxColorAttachments, false, requested_profile, WarnIfGreater);
        GET_VALUE_FLAG_WARN(member, sampledImageColorSampleCounts, false, requested_profile);
        GET_VALUE_FLAG_WARN(member, sampledImageIntegerSampleCounts, false, requested_profile);
        GET_VALUE_FLAG_WARN(member, sampledImageDepthSampleCounts, false, requested_profile);
        GET_VALUE_FLAG_WARN(member, sampledImageStencilSampleCounts, false, requested_profile);
        GET_VALUE_FLAG_WARN(member, storageImageSampleCounts, false, requested_profile);
        GET_VALUE_WARN(member, maxSampleMaskWords, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, timestampComputeAndGraphics, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, timestampPeriod, true, requested_profile, WarnIfNotEqualFloat);
        GET_VALUE_WARN(member, maxClipDistances, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxCullDistances, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, maxCombinedClipAndCullDistances, false, requested_profile, WarnIfGreater);
        GET_VALUE_WARN(member, discreteQueuePriorities, false, requested_profile, WarnIfGreater);
        GetArray(device_name, parent, member, "pointSizeRange", dest->pointSizeRange, false);
        GetArray(device_name, parent, member, "lineWidthRange", dest->lineWidthRange, false);
        GET_VALUE_WARN(member, pointSizeGranularity, false, requested_profile, WarnIfLesserFloat);
        GET_VALUE_WARN(member, lineWidthGranularity, false, requested_profile, WarnIfLesserFloat);
        GET_VALUE_WARN(member, strictLines, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, standardSampleLocations, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, optimalBufferCopyOffsetAlignment, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, optimalBufferCopyRowPitchAlignment, false, requested_profile, WarnIfLesser);
        GET_VALUE_WARN(member, nonCoherentAtomSize, false, requested_profile, WarnIfLesser);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceSparseProperties *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceSparseProperties)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, residencyStandard2DBlockShape, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, residencyStandard2DMultisampleBlockShape, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, residencyStandard3DBlockShape, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, residencyAlignedMipSize, false, requested_profile, WarnIfNotEqualBool);
        GET_VALUE_WARN(member, residencyNonResidentStrict, false, requested_profile, WarnIfNotEqualBool);
    }
    return valid;
}

bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDeviceToolProperties *dest) {
    (void)dest;
    (void)requested_profile;
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDeviceToolProperties)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GetArray(device_name, parent, member, "name", dest->name, true);
        GetArray(device_name, parent, member, "version", dest->version, true);
        GetArray(device_name, parent, member, "description", dest->description, true);
        GetArray(device_name, parent, member, "layer", dest->layer, true);
    }
    return valid;
}


bool JsonLoader::GetStruct(const char* device_name, bool requested_profile, const Json::Value &parent, VkPhysicalDevicePortabilitySubsetPropertiesKHR *dest) {
    LogMessage(&layer_settings, DEBUG_REPORT_DEBUG_BIT, "\tJsonLoader::GetStruct(VkPhysicalDevicePortabilitySubsetPropertiesKHR)\n");
    bool valid = true;
    for (const auto &member : parent.getMemberNames()) {
        GET_VALUE_WARN(member, minVertexInputBindingStrideAlignment, false, requested_profile, WarnIfLesser);
    }
    return valid;
}

#undef GET_VALUE
#undef GET_ARRAY

// Generic layer dispatch table setup, see [LALI].
static VkResult LayerSetupCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
                                         VkInstance *pInstance) {
    VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
    assert(chain_info->u.pLayerInfo);

    PFN_vkGetInstanceProcAddr fp_get_instance_proc_addr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
    PFN_vkCreateInstance fp_create_instance = (PFN_vkCreateInstance)fp_get_instance_proc_addr(nullptr, "vkCreateInstance");
    if (!fp_create_instance) {
        return VK_ERROR_INITIALIZATION_FAILED;
    }

    chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
    VkResult result = fp_create_instance(pCreateInfo, pAllocator, pInstance);
    if (result == VK_SUCCESS) {
        initInstanceTable(*pInstance, fp_get_instance_proc_addr);
        JsonLoader::Store(*pInstance);
    }
    return result;
}

VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
                                              VkInstance *pInstance) {
    JsonLoader &json_loader = JsonLoader::Create();

    ProfileLayerSettings *layer_settings = &json_loader.layer_settings;

    InitProfilesLayerSettings(pCreateInfo, pAllocator, layer_settings);

    LogMessage(layer_settings, DEBUG_REPORT_DEBUG_BIT, "CreateInstance\n");
    LogMessage(layer_settings, DEBUG_REPORT_DEBUG_BIT, "JsonCpp version %s\n", JSONCPP_VERSION_STRING);
    LogMessage(layer_settings, DEBUG_REPORT_NOTIFICATION_BIT, "%s version %d.%d.%d\n", kLayerName, kVersionProfilesMajor,
                                                       kVersionProfilesMinor, kVersionProfilesPatch);

    VkResult result = json_loader.LoadProfilesDatabase();
    if (result != VK_SUCCESS) {
        return result;
    }

    const VkApplicationInfo *app_info = pCreateInfo->pApplicationInfo;
    requested_version = (app_info && app_info->apiVersion) ? app_info->apiVersion : VK_API_VERSION_1_0;
    if (VK_API_VERSION_MAJOR(requested_version) > VK_API_VERSION_MAJOR(VK_HEADER_VERSION_COMPLETE) ||
        VK_API_VERSION_MINOR(requested_version) > VK_API_VERSION_MINOR(VK_HEADER_VERSION_COMPLETE)) {
        LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, "The Vulkan application requested a Vulkan %s instance but the %s was build "
                                                    "against %s. Please, update the layer.\n",
                                                    StringAPIVersion(requested_version).c_str(), kLayerName,
                                                    StringAPIVersion(VK_HEADER_VERSION_COMPLETE).c_str());
        if (layer_settings->log.debug_fail_on_error) {
            return VK_ERROR_INITIALIZATION_FAILED;
        }
    }


    bool changed_version = false;
    if (!layer_settings->simulate.profile_file.empty() || !layer_settings->simulate.profile_dirs.empty()) {
        const uint32_t profile_api_version = json_loader.GetProfileApiVersion();
        if (VK_API_VERSION_MAJOR(requested_version) < VK_API_VERSION_MAJOR(profile_api_version) ||
            VK_API_VERSION_MINOR(requested_version) < VK_API_VERSION_MINOR(profile_api_version)) {
            if (layer_settings->simulate.capabilities & SIMULATE_API_VERSION_BIT) {
                if (layer_settings->simulate.profile_name.empty()) {
                    LogMessage(layer_settings,
                        DEBUG_REPORT_NOTIFICATION_BIT,
                        "The Vulkan application requested a Vulkan %s instance but the selected %s file requires %s. The "
                                 "application requested instance version is overridden to %s.\n",
                                 StringAPIVersion(requested_version).c_str(), layer_settings->simulate.profile_file.c_str(),
                                 StringAPIVersion(profile_api_version).c_str(), StringAPIVersion(profile_api_version).c_str());
                } else {
                    LogMessage(layer_settings,
                        DEBUG_REPORT_NOTIFICATION_BIT,
                        "The Vulkan application requested a Vulkan %s instance but the selected %s profile requires %s. "
                                 "The application requested instance version is overridden to %s.\n",
                                 StringAPIVersion(requested_version).c_str(), layer_settings->simulate.profile_name.c_str(),
                                 StringAPIVersion(profile_api_version).c_str(), StringAPIVersion(profile_api_version).c_str());
                }
                requested_version = profile_api_version;
                changed_version = true;
            } else {
                if (layer_settings->simulate.profile_name.empty()) {
                    LogMessage(layer_settings,
                        DEBUG_REPORT_WARNING_BIT,
                        "The Vulkan application requested a Vulkan %s instance but the selected %s file requires %s. The "
                                 "profile may not be initialized correctly which will produce unexpected warning messages.\n",
                                 StringAPIVersion(requested_version).c_str(), layer_settings->simulate.profile_file.c_str(),
                                 StringAPIVersion(profile_api_version).c_str());
                } else {
                    LogMessage(layer_settings,
                        DEBUG_REPORT_WARNING_BIT,
                        "The Vulkan application requested a Vulkan %s instance but the selected %s profile requires %s. "
                                 "The profile may not be initialized correctly which will produce unexpected warning messages.\n",
                                 StringAPIVersion(requested_version).c_str(), layer_settings->simulate.profile_name.c_str(),
                                 StringAPIVersion(profile_api_version).c_str());
                }
            }
        }
    }

    std::lock_guard<std::recursive_mutex> lock(global_lock);

    bool get_physical_device_properties2_active = false;
    if (VK_API_VERSION_MINOR(requested_version) > 0) {
        get_physical_device_properties2_active = true;
    } else {
        for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
            if (strncmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
                        VK_MAX_EXTENSION_NAME_SIZE) == 0) {
                get_physical_device_properties2_active = true;
                break;
            }
        }
    }
    if (!changed_version && get_physical_device_properties2_active) {
        return LayerSetupCreateInstance(pCreateInfo, pAllocator, pInstance);
    }

    if (!get_physical_device_properties2_active) {
        LogMessage(layer_settings, DEBUG_REPORT_NOTIFICATION_BIT,
                   "The Profiles Layer requires the %s extension, but it was not included in "
                            "VkInstanceCreateInfo::ppEnabledExtensionNames, adding the extension.\n",
                            VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
    }

    // Handle VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME
    bool has_port_enum = false;
    for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
        if (strncmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME,
                    VK_MAX_EXTENSION_NAME_SIZE) == 0) {
            has_port_enum = true;
            break;
        }
    }

    VkInstanceCreateInfo create_info;
    create_info.sType = pCreateInfo->sType;
    create_info.pNext = pCreateInfo->pNext;
    create_info.flags = pCreateInfo->flags;
    if (has_port_enum) {
        create_info.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
    }

    VkApplicationInfo new_app_info;
    if (changed_version) {
        if (app_info) {
            new_app_info.sType = app_info->sType;
            new_app_info.pNext = app_info->pNext;
            new_app_info.pApplicationName = app_info->pApplicationName;
            new_app_info.applicationVersion = app_info->applicationVersion;
            new_app_info.pEngineName = app_info->pEngineName;
            new_app_info.engineVersion = app_info->engineVersion;
            new_app_info.apiVersion = requested_version;
        } else {
            new_app_info = {VK_STRUCTURE_TYPE_APPLICATION_INFO};
            new_app_info.apiVersion = requested_version;
        }

        create_info.pApplicationInfo = &new_app_info;
    } else {
        create_info.pApplicationInfo = app_info;
    }
    create_info.enabledLayerCount = pCreateInfo->enabledLayerCount;
    create_info.ppEnabledLayerNames = pCreateInfo->ppEnabledLayerNames;

    // Add VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
    std::vector<const char *> extension_names;
    if (!get_physical_device_properties2_active) {
        create_info.enabledExtensionCount = pCreateInfo->enabledExtensionCount + 1;
        extension_names.resize(create_info.enabledExtensionCount);
        for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; ++i) {
            extension_names[i] = pCreateInfo->ppEnabledExtensionNames[i];
        }
        extension_names[pCreateInfo->enabledExtensionCount] = VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME;
        create_info.ppEnabledExtensionNames = extension_names.data();
    } else {
        create_info.enabledExtensionCount = pCreateInfo->enabledExtensionCount;
        create_info.ppEnabledExtensionNames = pCreateInfo->ppEnabledExtensionNames;
    }
    return LayerSetupCreateInstance(&create_info, pAllocator, pInstance);
}

VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
    if (instance) {
        std::lock_guard<std::recursive_mutex> lock(global_lock);

        ProfileLayerSettings* layer_settings = &JsonLoader::Find(instance)->layer_settings;

        LogMessage(layer_settings, DEBUG_REPORT_DEBUG_BIT, "DestroyInstance\n");

        {
            const auto dt = instance_dispatch_table(instance);

            std::vector<VkPhysicalDevice> physical_devices;
            VkResult err = EnumerateAll<VkPhysicalDevice>(physical_devices, [&](uint32_t *count, VkPhysicalDevice *results) {
                return dt->EnumeratePhysicalDevices(instance, count, results);
            });
            assert(!err);
            if (!err)
                for (const auto pd : physical_devices) PhysicalDeviceData::Destroy(pd);

            dt->DestroyInstance(instance, pAllocator);
        }
        destroy_instance_dispatch_table(get_dispatch_key(instance));

        JsonLoader::Destroy(instance);
    }
}

void FillPNextChain(PhysicalDeviceData *physicalDeviceData, void *place) {
    ProfileLayerSettings *layer_settings = &JsonLoader::Find(physicalDeviceData->instance())->layer_settings;
    while (place) {
        VkBaseOutStructure *structure = (VkBaseOutStructure *)place;

        // These switch statements check which struct is in the pNext chain and, if the physical device has the proper extension,
        // fill the struct with any override data provided by the PhysicalDeviceData object.

        switch (structure->sType) {
            // VK_KHR_portability_subset is a special case since it can also be emulated by the Profiles layer.
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR:
                if (PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME) ||
                    layer_settings->simulate.emulate_portability) {
                    VkPhysicalDevicePortabilitySubsetPropertiesKHR *psp = (VkPhysicalDevicePortabilitySubsetPropertiesKHR *)place;
                    void *pNext = psp->pNext;
                    *psp = physicalDeviceData->physical_device_portability_subset_properties_;
                    if (layer_settings->portability.vertexAttributeAccessBeyondStride) {
                        psp->minVertexInputBindingStrideAlignment = layer_settings->portability.minVertexInputBindingStrideAlignment;
                    }
                    psp->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:
                if (physicalDeviceData->GetEffectiveVersion() >= VK_API_VERSION_1_1) {
                    VkPhysicalDeviceSubgroupProperties *data = (VkPhysicalDeviceSubgroupProperties *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_subgroup_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES:
                if (physicalDeviceData->GetEffectiveVersion() >= VK_API_VERSION_1_1) {
                    VkPhysicalDeviceProtectedMemoryProperties *data = (VkPhysicalDeviceProtectedMemoryProperties *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_protected_memory_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES:
                if (physicalDeviceData->GetEffectiveVersion() >= VK_API_VERSION_1_2) {
                    VkPhysicalDeviceVulkan11Properties *data = (VkPhysicalDeviceVulkan11Properties *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_vulkan_11_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES:
                if (physicalDeviceData->GetEffectiveVersion() >= VK_API_VERSION_1_2) {
                    VkPhysicalDeviceVulkan12Properties *data = (VkPhysicalDeviceVulkan12Properties *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_vulkan_12_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES:
                if (physicalDeviceData->GetEffectiveVersion() >= VK_API_VERSION_1_3) {
                    VkPhysicalDeviceVulkan13Properties *data = (VkPhysicalDeviceVulkan13Properties *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_vulkan_13_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_PROPERTIES:
                if (physicalDeviceData->GetEffectiveVersion() >= VK_API_VERSION_1_4) {
                    VkPhysicalDeviceVulkan14Properties *data = (VkPhysicalDeviceVulkan14Properties *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_vulkan_14_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
                if (physicalDeviceData->GetEffectiveVersion() >= VK_API_VERSION_1_1) {
                    VkPhysicalDeviceProtectedMemoryFeatures *data = (VkPhysicalDeviceProtectedMemoryFeatures *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_protected_memory_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES:
                if (physicalDeviceData->GetEffectiveVersion() >= VK_API_VERSION_1_1) {
                    VkPhysicalDeviceShaderDrawParameterFeatures *data = (VkPhysicalDeviceShaderDrawParameterFeatures *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_draw_parameter_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES:
                if (physicalDeviceData->GetEffectiveVersion() >= VK_API_VERSION_1_2) {
                    VkPhysicalDeviceVulkan11Features *data = (VkPhysicalDeviceVulkan11Features *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_vulkan_11_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES:
                if (physicalDeviceData->GetEffectiveVersion() >= VK_API_VERSION_1_2) {
                    VkPhysicalDeviceVulkan12Features *data = (VkPhysicalDeviceVulkan12Features *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_vulkan_12_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES:
                if (physicalDeviceData->GetEffectiveVersion() >= VK_API_VERSION_1_3) {
                    VkPhysicalDeviceVulkan13Features *data = (VkPhysicalDeviceVulkan13Features *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_vulkan_13_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_FEATURES:
                if (physicalDeviceData->GetEffectiveVersion() >= VK_API_VERSION_1_4) {
                    VkPhysicalDeviceVulkan14Features *data = (VkPhysicalDeviceVulkan14Features *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_vulkan_14_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME))) {
                    VkPhysicalDeviceTransformFeedbackPropertiesEXT *data = (VkPhysicalDeviceTransformFeedbackPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_transform_feedback_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME))) {
                    VkPhysicalDeviceTransformFeedbackFeaturesEXT *data = (VkPhysicalDeviceTransformFeedbackFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_transform_feedback_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME))) {
                    VkPhysicalDeviceDynamicRenderingFeaturesKHR *data = (VkPhysicalDeviceDynamicRenderingFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_dynamic_rendering_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_CORNER_SAMPLED_IMAGE_EXTENSION_NAME))) {
                    VkPhysicalDeviceCornerSampledImageFeaturesNV *data = (VkPhysicalDeviceCornerSampledImageFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_corner_sampled_image_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_MULTIVIEW_EXTENSION_NAME))) {
                    VkPhysicalDeviceMultiviewPropertiesKHR *data = (VkPhysicalDeviceMultiviewPropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_multiview_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_MULTIVIEW_EXTENSION_NAME))) {
                    VkPhysicalDeviceMultiviewFeaturesKHR *data = (VkPhysicalDeviceMultiviewFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_multiview_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME))) {
                    VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT *data = (VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_texture_compression_astchdrfeatures_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME))) {
                    VkPhysicalDeviceASTCDecodeFeaturesEXT *data = (VkPhysicalDeviceASTCDecodeFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_astcdecode_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME))) {
                    VkPhysicalDevicePipelineRobustnessPropertiesEXT *data = (VkPhysicalDevicePipelineRobustnessPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_pipeline_robustness_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME))) {
                    VkPhysicalDevicePipelineRobustnessFeaturesEXT *data = (VkPhysicalDevicePipelineRobustnessFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_pipeline_robustness_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME)) && (PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME)) && (PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME))) {
                    VkPhysicalDeviceIDPropertiesKHR *data = (VkPhysicalDeviceIDPropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_idproperties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME))) {
                    VkPhysicalDevicePushDescriptorPropertiesKHR *data = (VkPhysicalDevicePushDescriptorPropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_push_descriptor_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME))) {
                    VkPhysicalDeviceConditionalRenderingFeaturesEXT *data = (VkPhysicalDeviceConditionalRenderingFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_conditional_rendering_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME))) {
                    VkPhysicalDeviceFloat16Int8FeaturesKHR *data = (VkPhysicalDeviceFloat16Int8FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_float_16_int_8_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_16BIT_STORAGE_EXTENSION_NAME))) {
                    VkPhysicalDevice16BitStorageFeaturesKHR *data = (VkPhysicalDevice16BitStorageFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_16_bit_storage_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_EXTENSION_NAME))) {
                    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX *data = (VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_multiview_per_view_attributes_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_DISCARD_RECTANGLES_EXTENSION_NAME))) {
                    VkPhysicalDeviceDiscardRectanglePropertiesEXT *data = (VkPhysicalDeviceDiscardRectanglePropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_discard_rectangle_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME))) {
                    VkPhysicalDeviceConservativeRasterizationPropertiesEXT *data = (VkPhysicalDeviceConservativeRasterizationPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_conservative_rasterization_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME))) {
                    VkPhysicalDeviceDepthClipEnableFeaturesEXT *data = (VkPhysicalDeviceDepthClipEnableFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_depth_clip_enable_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME))) {
                    VkPhysicalDeviceImagelessFramebufferFeaturesKHR *data = (VkPhysicalDeviceImagelessFramebufferFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_imageless_framebuffer_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_IMG_RELAXED_LINE_RASTERIZATION_EXTENSION_NAME))) {
                    VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG *data = (VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_relaxed_line_rasterization_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME))) {
                    VkPhysicalDevicePerformanceQueryPropertiesKHR *data = (VkPhysicalDevicePerformanceQueryPropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_performance_query_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME))) {
                    VkPhysicalDevicePerformanceQueryFeaturesKHR *data = (VkPhysicalDevicePerformanceQueryFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_performance_query_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_MAINTENANCE_2_EXTENSION_NAME))) {
                    VkPhysicalDevicePointClippingPropertiesKHR *data = (VkPhysicalDevicePointClippingPropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_point_clipping_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME))) {
                    VkPhysicalDeviceVariablePointerFeaturesKHR *data = (VkPhysicalDeviceVariablePointerFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_variable_pointer_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME))) {
                    VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT *data = (VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_sampler_filter_minmax_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GPA_PROPERTIES_2_AMD:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_AMD_GPA_INTERFACE_EXTENSION_NAME))) {
                    VkPhysicalDeviceGpaProperties2AMD *data = (VkPhysicalDeviceGpaProperties2AMD *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_gpa_properties_2_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GPA_FEATURES_AMD:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_AMD_GPA_INTERFACE_EXTENSION_NAME))) {
                    VkPhysicalDeviceGpaFeaturesAMD *data = (VkPhysicalDeviceGpaFeaturesAMD *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_gpa_features_;
                    data->pNext = pNext;
                }
                break;
#ifdef VK_ENABLE_BETA_EXTENSIONS
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ENQUEUE_PROPERTIES_AMDX:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_AMDX_SHADER_ENQUEUE_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderEnqueuePropertiesAMDX *data = (VkPhysicalDeviceShaderEnqueuePropertiesAMDX *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_enqueue_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ENQUEUE_FEATURES_AMDX:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_AMDX_SHADER_ENQUEUE_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderEnqueueFeaturesAMDX *data = (VkPhysicalDeviceShaderEnqueueFeaturesAMDX *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_enqueue_features_;
                    data->pNext = pNext;
                }
                break;
#endif // VK_ENABLE_BETA_EXTENSIONS
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_HEAP_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_DESCRIPTOR_HEAP_EXTENSION_NAME))) {
                    VkPhysicalDeviceDescriptorHeapPropertiesEXT *data = (VkPhysicalDeviceDescriptorHeapPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_descriptor_heap_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_HEAP_TENSOR_PROPERTIES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_DESCRIPTOR_HEAP_EXTENSION_NAME))) {
                    VkPhysicalDeviceDescriptorHeapTensorPropertiesARM *data = (VkPhysicalDeviceDescriptorHeapTensorPropertiesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_descriptor_heap_tensor_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_HEAP_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_DESCRIPTOR_HEAP_EXTENSION_NAME))) {
                    VkPhysicalDeviceDescriptorHeapFeaturesEXT *data = (VkPhysicalDeviceDescriptorHeapFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_descriptor_heap_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME))) {
                    VkPhysicalDeviceInlineUniformBlockPropertiesEXT *data = (VkPhysicalDeviceInlineUniformBlockPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_inline_uniform_block_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME))) {
                    VkPhysicalDeviceInlineUniformBlockFeaturesEXT *data = (VkPhysicalDeviceInlineUniformBlockFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_inline_uniform_block_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_BFLOAT16_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_BFLOAT16_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderBfloat16FeaturesKHR *data = (VkPhysicalDeviceShaderBfloat16FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_bfloat_16_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SAMPLE_LOCATIONS_EXTENSION_NAME))) {
                    VkPhysicalDeviceSampleLocationsPropertiesEXT *data = (VkPhysicalDeviceSampleLocationsPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_sample_locations_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME))) {
                    VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT *data = (VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_blend_operation_advanced_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME))) {
                    VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT *data = (VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_blend_operation_advanced_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME))) {
                    VkPhysicalDeviceAccelerationStructurePropertiesKHR *data = (VkPhysicalDeviceAccelerationStructurePropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_acceleration_structure_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME))) {
                    VkPhysicalDeviceAccelerationStructureFeaturesKHR *data = (VkPhysicalDeviceAccelerationStructureFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_acceleration_structure_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME))) {
                    VkPhysicalDeviceRayTracingPipelinePropertiesKHR *data = (VkPhysicalDeviceRayTracingPipelinePropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_ray_tracing_pipeline_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME))) {
                    VkPhysicalDeviceRayTracingPipelineFeaturesKHR *data = (VkPhysicalDeviceRayTracingPipelineFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_ray_tracing_pipeline_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_RAY_QUERY_EXTENSION_NAME))) {
                    VkPhysicalDeviceRayQueryFeaturesKHR *data = (VkPhysicalDeviceRayQueryFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_ray_query_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_SHADER_SM_BUILTINS_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderSMBuiltinsPropertiesNV *data = (VkPhysicalDeviceShaderSMBuiltinsPropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_smbuiltins_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_SHADER_SM_BUILTINS_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV *data = (VkPhysicalDeviceShaderSMBuiltinsFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_smbuiltins_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME))) {
                    VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR *data = (VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_sampler_ycbcr_conversion_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME))) {
                    VkPhysicalDeviceDescriptorIndexingPropertiesEXT *data = (VkPhysicalDeviceDescriptorIndexingPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_descriptor_indexing_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME))) {
                    VkPhysicalDeviceDescriptorIndexingFeaturesEXT *data = (VkPhysicalDeviceDescriptorIndexingFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_descriptor_indexing_features_;
                    data->pNext = pNext;
                }
                break;
#ifdef VK_ENABLE_BETA_EXTENSIONS
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME))) {
                    VkPhysicalDevicePortabilitySubsetFeaturesKHR *data = (VkPhysicalDevicePortabilitySubsetFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_portability_subset_features_;
                    data->pNext = pNext;
                }
                break;
#endif // VK_ENABLE_BETA_EXTENSIONS
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME))) {
                    VkPhysicalDeviceShadingRateImagePropertiesNV *data = (VkPhysicalDeviceShadingRateImagePropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shading_rate_image_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME))) {
                    VkPhysicalDeviceShadingRateImageFeaturesNV *data = (VkPhysicalDeviceShadingRateImageFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shading_rate_image_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_RAY_TRACING_EXTENSION_NAME))) {
                    VkPhysicalDeviceRayTracingPropertiesNV *data = (VkPhysicalDeviceRayTracingPropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_ray_tracing_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_REPRESENTATIVE_FRAGMENT_TEST_EXTENSION_NAME))) {
                    VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV *data = (VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_representative_fragment_test_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_MAINTENANCE_3_EXTENSION_NAME))) {
                    VkPhysicalDeviceMaintenance3PropertiesKHR *data = (VkPhysicalDeviceMaintenance3PropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_maintenance_3_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_CONVERSION_FEATURES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_COOPERATIVE_MATRIX_CONVERSION_EXTENSION_NAME))) {
                    VkPhysicalDeviceCooperativeMatrixConversionFeaturesQCOM *data = (VkPhysicalDeviceCooperativeMatrixConversionFeaturesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_cooperative_matrix_conversion_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ELAPSED_TIMER_QUERY_FEATURES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_ELAPSED_TIMER_QUERY_EXTENSION_NAME))) {
                    VkPhysicalDeviceElapsedTimerQueryFeaturesQCOM *data = (VkPhysicalDeviceElapsedTimerQueryFeaturesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_elapsed_timer_query_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR *data = (VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_subgroup_extended_types_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_8BIT_STORAGE_EXTENSION_NAME))) {
                    VkPhysicalDevice8BitStorageFeaturesKHR *data = (VkPhysicalDevice8BitStorageFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_8_bit_storage_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME))) {
                    VkPhysicalDeviceExternalMemoryHostPropertiesEXT *data = (VkPhysicalDeviceExternalMemoryHostPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_external_memory_host_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderAtomicInt64FeaturesKHR *data = (VkPhysicalDeviceShaderAtomicInt64FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_atomic_int_64_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_CLOCK_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderClockFeaturesKHR *data = (VkPhysicalDeviceShaderClockFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_clock_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_AMD_SHADER_CORE_PROPERTIES_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderCorePropertiesAMD *data = (VkPhysicalDeviceShaderCorePropertiesAMD *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_core_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME))) {
                    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *data = (VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_vertex_attribute_divisor_properties_ext_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME))) {
                    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *data = (VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_vertex_attribute_divisor_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME))) {
                    VkPhysicalDeviceDriverPropertiesKHR *data = (VkPhysicalDeviceDriverPropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_driver_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME))) {
                    VkPhysicalDeviceFloatControlsPropertiesKHR *data = (VkPhysicalDeviceFloatControlsPropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_float_controls_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME))) {
                    VkPhysicalDeviceDepthStencilResolvePropertiesKHR *data = (VkPhysicalDeviceDepthStencilResolvePropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_depth_stencil_resolve_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME))) {
                    VkPhysicalDeviceComputeShaderDerivativesFeaturesNV *data = (VkPhysicalDeviceComputeShaderDerivativesFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_compute_shader_derivatives_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_MESH_SHADER_EXTENSION_NAME))) {
                    VkPhysicalDeviceMeshShaderPropertiesNV *data = (VkPhysicalDeviceMeshShaderPropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_mesh_shader_properties_nv_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_MESH_SHADER_EXTENSION_NAME))) {
                    VkPhysicalDeviceMeshShaderFeaturesNV *data = (VkPhysicalDeviceMeshShaderFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_mesh_shader_features_nv_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME))) {
                    VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV *data = (VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_fragment_shader_barycentric_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderImageFootprintFeaturesNV *data = (VkPhysicalDeviceShaderImageFootprintFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_image_footprint_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME))) {
                    VkPhysicalDeviceExclusiveScissorFeaturesNV *data = (VkPhysicalDeviceExclusiveScissorFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_exclusive_scissor_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME))) {
                    VkPhysicalDeviceTimelineSemaphorePropertiesKHR *data = (VkPhysicalDeviceTimelineSemaphorePropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_timeline_semaphore_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME))) {
                    VkPhysicalDeviceTimelineSemaphoreFeaturesKHR *data = (VkPhysicalDeviceTimelineSemaphoreFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_timeline_semaphore_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_TIMING_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_PRESENT_TIMING_EXTENSION_NAME))) {
                    VkPhysicalDevicePresentTimingFeaturesEXT *data = (VkPhysicalDevicePresentTimingFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_present_timing_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL *data = (VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_integer_functions_2_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME))) {
                    VkPhysicalDeviceVulkanMemoryModelFeaturesKHR *data = (VkPhysicalDeviceVulkanMemoryModelFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_vulkan_memory_model_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_PCI_BUS_INFO_EXTENSION_NAME))) {
                    VkPhysicalDevicePCIBusInfoPropertiesEXT *data = (VkPhysicalDevicePCIBusInfoPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_pcibus_info_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_TERMINATE_INVOCATION_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR *data = (VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_terminate_invocation_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME))) {
                    VkPhysicalDeviceFragmentDensityMapPropertiesEXT *data = (VkPhysicalDeviceFragmentDensityMapPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_fragment_density_map_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME))) {
                    VkPhysicalDeviceFragmentDensityMapFeaturesEXT *data = (VkPhysicalDeviceFragmentDensityMapFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_fragment_density_map_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME))) {
                    VkPhysicalDeviceScalarBlockLayoutFeaturesEXT *data = (VkPhysicalDeviceScalarBlockLayoutFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_scalar_block_layout_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME))) {
                    VkPhysicalDeviceSubgroupSizeControlPropertiesEXT *data = (VkPhysicalDeviceSubgroupSizeControlPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_subgroup_size_control_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME))) {
                    VkPhysicalDeviceSubgroupSizeControlFeaturesEXT *data = (VkPhysicalDeviceSubgroupSizeControlFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_subgroup_size_control_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME))) {
                    VkPhysicalDeviceFragmentShadingRatePropertiesKHR *data = (VkPhysicalDeviceFragmentShadingRatePropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_fragment_shading_rate_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME))) {
                    VkPhysicalDeviceFragmentShadingRateFeaturesKHR *data = (VkPhysicalDeviceFragmentShadingRateFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_fragment_shading_rate_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_AMD_SHADER_CORE_PROPERTIES_2_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderCoreProperties2AMD *data = (VkPhysicalDeviceShaderCoreProperties2AMD *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_core_properties_2_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME))) {
                    VkPhysicalDeviceCoherentMemoryFeaturesAMD *data = (VkPhysicalDeviceCoherentMemoryFeaturesAMD *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_coherent_memory_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CONSTANT_DATA_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_CONSTANT_DATA_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderConstantDataFeaturesKHR *data = (VkPhysicalDeviceShaderConstantDataFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_constant_data_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME))) {
                    VkPhysicalDeviceDynamicRenderingLocalReadFeaturesKHR *data = (VkPhysicalDeviceDynamicRenderingLocalReadFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_dynamic_rendering_local_read_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ABORT_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_ABORT_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderAbortPropertiesKHR *data = (VkPhysicalDeviceShaderAbortPropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_abort_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ABORT_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_ABORT_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderAbortFeaturesKHR *data = (VkPhysicalDeviceShaderAbortFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_abort_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SHADER_IMAGE_ATOMIC_INT64_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT *data = (VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_image_atomic_int_64_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_QUAD_CONTROL_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_QUAD_CONTROL_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderQuadControlFeaturesKHR *data = (VkPhysicalDeviceShaderQuadControlFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_quad_control_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME))) {
                    VkPhysicalDeviceMemoryPriorityFeaturesEXT *data = (VkPhysicalDeviceMemoryPriorityFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_memory_priority_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_EXTENSION_NAME))) {
                    VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV *data = (VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_dedicated_allocation_image_aliasing_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME))) {
                    VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR *data = (VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_separate_depth_stencil_layouts_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME))) {
                    VkPhysicalDeviceBufferAddressFeaturesEXT *data = (VkPhysicalDeviceBufferAddressFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_buffer_address_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_PRESENT_WAIT_EXTENSION_NAME))) {
                    VkPhysicalDevicePresentWaitFeaturesKHR *data = (VkPhysicalDevicePresentWaitFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_present_wait_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME))) {
                    VkPhysicalDeviceCooperativeMatrixPropertiesNV *data = (VkPhysicalDeviceCooperativeMatrixPropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_cooperative_matrix_properties_nv_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME))) {
                    VkPhysicalDeviceCooperativeMatrixFeaturesNV *data = (VkPhysicalDeviceCooperativeMatrixFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_cooperative_matrix_features_nv_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_COVERAGE_REDUCTION_MODE_EXTENSION_NAME))) {
                    VkPhysicalDeviceCoverageReductionModeFeaturesNV *data = (VkPhysicalDeviceCoverageReductionModeFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_coverage_reduction_mode_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME))) {
                    VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT *data = (VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_fragment_shader_interlock_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME))) {
                    VkPhysicalDeviceYcbcrImageArraysFeaturesEXT *data = (VkPhysicalDeviceYcbcrImageArraysFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_ycbcr_image_arrays_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME))) {
                    VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR *data = (VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_uniform_buffer_standard_layout_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME))) {
                    VkPhysicalDeviceProvokingVertexPropertiesEXT *data = (VkPhysicalDeviceProvokingVertexPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_provoking_vertex_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME))) {
                    VkPhysicalDeviceProvokingVertexFeaturesEXT *data = (VkPhysicalDeviceProvokingVertexFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_provoking_vertex_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME))) {
                    VkPhysicalDeviceBufferDeviceAddressFeaturesKHR *data = (VkPhysicalDeviceBufferDeviceAddressFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_buffer_device_address_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_LINE_RASTERIZATION_EXTENSION_NAME))) {
                    VkPhysicalDeviceLineRasterizationPropertiesEXT *data = (VkPhysicalDeviceLineRasterizationPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_line_rasterization_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_LINE_RASTERIZATION_EXTENSION_NAME))) {
                    VkPhysicalDeviceLineRasterizationFeaturesEXT *data = (VkPhysicalDeviceLineRasterizationFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_line_rasterization_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderAtomicFloatFeaturesEXT *data = (VkPhysicalDeviceShaderAtomicFloatFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_atomic_float_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME))) {
                    VkPhysicalDeviceHostQueryResetFeaturesEXT *data = (VkPhysicalDeviceHostQueryResetFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_host_query_reset_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_INDEX_TYPE_UINT8_EXTENSION_NAME))) {
                    VkPhysicalDeviceIndexTypeUint8FeaturesEXT *data = (VkPhysicalDeviceIndexTypeUint8FeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_index_type_uint_8_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME))) {
                    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *data = (VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_extended_dynamic_state_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME))) {
                    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR *data = (VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_pipeline_executable_properties_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME))) {
                    VkPhysicalDeviceHostImageCopyPropertiesEXT *data = (VkPhysicalDeviceHostImageCopyPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_host_image_copy_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME))) {
                    VkPhysicalDeviceHostImageCopyFeaturesEXT *data = (VkPhysicalDeviceHostImageCopyFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_host_image_copy_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_MAP_MEMORY_PLACED_EXTENSION_NAME))) {
                    VkPhysicalDeviceMapMemoryPlacedPropertiesEXT *data = (VkPhysicalDeviceMapMemoryPlacedPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_map_memory_placed_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_MAP_MEMORY_PLACED_EXTENSION_NAME))) {
                    VkPhysicalDeviceMapMemoryPlacedFeaturesEXT *data = (VkPhysicalDeviceMapMemoryPlacedFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_map_memory_placed_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SHADER_ATOMIC_FLOAT_2_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT *data = (VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_atomic_float_2_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME))) {
                    VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT *data = (VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_swapchain_maintenance_1_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT *data = (VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_demote_to_helper_invocation_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME))) {
                    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV *data = (VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_device_generated_commands_properties_nv_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME))) {
                    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV *data = (VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_device_generated_commands_features_nv_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_INHERITED_VIEWPORT_SCISSOR_EXTENSION_NAME))) {
                    VkPhysicalDeviceInheritedViewportScissorFeaturesNV *data = (VkPhysicalDeviceInheritedViewportScissorFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_inherited_viewport_scissor_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_INTEGER_DOT_PRODUCT_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR *data = (VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_integer_dot_product_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_INTEGER_DOT_PRODUCT_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR *data = (VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_integer_dot_product_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME))) {
                    VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT *data = (VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_texel_buffer_alignment_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME))) {
                    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *data = (VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_texel_buffer_alignment_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_DEPTH_BIAS_CONTROL_EXTENSION_NAME))) {
                    VkPhysicalDeviceDepthBiasControlFeaturesEXT *data = (VkPhysicalDeviceDepthBiasControlFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_depth_bias_control_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_DEVICE_MEMORY_REPORT_EXTENSION_NAME))) {
                    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT *data = (VkPhysicalDeviceDeviceMemoryReportFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_device_memory_report_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_ROBUSTNESS_2_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_ROBUSTNESS_2_EXTENSION_NAME))) {
                    VkPhysicalDeviceRobustness2PropertiesEXT *data = (VkPhysicalDeviceRobustness2PropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_robustness_2_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_ROBUSTNESS_2_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_ROBUSTNESS_2_EXTENSION_NAME))) {
                    VkPhysicalDeviceRobustness2FeaturesEXT *data = (VkPhysicalDeviceRobustness2FeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_robustness_2_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME))) {
                    VkPhysicalDeviceCustomBorderColorPropertiesEXT *data = (VkPhysicalDeviceCustomBorderColorPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_custom_border_color_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME))) {
                    VkPhysicalDeviceCustomBorderColorFeaturesEXT *data = (VkPhysicalDeviceCustomBorderColorFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_custom_border_color_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_3D_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_TEXTURE_COMPRESSION_ASTC_3D_EXTENSION_NAME))) {
                    VkPhysicalDeviceTextureCompressionASTC3DFeaturesEXT *data = (VkPhysicalDeviceTextureCompressionASTC3DFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_texture_compression_astc_3_dfeatures_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_BARRIER_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_PRESENT_BARRIER_EXTENSION_NAME))) {
                    VkPhysicalDevicePresentBarrierFeaturesNV *data = (VkPhysicalDevicePresentBarrierFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_present_barrier_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_PRESENT_ID_EXTENSION_NAME))) {
                    VkPhysicalDevicePresentIdFeaturesKHR *data = (VkPhysicalDevicePresentIdFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_present_id_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_PRIVATE_DATA_EXTENSION_NAME))) {
                    VkPhysicalDevicePrivateDataFeaturesEXT *data = (VkPhysicalDevicePrivateDataFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_private_data_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME))) {
                    VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT *data = (VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_pipeline_creation_cache_control_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_DEVICE_DIAGNOSTICS_CONFIG_EXTENSION_NAME))) {
                    VkPhysicalDeviceDiagnosticsConfigFeaturesNV *data = (VkPhysicalDeviceDiagnosticsConfigFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_diagnostics_config_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_QUEUE_PERF_HINT_PROPERTIES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_QUEUE_PERF_HINT_EXTENSION_NAME))) {
                    VkPhysicalDeviceQueuePerfHintPropertiesQCOM *data = (VkPhysicalDeviceQueuePerfHintPropertiesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_queue_perf_hint_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_QUEUE_PERF_HINT_FEATURES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_QUEUE_PERF_HINT_EXTENSION_NAME))) {
                    VkPhysicalDeviceQueuePerfHintFeaturesQCOM *data = (VkPhysicalDeviceQueuePerfHintFeaturesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_queue_perf_hint_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_3_FEATURES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_IMAGE_PROCESSING_3_EXTENSION_NAME))) {
                    VkPhysicalDeviceImageProcessing3FeaturesQCOM *data = (VkPhysicalDeviceImageProcessing3FeaturesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_image_processing_3_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MULTIPLE_WAIT_QUEUES_PROPERTIES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_SHADER_MULTIPLE_WAIT_QUEUES_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderMultipleWaitQueuesPropertiesQCOM *data = (VkPhysicalDeviceShaderMultipleWaitQueuesPropertiesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_multiple_wait_queues_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MULTIPLE_WAIT_QUEUES_FEATURES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_SHADER_MULTIPLE_WAIT_QUEUES_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderMultipleWaitQueuesFeaturesQCOM *data = (VkPhysicalDeviceShaderMultipleWaitQueuesFeaturesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_multiple_wait_queues_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SPLIT_BARRIER_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SHADER_SPLIT_BARRIER_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderSplitBarrierPropertiesEXT *data = (VkPhysicalDeviceShaderSplitBarrierPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_split_barrier_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SPLIT_BARRIER_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SHADER_SPLIT_BARRIER_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderSplitBarrierFeaturesEXT *data = (VkPhysicalDeviceShaderSplitBarrierFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_split_barrier_features_;
                    data->pNext = pNext;
                }
                break;
#ifdef VK_ENABLE_BETA_EXTENSIONS
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_PROPERTIES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_CUDA_KERNEL_LAUNCH_EXTENSION_NAME))) {
                    VkPhysicalDeviceCudaKernelLaunchPropertiesNV *data = (VkPhysicalDeviceCudaKernelLaunchPropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_cuda_kernel_launch_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_CUDA_KERNEL_LAUNCH_EXTENSION_NAME))) {
                    VkPhysicalDeviceCudaKernelLaunchFeaturesNV *data = (VkPhysicalDeviceCudaKernelLaunchFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_cuda_kernel_launch_features_;
                    data->pNext = pNext;
                }
                break;
#endif // VK_ENABLE_BETA_EXTENSIONS
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_SHADING_PROPERTIES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_TILE_SHADING_EXTENSION_NAME))) {
                    VkPhysicalDeviceTileShadingPropertiesQCOM *data = (VkPhysicalDeviceTileShadingPropertiesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_tile_shading_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_SHADING_FEATURES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_TILE_SHADING_EXTENSION_NAME))) {
                    VkPhysicalDeviceTileShadingFeaturesQCOM *data = (VkPhysicalDeviceTileShadingFeaturesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_tile_shading_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME))) {
                    VkPhysicalDeviceSynchronization2FeaturesKHR *data = (VkPhysicalDeviceSynchronization2FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_synchronization_2_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME))) {
                    VkPhysicalDeviceDescriptorBufferPropertiesEXT *data = (VkPhysicalDeviceDescriptorBufferPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_descriptor_buffer_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_DENSITY_MAP_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME))) {
                    VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT *data = (VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_descriptor_buffer_density_map_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME))) {
                    VkPhysicalDeviceDescriptorBufferFeaturesEXT *data = (VkPhysicalDeviceDescriptorBufferFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_descriptor_buffer_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_ADDRESS_COMMANDS_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_DEVICE_ADDRESS_COMMANDS_EXTENSION_NAME))) {
                    VkPhysicalDeviceDeviceAddressCommandsFeaturesKHR *data = (VkPhysicalDeviceDeviceAddressCommandsFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_device_address_commands_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_GRAPHICS_PIPELINE_LIBRARY_EXTENSION_NAME))) {
                    VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT *data = (VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_graphics_pipeline_library_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_GRAPHICS_PIPELINE_LIBRARY_EXTENSION_NAME))) {
                    VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT *data = (VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_graphics_pipeline_library_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_FEATURES_AMD:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_AMD_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD *data = (VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_early_and_late_fragment_tests_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME))) {
                    VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR *data = (VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_fragment_shader_barycentric_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR *data = (VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_subgroup_uniform_control_flow_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_EXTENSION_NAME))) {
                    VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR *data = (VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_zero_initialize_workgroup_memory_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_FRAGMENT_SHADING_RATE_ENUMS_EXTENSION_NAME))) {
                    VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV *data = (VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_fragment_shading_rate_enums_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_FRAGMENT_SHADING_RATE_ENUMS_EXTENSION_NAME))) {
                    VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV *data = (VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_fragment_shading_rate_enums_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_RAY_TRACING_MOTION_BLUR_EXTENSION_NAME))) {
                    VkPhysicalDeviceRayTracingMotionBlurFeaturesNV *data = (VkPhysicalDeviceRayTracingMotionBlurFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_ray_tracing_motion_blur_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_MESH_SHADER_EXTENSION_NAME))) {
                    VkPhysicalDeviceMeshShaderPropertiesEXT *data = (VkPhysicalDeviceMeshShaderPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_mesh_shader_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_MESH_SHADER_EXTENSION_NAME))) {
                    VkPhysicalDeviceMeshShaderFeaturesEXT *data = (VkPhysicalDeviceMeshShaderFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_mesh_shader_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_YCBCR_2PLANE_444_FORMATS_EXTENSION_NAME))) {
                    VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT *data = (VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_ycbcr_2_plane_444_formats_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME))) {
                    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT *data = (VkPhysicalDeviceFragmentDensityMap2PropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_fragment_density_map_2_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME))) {
                    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT *data = (VkPhysicalDeviceFragmentDensityMap2FeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_fragment_density_map_2_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME))) {
                    VkPhysicalDeviceImageRobustnessFeaturesEXT *data = (VkPhysicalDeviceImageRobustnessFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_image_robustness_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME))) {
                    VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR *data = (VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_workgroup_memory_explicit_layout_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_IMAGE_COMPRESSION_CONTROL_EXTENSION_NAME))) {
                    VkPhysicalDeviceImageCompressionControlFeaturesEXT *data = (VkPhysicalDeviceImageCompressionControlFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_image_compression_control_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_EXTENSION_NAME))) {
                    VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT *data = (VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_attachment_feedback_loop_layout_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_4444_FORMATS_EXTENSION_NAME))) {
                    VkPhysicalDevice4444FormatsFeaturesEXT *data = (VkPhysicalDevice4444FormatsFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_4444_formats_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_DEVICE_FAULT_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_DEVICE_FAULT_EXTENSION_NAME))) {
                    VkPhysicalDeviceFaultFeaturesEXT *data = (VkPhysicalDeviceFaultFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_fault_features_ext_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME))) {
                    VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM *data = (VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_rasterization_order_attachment_access_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_RGBA10X6_FORMATS_EXTENSION_NAME))) {
                    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT *data = (VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_rgba_10_x_6_formats_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME))) {
                    VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE *data = (VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_mutable_descriptor_type_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME))) {
                    VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT *data = (VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_vertex_input_dynamic_state_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_PHYSICAL_DEVICE_DRM_EXTENSION_NAME))) {
                    VkPhysicalDeviceDrmPropertiesEXT *data = (VkPhysicalDeviceDrmPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_drm_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ADDRESS_BINDING_REPORT_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_DEVICE_ADDRESS_BINDING_REPORT_EXTENSION_NAME))) {
                    VkPhysicalDeviceAddressBindingReportFeaturesEXT *data = (VkPhysicalDeviceAddressBindingReportFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_address_binding_report_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME))) {
                    VkPhysicalDeviceDepthClipControlFeaturesEXT *data = (VkPhysicalDeviceDepthClipControlFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_depth_clip_control_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME))) {
                    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *data = (VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_primitive_topology_list_restart_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_MODE_FIFO_LATEST_READY_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_PRESENT_MODE_FIFO_LATEST_READY_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_PRESENT_MODE_FIFO_LATEST_READY_EXTENSION_NAME))) {
                    VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT *data = (VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_present_mode_fifo_latest_ready_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_HUAWEI_SUBPASS_SHADING_EXTENSION_NAME))) {
                    VkPhysicalDeviceSubpassShadingPropertiesHUAWEI *data = (VkPhysicalDeviceSubpassShadingPropertiesHUAWEI *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_subpass_shading_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_HUAWEI_SUBPASS_SHADING_EXTENSION_NAME))) {
                    VkPhysicalDeviceSubpassShadingFeaturesHUAWEI *data = (VkPhysicalDeviceSubpassShadingFeaturesHUAWEI *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_subpass_shading_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_HUAWEI_INVOCATION_MASK_EXTENSION_NAME))) {
                    VkPhysicalDeviceInvocationMaskFeaturesHUAWEI *data = (VkPhysicalDeviceInvocationMaskFeaturesHUAWEI *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_invocation_mask_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_EXTERNAL_MEMORY_RDMA_EXTENSION_NAME))) {
                    VkPhysicalDeviceExternalMemoryRDMAFeaturesNV *data = (VkPhysicalDeviceExternalMemoryRDMAFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_external_memory_rdmafeatures_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_PIPELINE_PROPERTIES_EXTENSION_NAME))) {
                    VkPhysicalDevicePipelinePropertiesFeaturesEXT *data = (VkPhysicalDevicePipelinePropertiesFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_pipeline_properties_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAME_BOUNDARY_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_FRAME_BOUNDARY_EXTENSION_NAME))) {
                    VkPhysicalDeviceFrameBoundaryFeaturesEXT *data = (VkPhysicalDeviceFrameBoundaryFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_frame_boundary_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_EXTENSION_NAME))) {
                    VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT *data = (VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_multisampled_render_to_single_sampled_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME))) {
                    VkPhysicalDeviceExtendedDynamicState2FeaturesEXT *data = (VkPhysicalDeviceExtendedDynamicState2FeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_extended_dynamic_state_2_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME))) {
                    VkPhysicalDeviceColorWriteEnableFeaturesEXT *data = (VkPhysicalDeviceColorWriteEnableFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_color_write_enable_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_PRIMITIVES_GENERATED_QUERY_EXTENSION_NAME))) {
                    VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *data = (VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_primitives_generated_query_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_RAY_TRACING_MAINTENANCE_1_EXTENSION_NAME))) {
                    VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR *data = (VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_ray_tracing_maintenance_1_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_UNTYPED_POINTERS_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_UNTYPED_POINTERS_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderUntypedPointersFeaturesKHR *data = (VkPhysicalDeviceShaderUntypedPointersFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_untyped_pointers_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_GLOBAL_PRIORITY_QUERY_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME))) {
                    VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT *data = (VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_global_priority_query_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_RGB_CONVERSION_FEATURES_VALVE:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_VALVE_VIDEO_ENCODE_RGB_CONVERSION_EXTENSION_NAME))) {
                    VkPhysicalDeviceVideoEncodeRgbConversionFeaturesVALVE *data = (VkPhysicalDeviceVideoEncodeRgbConversionFeaturesVALVE *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_video_encode_rgb_conversion_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_IMAGE_VIEW_MIN_LOD_EXTENSION_NAME))) {
                    VkPhysicalDeviceImageViewMinLodFeaturesEXT *data = (VkPhysicalDeviceImageViewMinLodFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_image_view_min_lod_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_MULTI_DRAW_EXTENSION_NAME))) {
                    VkPhysicalDeviceMultiDrawPropertiesEXT *data = (VkPhysicalDeviceMultiDrawPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_multi_draw_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_MULTI_DRAW_EXTENSION_NAME))) {
                    VkPhysicalDeviceMultiDrawFeaturesEXT *data = (VkPhysicalDeviceMultiDrawFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_multi_draw_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_IMAGE_2D_VIEW_OF_3D_EXTENSION_NAME))) {
                    VkPhysicalDeviceImage2DViewOf3DFeaturesEXT *data = (VkPhysicalDeviceImage2DViewOf3DFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_image_2_dview_of_3_dfeatures_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SHADER_TILE_IMAGE_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderTileImagePropertiesEXT *data = (VkPhysicalDeviceShaderTileImagePropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_tile_image_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SHADER_TILE_IMAGE_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderTileImageFeaturesEXT *data = (VkPhysicalDeviceShaderTileImageFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_tile_image_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_OPACITY_MICROMAP_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_OPACITY_MICROMAP_EXTENSION_NAME))) {
                    VkPhysicalDeviceOpacityMicromapPropertiesEXT *data = (VkPhysicalDeviceOpacityMicromapPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_opacity_micromap_properties_ext_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_OPACITY_MICROMAP_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_OPACITY_MICROMAP_EXTENSION_NAME))) {
                    VkPhysicalDeviceOpacityMicromapFeaturesEXT *data = (VkPhysicalDeviceOpacityMicromapFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_opacity_micromap_features_ext_;
                    data->pNext = pNext;
                }
                break;
#ifdef VK_ENABLE_BETA_EXTENSIONS
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISPLACEMENT_MICROMAP_PROPERTIES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_DISPLACEMENT_MICROMAP_EXTENSION_NAME))) {
                    VkPhysicalDeviceDisplacementMicromapPropertiesNV *data = (VkPhysicalDeviceDisplacementMicromapPropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_displacement_micromap_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISPLACEMENT_MICROMAP_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_DISPLACEMENT_MICROMAP_EXTENSION_NAME))) {
                    VkPhysicalDeviceDisplacementMicromapFeaturesNV *data = (VkPhysicalDeviceDisplacementMicromapFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_displacement_micromap_features_;
                    data->pNext = pNext;
                }
                break;
#endif // VK_ENABLE_BETA_EXTENSIONS
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_PROPERTIES_HUAWEI:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_HUAWEI_CLUSTER_CULLING_SHADER_EXTENSION_NAME))) {
                    VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI *data = (VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_cluster_culling_shader_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_FEATURES_HUAWEI:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_HUAWEI_CLUSTER_CULLING_SHADER_EXTENSION_NAME))) {
                    VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI *data = (VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_cluster_culling_shader_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_BORDER_COLOR_SWIZZLE_EXTENSION_NAME))) {
                    VkPhysicalDeviceBorderColorSwizzleFeaturesEXT *data = (VkPhysicalDeviceBorderColorSwizzleFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_border_color_swizzle_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_EXTENSION_NAME))) {
                    VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT *data = (VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_pageable_device_local_memory_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_MAINTENANCE_4_EXTENSION_NAME))) {
                    VkPhysicalDeviceMaintenance4PropertiesKHR *data = (VkPhysicalDeviceMaintenance4PropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_maintenance_4_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_MAINTENANCE_4_EXTENSION_NAME))) {
                    VkPhysicalDeviceMaintenance4FeaturesKHR *data = (VkPhysicalDeviceMaintenance4FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_maintenance_4_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_SHADER_CORE_PROPERTIES_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderCorePropertiesARM *data = (VkPhysicalDeviceShaderCorePropertiesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_core_properties_arm_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_SUBGROUP_ROTATE_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderSubgroupRotateFeaturesKHR *data = (VkPhysicalDeviceShaderSubgroupRotateFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_subgroup_rotate_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_PROPERTIES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_SCHEDULING_CONTROLS_EXTENSION_NAME))) {
                    VkPhysicalDeviceSchedulingControlsPropertiesARM *data = (VkPhysicalDeviceSchedulingControlsPropertiesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_scheduling_controls_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_DISPATCH_PARAMETERS_PROPERTIES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_SCHEDULING_CONTROLS_EXTENSION_NAME))) {
                    VkPhysicalDeviceSchedulingControlsDispatchParametersPropertiesARM *data = (VkPhysicalDeviceSchedulingControlsDispatchParametersPropertiesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_scheduling_controls_dispatch_parameters_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_FEATURES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_SCHEDULING_CONTROLS_EXTENSION_NAME))) {
                    VkPhysicalDeviceSchedulingControlsFeaturesARM *data = (VkPhysicalDeviceSchedulingControlsFeaturesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_scheduling_controls_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_SLICED_VIEW_OF_3D_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_IMAGE_SLICED_VIEW_OF_3D_EXTENSION_NAME))) {
                    VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT *data = (VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_image_sliced_view_of_3_dfeatures_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_SET_HOST_MAPPING_FEATURES_VALVE:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_VALVE_DESCRIPTOR_SET_HOST_MAPPING_EXTENSION_NAME))) {
                    VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE *data = (VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_descriptor_set_host_mapping_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_DEPTH_CLAMP_ZERO_ONE_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_DEPTH_CLAMP_ZERO_ONE_EXTENSION_NAME))) {
                    VkPhysicalDeviceDepthClampZeroOneFeaturesEXT *data = (VkPhysicalDeviceDepthClampZeroOneFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_depth_clamp_zero_one_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_NON_SEAMLESS_CUBE_MAP_EXTENSION_NAME))) {
                    VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT *data = (VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_non_seamless_cube_map_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RENDER_PASS_STRIPED_PROPERTIES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_RENDER_PASS_STRIPED_EXTENSION_NAME))) {
                    VkPhysicalDeviceRenderPassStripedPropertiesARM *data = (VkPhysicalDeviceRenderPassStripedPropertiesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_render_pass_striped_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RENDER_PASS_STRIPED_FEATURES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_RENDER_PASS_STRIPED_EXTENSION_NAME))) {
                    VkPhysicalDeviceRenderPassStripedFeaturesARM *data = (VkPhysicalDeviceRenderPassStripedFeaturesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_render_pass_striped_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_PROPERTIES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_FRAGMENT_DENSITY_MAP_OFFSET_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_FRAGMENT_DENSITY_MAP_OFFSET_EXTENSION_NAME))) {
                    VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM *data = (VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_fragment_density_map_offset_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_FRAGMENT_DENSITY_MAP_OFFSET_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_FRAGMENT_DENSITY_MAP_OFFSET_EXTENSION_NAME))) {
                    VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM *data = (VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_fragment_density_map_offset_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_PROPERTIES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_COPY_MEMORY_INDIRECT_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_COPY_MEMORY_INDIRECT_EXTENSION_NAME))) {
                    VkPhysicalDeviceCopyMemoryIndirectPropertiesNV *data = (VkPhysicalDeviceCopyMemoryIndirectPropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_copy_memory_indirect_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_COPY_MEMORY_INDIRECT_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_COPY_MEMORY_INDIRECT_EXTENSION_NAME))) {
                    VkPhysicalDeviceCopyMemoryIndirectFeaturesNV *data = (VkPhysicalDeviceCopyMemoryIndirectFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_copy_memory_indirect_features_nv_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_PROPERTIES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_MEMORY_DECOMPRESSION_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_MEMORY_DECOMPRESSION_EXTENSION_NAME))) {
                    VkPhysicalDeviceMemoryDecompressionPropertiesNV *data = (VkPhysicalDeviceMemoryDecompressionPropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_memory_decompression_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_MEMORY_DECOMPRESSION_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_MEMORY_DECOMPRESSION_EXTENSION_NAME))) {
                    VkPhysicalDeviceMemoryDecompressionFeaturesNV *data = (VkPhysicalDeviceMemoryDecompressionFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_memory_decompression_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_COMPUTE_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_DEVICE_GENERATED_COMMANDS_COMPUTE_EXTENSION_NAME))) {
                    VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV *data = (VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_device_generated_commands_compute_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_LINEAR_SWEPT_SPHERES_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_RAY_TRACING_LINEAR_SWEPT_SPHERES_EXTENSION_NAME))) {
                    VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV *data = (VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_ray_tracing_linear_swept_spheres_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINEAR_COLOR_ATTACHMENT_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_LINEAR_COLOR_ATTACHMENT_EXTENSION_NAME))) {
                    VkPhysicalDeviceLinearColorAttachmentFeaturesNV *data = (VkPhysicalDeviceLinearColorAttachmentFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_linear_color_attachment_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MAXIMAL_RECONVERGENCE_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_MAXIMAL_RECONVERGENCE_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR *data = (VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_maximal_reconvergence_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME))) {
                    VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT *data = (VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_image_compression_control_swapchain_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_PROPERTIES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_IMAGE_PROCESSING_EXTENSION_NAME))) {
                    VkPhysicalDeviceImageProcessingPropertiesQCOM *data = (VkPhysicalDeviceImageProcessingPropertiesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_image_processing_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_FEATURES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_IMAGE_PROCESSING_EXTENSION_NAME))) {
                    VkPhysicalDeviceImageProcessingFeaturesQCOM *data = (VkPhysicalDeviceImageProcessingFeaturesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_image_processing_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_NESTED_COMMAND_BUFFER_EXTENSION_NAME))) {
                    VkPhysicalDeviceNestedCommandBufferPropertiesEXT *data = (VkPhysicalDeviceNestedCommandBufferPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_nested_command_buffer_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_NESTED_COMMAND_BUFFER_EXTENSION_NAME))) {
                    VkPhysicalDeviceNestedCommandBufferFeaturesEXT *data = (VkPhysicalDeviceNestedCommandBufferFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_nested_command_buffer_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME))) {
                    VkPhysicalDeviceExtendedDynamicState3PropertiesEXT *data = (VkPhysicalDeviceExtendedDynamicState3PropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_extended_dynamic_state_3_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME))) {
                    VkPhysicalDeviceExtendedDynamicState3FeaturesEXT *data = (VkPhysicalDeviceExtendedDynamicState3FeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_extended_dynamic_state_3_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SUBPASS_MERGE_FEEDBACK_EXTENSION_NAME))) {
                    VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT *data = (VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_subpass_merge_feedback_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TENSOR_PROPERTIES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_TENSORS_EXTENSION_NAME))) {
                    VkPhysicalDeviceTensorPropertiesARM *data = (VkPhysicalDeviceTensorPropertiesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_tensor_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_TENSOR_PROPERTIES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_TENSORS_EXTENSION_NAME))) {
                    VkPhysicalDeviceDescriptorBufferTensorPropertiesARM *data = (VkPhysicalDeviceDescriptorBufferTensorPropertiesARM *)place;
                    void *pNext = const_cast<void*>(data->pNext);
                    *data = physicalDeviceData->physical_device_descriptor_buffer_tensor_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TENSOR_FEATURES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_TENSORS_EXTENSION_NAME))) {
                    VkPhysicalDeviceTensorFeaturesARM *data = (VkPhysicalDeviceTensorFeaturesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_tensor_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_TENSOR_FEATURES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_TENSORS_EXTENSION_NAME))) {
                    VkPhysicalDeviceDescriptorBufferTensorFeaturesARM *data = (VkPhysicalDeviceDescriptorBufferTensorFeaturesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_descriptor_buffer_tensor_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SHADER_MODULE_IDENTIFIER_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT *data = (VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_module_identifier_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SHADER_MODULE_IDENTIFIER_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT *data = (VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_module_identifier_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_PROPERTIES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_OPTICAL_FLOW_EXTENSION_NAME))) {
                    VkPhysicalDeviceOpticalFlowPropertiesNV *data = (VkPhysicalDeviceOpticalFlowPropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_optical_flow_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_OPTICAL_FLOW_EXTENSION_NAME))) {
                    VkPhysicalDeviceOpticalFlowFeaturesNV *data = (VkPhysicalDeviceOpticalFlowFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_optical_flow_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_LEGACY_DITHERING_EXTENSION_NAME))) {
                    VkPhysicalDeviceLegacyDitheringFeaturesEXT *data = (VkPhysicalDeviceLegacyDitheringFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_legacy_dithering_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_PIPELINE_PROTECTED_ACCESS_EXTENSION_NAME))) {
                    VkPhysicalDevicePipelineProtectedAccessFeaturesEXT *data = (VkPhysicalDevicePipelineProtectedAccessFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_pipeline_protected_access_features_;
                    data->pNext = pNext;
                }
                break;
#ifdef VK_USE_PLATFORM_ANDROID_KHR
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_PROPERTIES_ANDROID:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ANDROID_EXTERNAL_FORMAT_RESOLVE_EXTENSION_NAME))) {
                    VkPhysicalDeviceExternalFormatResolvePropertiesANDROID *data = (VkPhysicalDeviceExternalFormatResolvePropertiesANDROID *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_external_format_resolve_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_FEATURES_ANDROID:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ANDROID_EXTERNAL_FORMAT_RESOLVE_EXTENSION_NAME))) {
                    VkPhysicalDeviceExternalFormatResolveFeaturesANDROID *data = (VkPhysicalDeviceExternalFormatResolveFeaturesANDROID *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_external_format_resolve_features_;
                    data->pNext = pNext;
                }
                break;
#endif // VK_USE_PLATFORM_ANDROID_KHR
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_MAINTENANCE_5_EXTENSION_NAME))) {
                    VkPhysicalDeviceMaintenance5PropertiesKHR *data = (VkPhysicalDeviceMaintenance5PropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_maintenance_5_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_MAINTENANCE_5_EXTENSION_NAME))) {
                    VkPhysicalDeviceMaintenance5FeaturesKHR *data = (VkPhysicalDeviceMaintenance5FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_maintenance_5_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ANTI_LAG_FEATURES_AMD:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_AMD_ANTI_LAG_EXTENSION_NAME))) {
                    VkPhysicalDeviceAntiLagFeaturesAMD *data = (VkPhysicalDeviceAntiLagFeaturesAMD *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_anti_lag_features_;
                    data->pNext = pNext;
                }
                break;
#ifdef VK_ENABLE_BETA_EXTENSIONS
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DENSE_GEOMETRY_FORMAT_FEATURES_AMDX:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_AMDX_DENSE_GEOMETRY_FORMAT_EXTENSION_NAME))) {
                    VkPhysicalDeviceDenseGeometryFormatFeaturesAMDX *data = (VkPhysicalDeviceDenseGeometryFormatFeaturesAMDX *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_dense_geometry_format_features_;
                    data->pNext = pNext;
                }
                break;
#endif // VK_ENABLE_BETA_EXTENSIONS
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_2_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_PRESENT_ID_2_EXTENSION_NAME))) {
                    VkPhysicalDevicePresentId2FeaturesKHR *data = (VkPhysicalDevicePresentId2FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_present_id_2_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_2_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_PRESENT_WAIT_2_EXTENSION_NAME))) {
                    VkPhysicalDevicePresentWait2FeaturesKHR *data = (VkPhysicalDevicePresentWait2FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_present_wait_2_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_RAY_TRACING_POSITION_FETCH_EXTENSION_NAME))) {
                    VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR *data = (VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_ray_tracing_position_fetch_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SHADER_OBJECT_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderObjectPropertiesEXT *data = (VkPhysicalDeviceShaderObjectPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_object_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SHADER_OBJECT_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderObjectFeaturesEXT *data = (VkPhysicalDeviceShaderObjectFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_object_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_BINARY_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_PIPELINE_BINARY_EXTENSION_NAME))) {
                    VkPhysicalDevicePipelineBinaryPropertiesKHR *data = (VkPhysicalDevicePipelineBinaryPropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_pipeline_binary_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_BINARY_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_PIPELINE_BINARY_EXTENSION_NAME))) {
                    VkPhysicalDevicePipelineBinaryFeaturesKHR *data = (VkPhysicalDevicePipelineBinaryFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_pipeline_binary_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_PROPERTIES_FEATURES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_TILE_PROPERTIES_EXTENSION_NAME))) {
                    VkPhysicalDeviceTilePropertiesFeaturesQCOM *data = (VkPhysicalDeviceTilePropertiesFeaturesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_tile_properties_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_SEC_AMIGO_PROFILING_EXTENSION_NAME))) {
                    VkPhysicalDeviceAmigoProfilingFeaturesSEC *data = (VkPhysicalDeviceAmigoProfilingFeaturesSEC *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_amigo_profiling_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_MULTIVIEW_PER_VIEW_VIEWPORTS_EXTENSION_NAME))) {
                    VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM *data = (VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_multiview_per_view_viewports_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME))) {
                    VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV *data = (VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_ray_tracing_invocation_reorder_properties_nv_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME))) {
                    VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV *data = (VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_ray_tracing_invocation_reorder_features_nv_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_VECTOR_PROPERTIES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_COOPERATIVE_VECTOR_EXTENSION_NAME))) {
                    VkPhysicalDeviceCooperativeVectorPropertiesNV *data = (VkPhysicalDeviceCooperativeVectorPropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_cooperative_vector_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_VECTOR_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_COOPERATIVE_VECTOR_EXTENSION_NAME))) {
                    VkPhysicalDeviceCooperativeVectorFeaturesNV *data = (VkPhysicalDeviceCooperativeVectorFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_cooperative_vector_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_SPARSE_ADDRESS_SPACE_PROPERTIES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_EXTENDED_SPARSE_ADDRESS_SPACE_EXTENSION_NAME))) {
                    VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV *data = (VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_extended_sparse_address_space_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_SPARSE_ADDRESS_SPACE_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_EXTENDED_SPARSE_ADDRESS_SPACE_EXTENSION_NAME))) {
                    VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV *data = (VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_extended_sparse_address_space_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_LEGACY_VERTEX_ATTRIBUTES_EXTENSION_NAME))) {
                    VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT *data = (VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_legacy_vertex_attributes_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_LEGACY_VERTEX_ATTRIBUTES_EXTENSION_NAME))) {
                    VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT *data = (VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_legacy_vertex_attributes_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_PROPERTIES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_SHADER_CORE_BUILTINS_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM *data = (VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_core_builtins_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_FEATURES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_SHADER_CORE_BUILTINS_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM *data = (VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_core_builtins_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_LIBRARY_GROUP_HANDLES_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_PIPELINE_LIBRARY_GROUP_HANDLES_EXTENSION_NAME))) {
                    VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT *data = (VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_pipeline_library_group_handles_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_EXTENSION_NAME))) {
                    VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT *data = (VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_dynamic_rendering_unused_attachments_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INTERNALLY_SYNCHRONIZED_QUEUES_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_INTERNALLY_SYNCHRONIZED_QUEUES_EXTENSION_NAME))) {
                    VkPhysicalDeviceInternallySynchronizedQueuesFeaturesKHR *data = (VkPhysicalDeviceInternallySynchronizedQueuesFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_internally_synchronized_queues_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_COOPERATIVE_MATRIX_EXTENSION_NAME))) {
                    VkPhysicalDeviceCooperativeMatrixPropertiesKHR *data = (VkPhysicalDeviceCooperativeMatrixPropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_cooperative_matrix_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_COOPERATIVE_MATRIX_EXTENSION_NAME))) {
                    VkPhysicalDeviceCooperativeMatrixFeaturesKHR *data = (VkPhysicalDeviceCooperativeMatrixFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_cooperative_matrix_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DATA_GRAPH_FEATURES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_DATA_GRAPH_EXTENSION_NAME))) {
                    VkPhysicalDeviceDataGraphFeaturesARM *data = (VkPhysicalDeviceDataGraphFeaturesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_data_graph_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_RENDER_AREAS_FEATURES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_MULTIVIEW_PER_VIEW_RENDER_AREAS_EXTENSION_NAME))) {
                    VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM *data = (VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_multiview_per_view_render_areas_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME))) {
                    VkPhysicalDeviceComputeShaderDerivativesPropertiesKHR *data = (VkPhysicalDeviceComputeShaderDerivativesPropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_compute_shader_derivatives_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_AV1_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_VIDEO_ENCODE_AV1_EXTENSION_NAME))) {
                    VkPhysicalDeviceVideoEncodeAV1FeaturesKHR *data = (VkPhysicalDeviceVideoEncodeAV1FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_video_encode_av_1_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_DECODE_VP9_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_VIDEO_DECODE_VP9_EXTENSION_NAME))) {
                    VkPhysicalDeviceVideoDecodeVP9FeaturesKHR *data = (VkPhysicalDeviceVideoDecodeVP9FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_video_decode_vp_9_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_VIDEO_MAINTENANCE_1_EXTENSION_NAME))) {
                    VkPhysicalDeviceVideoMaintenance1FeaturesKHR *data = (VkPhysicalDeviceVideoMaintenance1FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_video_maintenance_1_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PER_STAGE_DESCRIPTOR_SET_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_PER_STAGE_DESCRIPTOR_SET_EXTENSION_NAME))) {
                    VkPhysicalDevicePerStageDescriptorSetFeaturesNV *data = (VkPhysicalDevicePerStageDescriptorSetFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_per_stage_descriptor_set_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_2_PROPERTIES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_IMAGE_PROCESSING_2_EXTENSION_NAME))) {
                    VkPhysicalDeviceImageProcessing2PropertiesQCOM *data = (VkPhysicalDeviceImageProcessing2PropertiesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_image_processing_2_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_2_FEATURES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_IMAGE_PROCESSING_2_EXTENSION_NAME))) {
                    VkPhysicalDeviceImageProcessing2FeaturesQCOM *data = (VkPhysicalDeviceImageProcessing2FeaturesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_image_processing_2_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_WEIGHTS_FEATURES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_FILTER_CUBIC_WEIGHTS_EXTENSION_NAME))) {
                    VkPhysicalDeviceCubicWeightsFeaturesQCOM *data = (VkPhysicalDeviceCubicWeightsFeaturesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_cubic_weights_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_DEGAMMA_FEATURES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_YCBCR_DEGAMMA_EXTENSION_NAME))) {
                    VkPhysicalDeviceYcbcrDegammaFeaturesQCOM *data = (VkPhysicalDeviceYcbcrDegammaFeaturesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_ycbcr_degamma_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_CLAMP_FEATURES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_FILTER_CUBIC_CLAMP_EXTENSION_NAME))) {
                    VkPhysicalDeviceCubicClampFeaturesQCOM *data = (VkPhysicalDeviceCubicClampFeaturesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_cubic_clamp_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_EXTENSION_NAME))) {
                    VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT *data = (VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_attachment_feedback_loop_dynamic_state_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME))) {
                    VkPhysicalDeviceVertexAttributeDivisorPropertiesKHR *data = (VkPhysicalDeviceVertexAttributeDivisorPropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_vertex_attribute_divisor_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFIED_IMAGE_LAYOUTS_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_UNIFIED_IMAGE_LAYOUTS_EXTENSION_NAME))) {
                    VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR *data = (VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_unified_image_layouts_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_FLOAT_CONTROLS_2_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderFloatControls2FeaturesKHR *data = (VkPhysicalDeviceShaderFloatControls2FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_float_controls_2_features_;
                    data->pNext = pNext;
                }
                break;
#ifdef VK_USE_PLATFORM_SCREEN_QNX
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_SCREEN_BUFFER_FEATURES_QNX:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QNX_EXTERNAL_MEMORY_SCREEN_BUFFER_EXTENSION_NAME))) {
                    VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX *data = (VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_external_memory_screen_buffer_features_;
                    data->pNext = pNext;
                }
                break;
#endif // VK_USE_PLATFORM_SCREEN_QNX
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_DRIVER_PROPERTIES_MSFT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_MSFT_LAYERED_DRIVER_EXTENSION_NAME))) {
                    VkPhysicalDeviceLayeredDriverPropertiesMSFT *data = (VkPhysicalDeviceLayeredDriverPropertiesMSFT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_layered_driver_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_EXPECT_ASSUME_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderExpectAssumeFeaturesKHR *data = (VkPhysicalDeviceShaderExpectAssumeFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_expect_assume_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_MAINTENANCE_6_EXTENSION_NAME))) {
                    VkPhysicalDeviceMaintenance6PropertiesKHR *data = (VkPhysicalDeviceMaintenance6PropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_maintenance_6_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_MAINTENANCE_6_EXTENSION_NAME))) {
                    VkPhysicalDeviceMaintenance6FeaturesKHR *data = (VkPhysicalDeviceMaintenance6FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_maintenance_6_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_POOL_OVERALLOCATION_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_DESCRIPTOR_POOL_OVERALLOCATION_EXTENSION_NAME))) {
                    VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV *data = (VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_descriptor_pool_overallocation_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_MEMORY_HEAP_PROPERTIES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_TILE_MEMORY_HEAP_EXTENSION_NAME))) {
                    VkPhysicalDeviceTileMemoryHeapPropertiesQCOM *data = (VkPhysicalDeviceTileMemoryHeapPropertiesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_tile_memory_heap_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_MEMORY_HEAP_FEATURES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_TILE_MEMORY_HEAP_EXTENSION_NAME))) {
                    VkPhysicalDeviceTileMemoryHeapFeaturesQCOM *data = (VkPhysicalDeviceTileMemoryHeapFeaturesQCOM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_tile_memory_heap_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_COPY_MEMORY_INDIRECT_EXTENSION_NAME))) {
                    VkPhysicalDeviceCopyMemoryIndirectFeaturesKHR *data = (VkPhysicalDeviceCopyMemoryIndirectFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_copy_memory_indirect_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_INTRA_REFRESH_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_VIDEO_ENCODE_INTRA_REFRESH_EXTENSION_NAME))) {
                    VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR *data = (VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_video_encode_intra_refresh_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_QUANTIZATION_MAP_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_VIDEO_ENCODE_QUANTIZATION_MAP_EXTENSION_NAME))) {
                    VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR *data = (VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_video_encode_quantization_map_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAW_ACCESS_CHAINS_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_RAW_ACCESS_CHAINS_EXTENSION_NAME))) {
                    VkPhysicalDeviceRawAccessChainsFeaturesNV *data = (VkPhysicalDeviceRawAccessChainsFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_raw_access_chains_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_COMPUTE_QUEUE_PROPERTIES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_EXTERNAL_COMPUTE_QUEUE_EXTENSION_NAME))) {
                    VkPhysicalDeviceExternalComputeQueuePropertiesNV *data = (VkPhysicalDeviceExternalComputeQueuePropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_external_compute_queue_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR *data = (VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_relaxed_extended_instruction_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMMAND_BUFFER_INHERITANCE_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_COMMAND_BUFFER_INHERITANCE_EXTENSION_NAME))) {
                    VkPhysicalDeviceCommandBufferInheritanceFeaturesNV *data = (VkPhysicalDeviceCommandBufferInheritanceFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_command_buffer_inheritance_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_7_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_MAINTENANCE_7_EXTENSION_NAME))) {
                    VkPhysicalDeviceMaintenance7PropertiesKHR *data = (VkPhysicalDeviceMaintenance7PropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_maintenance_7_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_7_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_MAINTENANCE_7_EXTENSION_NAME))) {
                    VkPhysicalDeviceMaintenance7FeaturesKHR *data = (VkPhysicalDeviceMaintenance7FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_maintenance_7_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT16_VECTOR_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_SHADER_ATOMIC_FLOAT16_VECTOR_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV *data = (VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_atomic_float_16_vector_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_REPLICATED_COMPOSITES_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SHADER_REPLICATED_COMPOSITES_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT *data = (VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_replicated_composites_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT8_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SHADER_FLOAT8_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderFloat8FeaturesEXT *data = (VkPhysicalDeviceShaderFloat8FeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_float_8_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_VALIDATION_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_RAY_TRACING_VALIDATION_EXTENSION_NAME))) {
                    VkPhysicalDeviceRayTracingValidationFeaturesNV *data = (VkPhysicalDeviceRayTracingValidationFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_ray_tracing_validation_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_ACCELERATION_STRUCTURE_PROPERTIES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_CLUSTER_ACCELERATION_STRUCTURE_EXTENSION_NAME))) {
                    VkPhysicalDeviceClusterAccelerationStructurePropertiesNV *data = (VkPhysicalDeviceClusterAccelerationStructurePropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_cluster_acceleration_structure_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_ACCELERATION_STRUCTURE_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_CLUSTER_ACCELERATION_STRUCTURE_EXTENSION_NAME))) {
                    VkPhysicalDeviceClusterAccelerationStructureFeaturesNV *data = (VkPhysicalDeviceClusterAccelerationStructureFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_cluster_acceleration_structure_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PARTITIONED_ACCELERATION_STRUCTURE_PROPERTIES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_PARTITIONED_ACCELERATION_STRUCTURE_EXTENSION_NAME))) {
                    VkPhysicalDevicePartitionedAccelerationStructurePropertiesNV *data = (VkPhysicalDevicePartitionedAccelerationStructurePropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_partitioned_acceleration_structure_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PARTITIONED_ACCELERATION_STRUCTURE_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_PARTITIONED_ACCELERATION_STRUCTURE_EXTENSION_NAME))) {
                    VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV *data = (VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_partitioned_acceleration_structure_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME))) {
                    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT *data = (VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_device_generated_commands_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME))) {
                    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT *data = (VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_device_generated_commands_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_DEVICE_FAULT_EXTENSION_NAME))) {
                    VkPhysicalDeviceFaultPropertiesKHR *data = (VkPhysicalDeviceFaultPropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_fault_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_DEVICE_FAULT_EXTENSION_NAME))) {
                    VkPhysicalDeviceFaultFeaturesKHR *data = (VkPhysicalDeviceFaultFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_fault_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_8_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_MAINTENANCE_8_EXTENSION_NAME))) {
                    VkPhysicalDeviceMaintenance8FeaturesKHR *data = (VkPhysicalDeviceMaintenance8FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_maintenance_8_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_PROPERTIES_MESA:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_MESA_IMAGE_ALIGNMENT_CONTROL_EXTENSION_NAME))) {
                    VkPhysicalDeviceImageAlignmentControlPropertiesMESA *data = (VkPhysicalDeviceImageAlignmentControlPropertiesMESA *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_image_alignment_control_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_FEATURES_MESA:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_MESA_IMAGE_ALIGNMENT_CONTROL_EXTENSION_NAME))) {
                    VkPhysicalDeviceImageAlignmentControlFeaturesMESA *data = (VkPhysicalDeviceImageAlignmentControlFeaturesMESA *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_image_alignment_control_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FMA_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_SHADER_FMA_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderFmaFeaturesKHR *data = (VkPhysicalDeviceShaderFmaFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_fma_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_CONSTANT_BANK_PROPERTIES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_PUSH_CONSTANT_BANK_EXTENSION_NAME))) {
                    VkPhysicalDevicePushConstantBankPropertiesNV *data = (VkPhysicalDevicePushConstantBankPropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_push_constant_bank_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_CONSTANT_BANK_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_PUSH_CONSTANT_BANK_EXTENSION_NAME))) {
                    VkPhysicalDevicePushConstantBankFeaturesNV *data = (VkPhysicalDevicePushConstantBankFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_push_constant_bank_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME))) {
                    VkPhysicalDeviceRayTracingInvocationReorderPropertiesEXT *data = (VkPhysicalDeviceRayTracingInvocationReorderPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_ray_tracing_invocation_reorder_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME))) {
                    VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT *data = (VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_ray_tracing_invocation_reorder_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_CONTROL_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_DEPTH_CLAMP_CONTROL_EXTENSION_NAME))) {
                    VkPhysicalDeviceDepthClampControlFeaturesEXT *data = (VkPhysicalDeviceDepthClampControlFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_depth_clamp_control_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_9_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_MAINTENANCE_9_EXTENSION_NAME))) {
                    VkPhysicalDeviceMaintenance9PropertiesKHR *data = (VkPhysicalDeviceMaintenance9PropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_maintenance_9_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_9_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_MAINTENANCE_9_EXTENSION_NAME))) {
                    VkPhysicalDeviceMaintenance9FeaturesKHR *data = (VkPhysicalDeviceMaintenance9FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_maintenance_9_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_2_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_VIDEO_MAINTENANCE_2_EXTENSION_NAME))) {
                    VkPhysicalDeviceVideoMaintenance2FeaturesKHR *data = (VkPhysicalDeviceVideoMaintenance2FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_video_maintenance_2_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HDR_VIVID_FEATURES_HUAWEI:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_HUAWEI_HDR_VIVID_EXTENSION_NAME))) {
                    VkPhysicalDeviceHdrVividFeaturesHUAWEI *data = (VkPhysicalDeviceHdrVividFeaturesHUAWEI *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_hdr_vivid_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_2_PROPERTIES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_COOPERATIVE_MATRIX_2_EXTENSION_NAME))) {
                    VkPhysicalDeviceCooperativeMatrix2PropertiesNV *data = (VkPhysicalDeviceCooperativeMatrix2PropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_cooperative_matrix_2_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_2_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_COOPERATIVE_MATRIX_2_EXTENSION_NAME))) {
                    VkPhysicalDeviceCooperativeMatrix2FeaturesNV *data = (VkPhysicalDeviceCooperativeMatrix2FeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_cooperative_matrix_2_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_OPACITY_MICROMAP_FEATURES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_PIPELINE_OPACITY_MICROMAP_EXTENSION_NAME))) {
                    VkPhysicalDevicePipelineOpacityMicromapFeaturesARM *data = (VkPhysicalDevicePipelineOpacityMicromapFeaturesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_pipeline_opacity_micromap_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_FEEDBACK_2_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_VIDEO_ENCODE_FEEDBACK_2_EXTENSION_NAME))) {
                    VkPhysicalDeviceVideoEncodeFeedback2FeaturesKHR *data = (VkPhysicalDeviceVideoEncodeFeedback2FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_video_encode_feedback_2_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_COUNTERS_BY_REGION_PROPERTIES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_PERFORMANCE_COUNTERS_BY_REGION_EXTENSION_NAME))) {
                    VkPhysicalDevicePerformanceCountersByRegionPropertiesARM *data = (VkPhysicalDevicePerformanceCountersByRegionPropertiesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_performance_counters_by_region_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_COUNTERS_BY_REGION_FEATURES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_PERFORMANCE_COUNTERS_BY_REGION_EXTENSION_NAME))) {
                    VkPhysicalDevicePerformanceCountersByRegionFeaturesARM *data = (VkPhysicalDevicePerformanceCountersByRegionFeaturesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_performance_counters_by_region_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INSTRUMENTATION_PROPERTIES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_SHADER_INSTRUMENTATION_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderInstrumentationPropertiesARM *data = (VkPhysicalDeviceShaderInstrumentationPropertiesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_instrumentation_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INSTRUMENTATION_FEATURES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_SHADER_INSTRUMENTATION_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderInstrumentationFeaturesARM *data = (VkPhysicalDeviceShaderInstrumentationFeaturesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_instrumentation_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_ROBUSTNESS_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_VERTEX_ATTRIBUTE_ROBUSTNESS_EXTENSION_NAME) || PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_MAINTENANCE_9_EXTENSION_NAME))) {
                    VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT *data = (VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_vertex_attribute_robustness_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FORMAT_PACK_FEATURES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_FORMAT_PACK_EXTENSION_NAME))) {
                    VkPhysicalDeviceFormatPackFeaturesARM *data = (VkPhysicalDeviceFormatPackFeaturesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_format_pack_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_LAYERED_PROPERTIES_VALVE:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_VALVE_FRAGMENT_DENSITY_MAP_LAYERED_EXTENSION_NAME))) {
                    VkPhysicalDeviceFragmentDensityMapLayeredPropertiesVALVE *data = (VkPhysicalDeviceFragmentDensityMapLayeredPropertiesVALVE *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_fragment_density_map_layered_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_LAYERED_FEATURES_VALVE:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_VALVE_FRAGMENT_DENSITY_MAP_LAYERED_EXTENSION_NAME))) {
                    VkPhysicalDeviceFragmentDensityMapLayeredFeaturesVALVE *data = (VkPhysicalDeviceFragmentDensityMapLayeredFeaturesVALVE *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_fragment_density_map_layered_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_METERING_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_PRESENT_METERING_EXTENSION_NAME))) {
                    VkPhysicalDevicePresentMeteringFeaturesNV *data = (VkPhysicalDevicePresentMeteringFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_present_metering_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SWAPCHAIN_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_MULTISAMPLED_RENDER_TO_SWAPCHAIN_EXTENSION_NAME))) {
                    VkPhysicalDeviceMultisampledRenderToSwapchainFeaturesEXT *data = (VkPhysicalDeviceMultisampledRenderToSwapchainFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_multisampled_render_to_swapchain_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_DEVICE_MEMORY_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_ZERO_INITIALIZE_DEVICE_MEMORY_EXTENSION_NAME))) {
                    VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT *data = (VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_zero_initialize_device_memory_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_OPACITY_MICROMAP_EXTENSION_NAME))) {
                    VkPhysicalDeviceOpacityMicromapPropertiesKHR *data = (VkPhysicalDeviceOpacityMicromapPropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_opacity_micromap_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_OPACITY_MICROMAP_EXTENSION_NAME))) {
                    VkPhysicalDeviceOpacityMicromapFeaturesKHR *data = (VkPhysicalDeviceOpacityMicromapFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_opacity_micromap_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_64_BIT_INDEXING_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SHADER_64BIT_INDEXING_EXTENSION_NAME))) {
                    VkPhysicalDeviceShader64BitIndexingFeaturesEXT *data = (VkPhysicalDeviceShader64BitIndexingFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_64_bit_indexing_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_RESOLVE_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_CUSTOM_RESOLVE_EXTENSION_NAME))) {
                    VkPhysicalDeviceCustomResolveFeaturesEXT *data = (VkPhysicalDeviceCustomResolveFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_custom_resolve_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DATA_GRAPH_MODEL_FEATURES_QCOM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_QCOM_DATA_GRAPH_MODEL_EXTENSION_NAME))) {
                    VkPhysicalDeviceDataGraphModelFeaturesQCOM *data = (VkPhysicalDeviceDataGraphModelFeaturesQCOM *)place;
                    void *pNext = const_cast<void*>(data->pNext);
                    *data = physicalDeviceData->physical_device_data_graph_model_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_10_PROPERTIES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_MAINTENANCE_10_EXTENSION_NAME))) {
                    VkPhysicalDeviceMaintenance10PropertiesKHR *data = (VkPhysicalDeviceMaintenance10PropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_maintenance_10_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_10_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_MAINTENANCE_10_EXTENSION_NAME))) {
                    VkPhysicalDeviceMaintenance10FeaturesKHR *data = (VkPhysicalDeviceMaintenance10FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_maintenance_10_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DATA_GRAPH_OPTICAL_FLOW_FEATURES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_DATA_GRAPH_OPTICAL_FLOW_EXTENSION_NAME))) {
                    VkPhysicalDeviceDataGraphOpticalFlowFeaturesARM *data = (VkPhysicalDeviceDataGraphOpticalFlowFeaturesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_data_graph_optical_flow_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_LONG_VECTOR_PROPERTIES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SHADER_LONG_VECTOR_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderLongVectorPropertiesEXT *data = (VkPhysicalDeviceShaderLongVectorPropertiesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_long_vector_properties_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_LONG_VECTOR_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SHADER_LONG_VECTOR_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderLongVectorFeaturesEXT *data = (VkPhysicalDeviceShaderLongVectorFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_long_vector_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CACHE_INCREMENTAL_MODE_FEATURES_SEC:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_SEC_PIPELINE_CACHE_INCREMENTAL_MODE_EXTENSION_NAME))) {
                    VkPhysicalDevicePipelineCacheIncrementalModeFeaturesSEC *data = (VkPhysicalDevicePipelineCacheIncrementalModeFeaturesSEC *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_pipeline_cache_incremental_mode_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_UNIFORM_BUFFER_UNSIZED_ARRAY_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SHADER_UNIFORM_BUFFER_UNSIZED_ARRAY_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderUniformBufferUnsizedArrayFeaturesEXT *data = (VkPhysicalDeviceShaderUniformBufferUnsizedArrayFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_uniform_buffer_unsized_array_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_OCCUPANCY_PRIORITY_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_COMPUTE_OCCUPANCY_PRIORITY_EXTENSION_NAME))) {
                    VkPhysicalDeviceComputeOccupancyPriorityFeaturesNV *data = (VkPhysicalDeviceComputeOccupancyPriorityFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_compute_occupancy_priority_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_11_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_MAINTENANCE_11_EXTENSION_NAME))) {
                    VkPhysicalDeviceMaintenance11FeaturesKHR *data = (VkPhysicalDeviceMaintenance11FeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_maintenance_11_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_PARTITIONED_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SHADER_SUBGROUP_PARTITIONED_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderSubgroupPartitionedFeaturesEXT *data = (VkPhysicalDeviceShaderSubgroupPartitionedFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_subgroup_partitioned_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_FLAGS_FEATURES_KHR:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_KHR_EXTENDED_FLAGS_EXTENSION_NAME))) {
                    VkPhysicalDeviceExtendedFlagsFeaturesKHR *data = (VkPhysicalDeviceExtendedFlagsFeaturesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_extended_flags_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OCP_MICROSCALING_TYPES_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_SHADER_OCP_MICROSCALING_TYPES_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderOCPMicroscalingTypesFeaturesEXT *data = (VkPhysicalDeviceShaderOCPMicroscalingTypesFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_ocpmicroscaling_types_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MIXED_FLOAT_DOT_PRODUCT_FEATURES_VALVE:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_VALVE_SHADER_MIXED_FLOAT_DOT_PRODUCT_EXTENSION_NAME))) {
                    VkPhysicalDeviceShaderMixedFloatDotProductFeaturesVALVE *data = (VkPhysicalDeviceShaderMixedFloatDotProductFeaturesVALVE *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_shader_mixed_float_dot_product_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_THROTTLE_HINT_FEATURES_SEC:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_SEC_THROTTLE_HINT_EXTENSION_NAME))) {
                    VkPhysicalDeviceThrottleHintFeaturesSEC *data = (VkPhysicalDeviceThrottleHintFeaturesSEC *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_throttle_hint_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DATA_GRAPH_NEURAL_ACCELERATOR_STATISTICS_FEATURES_ARM:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_ARM_DATA_GRAPH_NEURAL_ACCELERATOR_STATISTICS_EXTENSION_NAME))) {
                    VkPhysicalDeviceDataGraphNeuralAcceleratorStatisticsFeaturesARM *data = (VkPhysicalDeviceDataGraphNeuralAcceleratorStatisticsFeaturesARM *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_data_graph_neural_accelerator_statistics_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_RESTART_INDEX_FEATURES_EXT:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_EXT_PRIMITIVE_RESTART_INDEX_EXTENSION_NAME))) {
                    VkPhysicalDevicePrimitiveRestartIndexFeaturesEXT *data = (VkPhysicalDevicePrimitiveRestartIndexFeaturesEXT *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_primitive_restart_index_features_;
                    data->pNext = pNext;
                }
                break;
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_DECODE_VECTOR_FEATURES_NV:
                if ((PhysicalDeviceData::HasSimulatedExtension(physicalDeviceData, VK_NV_COOPERATIVE_MATRIX_DECODE_VECTOR_EXTENSION_NAME))) {
                    VkPhysicalDeviceCooperativeMatrixDecodeVectorFeaturesNV *data = (VkPhysicalDeviceCooperativeMatrixDecodeVectorFeaturesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->physical_device_cooperative_matrix_decode_vector_features_;
                    data->pNext = pNext;
                }
                break;
            default:
                break;
        }

        place = structure->pNext;
    }
}

void FillQueueFamilyPropertiesPNextChain(PhysicalDeviceData *physicalDeviceData, VkQueueFamilyProperties2KHR *pQueueFamilyProperties2, uint32_t count) {
    for (uint32_t i = 0; i < count; ++i) {
        void* place = pQueueFamilyProperties2[i].pNext;
        while (place) {
            VkBaseOutStructure *structure = (VkBaseOutStructure *)place;

            switch (structure->sType) {
                case VK_STRUCTURE_TYPE_QUEUE_FAMILY_OWNERSHIP_TRANSFER_PROPERTIES_KHR: {
                    VkQueueFamilyOwnershipTransferPropertiesKHR *data = (VkQueueFamilyOwnershipTransferPropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->arrayof_queue_family_properties_[i].ownership_transfer_properties_;
                    data->pNext = pNext;
                } break;
                case VK_STRUCTURE_TYPE_QUEUE_FAMILY_OPTIMAL_IMAGE_TRANSFER_GRANULARITY_PROPERTIES_KHR: {
                    VkQueueFamilyOptimalImageTransferGranularityPropertiesKHR *data = (VkQueueFamilyOptimalImageTransferGranularityPropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->arrayof_queue_family_properties_[i].optimal_image_transfer_granularity_properties_;
                    data->pNext = pNext;
                } break;
                case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES: {
                    VkQueueFamilyGlobalPriorityProperties *data = (VkQueueFamilyGlobalPriorityProperties *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->arrayof_queue_family_properties_[i].global_priority_properties_;
                    data->pNext = pNext;
                } break;
                case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV: {
                    VkQueueFamilyCheckpointPropertiesNV *data = (VkQueueFamilyCheckpointPropertiesNV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->arrayof_queue_family_properties_[i].checkpoint_properties_;
                    data->pNext = pNext;
                } break;
                case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV: {
                    VkQueueFamilyCheckpointProperties2NV *data = (VkQueueFamilyCheckpointProperties2NV *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->arrayof_queue_family_properties_[i].checkpoint_properties_2_;
                    data->pNext = pNext;
                } break;
                case VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR: {
                    VkQueueFamilyVideoPropertiesKHR *data = (VkQueueFamilyVideoPropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->arrayof_queue_family_properties_[i].video_properties_;
                    data->pNext = pNext;
                } break;
                case VK_STRUCTURE_TYPE_QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR: {
                    VkQueueFamilyQueryResultStatusPropertiesKHR *data = (VkQueueFamilyQueryResultStatusPropertiesKHR *)place;
                    void *pNext = data->pNext;
                    *data = physicalDeviceData->arrayof_queue_family_properties_[i].query_result_status_properties_;
                    data->pNext = pNext;
                } break;
                default:
                    break;
            }

            place = structure->pNext;
        }
    }
}

void FillFormatPropertiesPNextChain(PhysicalDeviceData *physicalDeviceData, void *place, VkFormat format) {
    while (place) {
        VkBaseOutStructure *structure = (VkBaseOutStructure *)place;

        // These switch statements check which struct is in the pNext chain and, if the physical device has the proper extension,
        // fill the struct with any override data provided by the PhysicalDeviceData object.

        switch (structure->sType) {
            case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3: {
                if (!physicalDeviceData->map_of_format_properties_3_.empty()) {
                    VkFormatProperties3 *sp = (VkFormatProperties3 *)place;
                    void *pNext = sp->pNext;
                    *sp = physicalDeviceData->map_of_format_properties_3_[format];
                    sp->pNext = pNext;
                }
            } break;
            default:
                break;
        }

        place = structure->pNext;
    }
}

VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
    std::lock_guard<std::recursive_mutex> lock(global_lock);
    const auto dt = instance_dispatch_table(physicalDevice);

    PhysicalDeviceData *pdd = PhysicalDeviceData::Find(physicalDevice);
    if (pdd) {
        *pProperties = pdd->physical_device_properties_;
    } else {
        dt->GetPhysicalDeviceProperties(physicalDevice, pProperties);
    }
}

void GetPhysicalDeviceProperties2Impl(VkPhysicalDevice physicalDevice,
                                      VkPhysicalDeviceProperties2KHR *pProperties,
                                      bool core) {
    std::lock_guard<std::recursive_mutex> lock(global_lock);
    const auto dt = instance_dispatch_table(physicalDevice);
    if (core) {
        dt->GetPhysicalDeviceProperties2(physicalDevice, pProperties);
    } else {
        dt->GetPhysicalDeviceProperties2KHR(physicalDevice, pProperties);
    }
    GetPhysicalDeviceProperties(physicalDevice, &pProperties->properties);
    PhysicalDeviceData *pdd = PhysicalDeviceData::Find(physicalDevice);
    FillPNextChain(pdd, pProperties->pNext);
}

VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice,
                                                        VkPhysicalDeviceProperties2KHR *pProperties) {
    GetPhysicalDeviceProperties2Impl(physicalDevice, pProperties, true);
}

VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties2KHR(VkPhysicalDevice physicalDevice,
                                                           VkPhysicalDeviceProperties2KHR *pProperties) {
    GetPhysicalDeviceProperties2Impl(physicalDevice, pProperties, false);
}

VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
    std::lock_guard<std::recursive_mutex> lock(global_lock);
    const auto dt = instance_dispatch_table(physicalDevice);

    PhysicalDeviceData *pdd = PhysicalDeviceData::Find(physicalDevice);
    if (pdd) {
        *pFeatures = pdd->physical_device_features_;
    } else {
        dt->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
    }
}

void GetPhysicalDeviceFeatures2Impl(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2KHR *pFeatures, bool core) {
    std::lock_guard<std::recursive_mutex> lock(global_lock);
    const auto dt = instance_dispatch_table(physicalDevice);

    PhysicalDeviceData *pdd = PhysicalDeviceData::Find(physicalDevice);
    if (pdd) {
        ProfileLayerSettings *layer_settings = &JsonLoader::Find(pdd->instance())->layer_settings;
        if (layer_settings->simulate.unknown_feature_values == UNKNOWN_FEATURE_VALUES_DEVICE) {
            if (core) {
                dt->GetPhysicalDeviceFeatures2(physicalDevice, pFeatures);
            } else {
                dt->GetPhysicalDeviceFeatures2KHR(physicalDevice, pFeatures);
            }
        }
        FillPNextChain(pdd, pFeatures->pNext);
    } else {
        if (core) {
            dt->GetPhysicalDeviceFeatures2(physicalDevice, pFeatures);
        } else {
            dt->GetPhysicalDeviceFeatures2KHR(physicalDevice, pFeatures);
        }
    }

    GetPhysicalDeviceFeatures(physicalDevice, &pFeatures->features);
}

VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2KHR *pFeatures) {
    GetPhysicalDeviceFeatures2Impl(physicalDevice, pFeatures, true);
}

VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures2KHR(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2KHR *pFeatures) {
    GetPhysicalDeviceFeatures2Impl(physicalDevice, pFeatures, false);
}

VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
    return EnumerateProperties(kLayerPropertiesCount, kLayerProperties, pCount, pProperties);
}

VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
                                                                    VkExtensionProperties *pProperties) {
    if (pLayerName && !strcmp(pLayerName, kLayerName)) {
        return EnumerateProperties(kInstanceExtensionPropertiesCount, kInstanceExtensionProperties, pCount, pProperties);
    }
    return VK_ERROR_LAYER_NOT_PRESENT;
}

// Per [LALI], EnumerateDeviceLayerProperties() is deprecated.

VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
                                                                  uint32_t *pCount, VkExtensionProperties *pProperties) {
    VkResult result = VK_SUCCESS;
    std::lock_guard<std::recursive_mutex> lock(global_lock);
    const auto dt = instance_dispatch_table(physicalDevice);

    uint32_t pCount_copy = *pCount;

    PhysicalDeviceData *pdd = PhysicalDeviceData::Find(physicalDevice);
    ProfileLayerSettings* layer_settings = &JsonLoader::Find(pdd->instance())->layer_settings;
    if (pLayerName) {
        if (strcmp(pLayerName, kLayerName) == 0)
            result = EnumerateProperties(kDeviceExtensionPropertiesCount, kDeviceExtensionProperties.data(), pCount, pProperties);
        else
            result = dt->EnumerateDeviceExtensionProperties(physicalDevice, pLayerName, pCount, pProperties);
    } else if (pdd == nullptr || (!(layer_settings->simulate.capabilities & SIMULATE_EXTENSIONS_BIT) &&
                                  layer_settings->simulate.exclude_device_extensions.empty())) {
        result = dt->EnumerateDeviceExtensionProperties(physicalDevice, pLayerName, pCount, pProperties);
    } else {
        result = EnumerateExtensions(pdd->simulation_extensions_, pCount, pProperties);
    }

    if (result == VK_SUCCESS && !pLayerName && layer_settings->simulate.emulate_portability &&
        !PhysicalDeviceData::HasSimulatedOrRealExtension(physicalDevice, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME)) {
        if (pProperties) {
            if (pCount_copy >= *pCount + 1) {
                strncpy(pProperties[*pCount].extensionName, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME, VK_MAX_EXTENSION_NAME_SIZE);
                pProperties[*pCount].specVersion = VK_KHR_PORTABILITY_SUBSET_SPEC_VERSION;
                *pCount += 1;
            }
        } else {
            *pCount += 1;
        }
    }

    return result;
}

VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
                                                                  uint32_t *pQueueFamilyPropertyCount,
                                                                  VkQueueFamilyProperties *pQueueFamilyProperties) {
    std::lock_guard<std::recursive_mutex> lock(global_lock);
    const auto dt = instance_dispatch_table(physicalDevice);

    // Are there JSON overrides, or should we call down to return the original values?
    PhysicalDeviceData *pdd = PhysicalDeviceData::Find(physicalDevice);
    const uint32_t src_count = (pdd) ? static_cast<uint32_t>(pdd->arrayof_queue_family_properties_.size()) : 0;
    if (src_count == 0) {
        dt->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
        return;
    }

    // Careful: cannot use EnumerateProperties() here! (because src and dst structs are not the same type)
    if (!pQueueFamilyProperties) {
        *pQueueFamilyPropertyCount = src_count;
        return;
    }
    const uint32_t copy_count = (*pQueueFamilyPropertyCount < src_count) ? *pQueueFamilyPropertyCount : src_count;
    const QueueFamilyProperties *src_props = pdd->arrayof_queue_family_properties_.data();
    for (uint32_t i = 0; i < copy_count; ++i) {
        pQueueFamilyProperties[i] = src_props[i].properties_2.queueFamilyProperties;
    }
    *pQueueFamilyPropertyCount = copy_count;
}

void GetPhysicalDeviceQueueFamilyProperties2Impl(VkPhysicalDevice physicalDevice,
                                                 uint32_t *pQueueFamilyPropertyCount,
                                                 VkQueueFamilyProperties2KHR *pQueueFamilyProperties2,
                                                 bool core) {
    std::lock_guard<std::recursive_mutex> lock(global_lock);
    const auto dt = instance_dispatch_table(physicalDevice);

    // Are there JSON overrides, or should we call down to return the original values?
    PhysicalDeviceData *pdd = PhysicalDeviceData::Find(physicalDevice);
    const uint32_t src_count = (pdd) ? static_cast<uint32_t>(pdd->arrayof_queue_family_properties_.size()) : 0;
    if (src_count == 0) {
        if (core) {
            dt->GetPhysicalDeviceQueueFamilyProperties2(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties2);
        } else {
            dt->GetPhysicalDeviceQueueFamilyProperties2KHR(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties2);
        }
        return;
    }

    if (!pQueueFamilyProperties2) {
        *pQueueFamilyPropertyCount = src_count;
        return;
    }

    // Careful: cannot use EnumerateProperties() here! (because src and dst structs are not the same type)
    const uint32_t copy_count = (*pQueueFamilyPropertyCount < src_count) ? *pQueueFamilyPropertyCount : src_count;
    const QueueFamilyProperties *src_props = pdd->arrayof_queue_family_properties_.data();
    for (uint32_t i = 0; i < copy_count; ++i) {
        pQueueFamilyProperties2[i].queueFamilyProperties = src_props[i].properties_2.queueFamilyProperties;
    }
    *pQueueFamilyPropertyCount = copy_count;
    FillQueueFamilyPropertiesPNextChain(pdd, pQueueFamilyProperties2, copy_count);
}

VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties2KHR(VkPhysicalDevice physicalDevice,
                                                                      uint32_t *pQueueFamilyPropertyCount,
                                                                      VkQueueFamilyProperties2KHR *pQueueFamilyProperties2) {
    GetPhysicalDeviceQueueFamilyProperties2Impl(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties2, false);
}

VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties2(VkPhysicalDevice physicalDevice,
                                                                   uint32_t *pQueueFamilyPropertyCount,
                                                                   VkQueueFamilyProperties2KHR *pQueueFamilyProperties2) {
    GetPhysicalDeviceQueueFamilyProperties2Impl(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties2, true);
}

VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
                                                             VkFormatProperties *pFormatProperties) {
    std::lock_guard<std::recursive_mutex> lock(global_lock);
    const auto dt = instance_dispatch_table(physicalDevice);

    // Are there JSON overrides, or should we call down to return the original values?
    PhysicalDeviceData *pdd = PhysicalDeviceData::Find(physicalDevice);
    ProfileLayerSettings* layer_settings = &JsonLoader::Find(pdd->instance())->layer_settings;

    // Check if Format was excluded
    for (std::size_t j = 0, m = layer_settings->simulate.exclude_formats.size(); j < m; ++j) {
        const std::string &excluded_format = layer_settings->simulate.exclude_formats[j];
        if (excluded_format.empty()) continue;

        if (StringToFormat(excluded_format) == format) {
            *pFormatProperties = VkFormatProperties{};
            return;
        }
    }

    const uint32_t src_count = (pdd) ? static_cast<uint32_t>(pdd->map_of_format_properties_.size()) : 0;
    if (src_count == 0) {
        dt->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
    } else {
        VkFormatProperties device_format = {};
        dt->GetPhysicalDeviceFormatProperties(physicalDevice, format, &device_format);
        const auto iter = pdd->map_of_format_properties_.find(format);

        if ((layer_settings->simulate.capabilities & SIMULATE_FORMATS_BIT)) {
            *pFormatProperties = (iter != pdd->map_of_format_properties_.end()) ? iter->second : VkFormatProperties{};
        } else {
            *pFormatProperties = device_format;
        }

        if (IsFormatSupported(*pFormatProperties) && iter != pdd->map_of_format_properties_.end()) {
            if ((layer_settings->simulate.capabilities & SIMULATE_FORMATS_BIT)) {
                *pFormatProperties = iter->second;
            } else {
                *pFormatProperties = device_format;
            }

            if (!HasFlags(device_format.linearTilingFeatures, pFormatProperties->linearTilingFeatures) ||
                !HasFlags(device_format.optimalTilingFeatures, pFormatProperties->optimalTilingFeatures) ||
                !HasFlags(device_format.bufferFeatures, pFormatProperties->bufferFeatures)) {
                LogMessage(layer_settings, DEBUG_REPORT_WARNING_BIT,
                           "format %s is simulating unsupported features!\n", vkFormatToString(format).c_str());
            }
        }
    }

    LogFlush(layer_settings);
}

void GetPhysicalDeviceFormatProperties2Impl(VkPhysicalDevice physicalDevice, VkFormat format,
                                            VkFormatProperties2KHR *pFormatProperties, bool core) {
    std::lock_guard<std::recursive_mutex> lock(global_lock);
    const auto dt = instance_dispatch_table(physicalDevice);
    if (core) {
        dt->GetPhysicalDeviceFormatProperties2(physicalDevice, format, pFormatProperties);
    } else {
        dt->GetPhysicalDeviceFormatProperties2KHR(physicalDevice, format, pFormatProperties);
    }
    GetPhysicalDeviceFormatProperties(physicalDevice, format, &pFormatProperties->formatProperties);
    PhysicalDeviceData *pdd = PhysicalDeviceData::Find(physicalDevice);
    FillFormatPropertiesPNextChain(pdd, pFormatProperties->pNext, format);
}

VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties2(VkPhysicalDevice physicalDevice, VkFormat format,
                                                              VkFormatProperties2KHR *pFormatProperties) {
    GetPhysicalDeviceFormatProperties2Impl(physicalDevice, format, pFormatProperties, true);
}

VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties2KHR(VkPhysicalDevice physicalDevice, VkFormat format,
                                                                 VkFormatProperties2KHR *pFormatProperties) {
    GetPhysicalDeviceFormatProperties2Impl(physicalDevice, format, pFormatProperties, false);
}

VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
                                                                      VkImageType type, VkImageTiling tiling,
                                                                      VkImageUsageFlags usage, VkImageCreateFlags flags,
                                                                      VkImageFormatProperties *pImageFormatProperties) {
    std::lock_guard<std::recursive_mutex> lock(global_lock);
    const auto dt = instance_dispatch_table(physicalDevice);

    PhysicalDeviceData *pdd = PhysicalDeviceData::Find(physicalDevice);
    ProfileLayerSettings* layer_settings = &JsonLoader::Find(pdd->instance())->layer_settings;

    // Are there JSON overrides, or should we call down to return the original values?
    if (!(layer_settings->simulate.capabilities & SIMULATE_FORMATS_BIT)) {
        return dt->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
                                                          pImageFormatProperties);
    }

    VkFormatProperties fmt_props = {};
    GetPhysicalDeviceFormatProperties(physicalDevice, format, &fmt_props);

    if (!IsFormatSupported(fmt_props)) {
        *pImageFormatProperties = VkImageFormatProperties{};
        return VK_ERROR_FORMAT_NOT_SUPPORTED;
    }

    VkResult result =
        dt->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);

    return result;
}

VkResult GetPhysicalDeviceImageFormatProperties2Impl(
    VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2KHR *pImageFormatInfo,
    VkImageFormatProperties2KHR *pImageFormatProperties, bool core) {
    std::lock_guard<std::recursive_mutex> lock(global_lock);
    const auto dt = instance_dispatch_table(physicalDevice);

    PhysicalDeviceData *pdd = PhysicalDeviceData::Find(physicalDevice);
    ProfileLayerSettings* layer_settings = &JsonLoader::Find(pdd->instance())->layer_settings;

    if (layer_settings->simulate.capabilities & SIMULATE_VIDEO_FORMATS_BIT) {
        // If video profile lists are provided, make sure to only report support for actually supported video formats
        auto p = reinterpret_cast<const VkBaseInStructure*>(pImageFormatInfo);
        while (p != nullptr && p->sType != VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR) {
            p = p->pNext;
        }
        if (p != nullptr) {
            const auto video_profile_list = reinterpret_cast<const VkVideoProfileListInfoKHR*>(p);
            for (uint32_t i = 0; i < video_profile_list->profileCount; ++i) {
                VideoProfileData in_video_profile{};

                // Construct and verify video profile info chain
                in_video_profile.info = VideoProfileInfoChain(&video_profile_list->pProfiles[i]);
                if (!in_video_profile.info.valid) {
                    return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
                }

                auto video_profile_data_it = pdd->set_of_video_profiles_.find(in_video_profile);
                if (video_profile_data_it == pdd->set_of_video_profiles_.end()) {
                    return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
                }

                // VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR is ignored from compatibility perspective
                const VkImageCreateFlags ignored_create_flags = VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR;
                const VkImageCreateFlags image_create_flags = pImageFormatInfo->flags & ~ignored_create_flags;

                bool found_matching = false;
                for (const auto &formats_per_category_it : video_profile_data_it->formats) {
                    for (const auto &format : formats_per_category_it.second) {
                        if (pImageFormatInfo->format == format.video_format_properties_.format &&
                            pImageFormatInfo->type == format.video_format_properties_.imageType &&
                            pImageFormatInfo->tiling == format.video_format_properties_.imageTiling &&
                            (pImageFormatInfo->usage & format.video_format_properties_.imageUsageFlags) == pImageFormatInfo->usage &&
                            (image_create_flags & format.video_format_properties_.imageCreateFlags) == image_create_flags) {
                            found_matching = true;
                            break;
                        }
                    }
                    if (found_matching) break;
                }
                if (!found_matching) {
                    return VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR;
                }
            }
        }
    }

    if (core) {
        return dt->GetPhysicalDeviceImageFormatProperties2(physicalDevice, pImageFormatInfo, pImageFormatProperties);
    }
    return dt->GetPhysicalDeviceImageFormatProperties2KHR(physicalDevice, pImageFormatInfo, pImageFormatProperties);
}

VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties2KHR(
    VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2KHR *pImageFormatInfo,
    VkImageFormatProperties2KHR *pImageFormatProperties) {
    return GetPhysicalDeviceImageFormatProperties2Impl(physicalDevice, pImageFormatInfo, pImageFormatProperties, false);
}

VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties2(VkPhysicalDevice physicalDevice,
                                                                       const VkPhysicalDeviceImageFormatInfo2 *pImageFormatInfo,
                                                                       VkImageFormatProperties2 *pImageFormatProperties) {
    return GetPhysicalDeviceImageFormatProperties2Impl(physicalDevice, pImageFormatInfo, pImageFormatProperties, true);
}

VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceVideoCapabilitiesKHR(VkPhysicalDevice physicalDevice,
                                                                     const VkVideoProfileInfoKHR *pVideoProfile,
                                                                     VkVideoCapabilitiesKHR *pCapabilities) {
    std::lock_guard<std::recursive_mutex> lock(global_lock);
    const auto dt = instance_dispatch_table(physicalDevice);

    PhysicalDeviceData *pdd = PhysicalDeviceData::Find(physicalDevice);
    ProfileLayerSettings* layer_settings = &JsonLoader::Find(pdd->instance())->layer_settings;

    if (layer_settings->simulate.capabilities & SIMULATE_VIDEO_CAPABILITIES_BIT) {
        VideoProfileData in_video_profile{};

        // Construct and verify video profile info chain
        in_video_profile.info = VideoProfileInfoChain(pVideoProfile);
        if (!in_video_profile.info.valid) {
            return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
        }

        auto video_profile_data_it = pdd->set_of_video_profiles_.find(in_video_profile);
        if (video_profile_data_it == pdd->set_of_video_profiles_.end()) {
            return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
        }

        video_profile_data_it->caps.CopyTo(pCapabilities);
        return VK_SUCCESS;
    } else {
        return dt->GetPhysicalDeviceVideoCapabilitiesKHR(physicalDevice, pVideoProfile, pCapabilities);
    }
}


VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceVideoFormatPropertiesKHR(VkPhysicalDevice physicalDevice,
                                                                         const VkPhysicalDeviceVideoFormatInfoKHR *pVideoFormatInfo,
                                                                         uint32_t *pVideoFormatPropertyCount,
                                                                         VkVideoFormatPropertiesKHR *pVideoFormatProperties) {
    std::lock_guard<std::recursive_mutex> lock(global_lock);
    const auto dt = instance_dispatch_table(physicalDevice);

    PhysicalDeviceData *pdd = PhysicalDeviceData::Find(physicalDevice);
    ProfileLayerSettings* layer_settings = &JsonLoader::Find(pdd->instance())->layer_settings;

    if (layer_settings->simulate.capabilities & SIMULATE_VIDEO_FORMATS_BIT) {
        auto p = reinterpret_cast<const VkBaseInStructure*>(pVideoFormatInfo);
        while (p != nullptr && p->sType != VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR) {
            p = p->pNext;
        }
        if (p == nullptr) {
            return VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR;
        }

        SetOfVideoProfileFormats formats{};
        const auto video_profile_list = reinterpret_cast<const VkVideoProfileListInfoKHR*>(p);
        for (uint32_t i = 0; i < video_profile_list->profileCount; ++i) {
            VideoProfileData in_video_profile{};

            // Construct and verify video profile info chain
            in_video_profile.info = VideoProfileInfoChain(&video_profile_list->pProfiles[i]);
            if (!in_video_profile.info.valid) {
                return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
            }

            auto video_profile_data_it = pdd->set_of_video_profiles_.find(in_video_profile);
            if (video_profile_data_it == pdd->set_of_video_profiles_.end()) {
                return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
            }

            if (i == 0) {
                // First video profile, just take all matching formats as the initial set
                const auto in_usage = pVideoFormatInfo->imageUsage;
                for (const auto &formats_per_category_it : video_profile_data_it->formats) {
                    for (const auto &format : formats_per_category_it.second) {
                        if ((format.video_format_properties_.imageUsageFlags & in_usage) == in_usage) {
                            formats.insert(format);
                        }
                    }
                }
            } else {
                // For all other video profiles find any matching formats and intersect the properties
                SetOfVideoProfileFormats common_formats{};
                for (const auto &format : formats) {
                    for (const auto &formats_per_category_it : video_profile_data_it->formats) {
                        auto format_it = formats_per_category_it.second.find(format);
                        if (format_it != formats_per_category_it.second.end()) {
                            auto common_format = format;
                            common_format.IntersectWith(*format_it);
                            common_formats.insert(common_format);
                        }
                    }
                }
                formats = std::move(common_formats);
            }
        }

        VkResult result = VK_SUCCESS;
        if (pVideoFormatProperties != nullptr) {
            if (*pVideoFormatPropertyCount < formats.size()) {
                result = VK_INCOMPLETE;
            } else {
                *pVideoFormatPropertyCount = static_cast<uint32_t>(formats.size());
            }
            uint32_t i = 0;
            for (const auto &format : formats) {
                if (i >= *pVideoFormatPropertyCount) break;
                format.CopyTo(&pVideoFormatProperties[i]);
                i++;
            }
        } else {
            *pVideoFormatPropertyCount = static_cast<uint32_t>(formats.size());
        }
        return result;
    } else {
        return dt->GetPhysicalDeviceVideoFormatPropertiesKHR(physicalDevice, pVideoFormatInfo,
                                                             pVideoFormatPropertyCount, pVideoFormatProperties);
    }
}

VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceToolPropertiesEXT(VkPhysicalDevice physicalDevice, uint32_t *pToolCount,
                                                                  VkPhysicalDeviceToolPropertiesEXT *pToolProperties) {
    std::stringstream version_stream;
    version_stream << kVersionProfilesMajor << "." << kVersionProfilesMinor << "." << kVersionProfilesPatch;
    std::string version_string(version_stream.str());

    static VkPhysicalDeviceToolPropertiesEXT profiles_layer_tool_props = {};
    profiles_layer_tool_props.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT;
    profiles_layer_tool_props.pNext = nullptr;
    strcpy(profiles_layer_tool_props.name, kLayerProperties[0].description);
    strcpy(profiles_layer_tool_props.version, version_string.c_str());
    profiles_layer_tool_props.purposes = VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT_EXT;
    strcpy(profiles_layer_tool_props.description, kLayerProperties[0].description);
    strcpy(profiles_layer_tool_props.layer, kLayerProperties[0].layerName);

    auto original_pToolProperties = pToolProperties;
    if (pToolProperties != nullptr) {
        *pToolProperties = profiles_layer_tool_props;
        pToolProperties = ((*pToolCount > 1) ? &pToolProperties[1] : nullptr);
        (*pToolCount)--;
    }

    VkuInstanceDispatchTable *pInstanceTable = instance_dispatch_table(physicalDevice);
    VkResult result = pInstanceTable->GetPhysicalDeviceToolPropertiesEXT(physicalDevice, pToolCount, pToolProperties);

    if (original_pToolProperties != nullptr) {
        pToolProperties = original_pToolProperties;
    }

    (*pToolCount)++;

    return result;
}

VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceToolProperties(VkPhysicalDevice physicalDevice, uint32_t *pToolCount,
                                                               VkPhysicalDeviceToolProperties *pToolProperties) {
    return GetPhysicalDeviceToolPropertiesEXT(physicalDevice, pToolCount, pToolProperties);
}

#define TRANSFER_VALUE(name)    \
    if (promoted_written) {     \
        std::memmove(&src->name, &dest->name, sizeof(src->name)); \
    } else {                    \
        std::memmove(&dest->name, &src->name, sizeof(dest->name)); \
    }

#define TRANSFER_VALUE_ARRAY(name)    \
    if (promoted_written) {     \
        std::memmove(src->name, dest->name, sizeof(src->name)); \
    } else {                    \
        std::memmove(dest->name, src->name, sizeof(dest->name)); \
    }


// VK_VULKAN_1_1

void TransferValue(VkPhysicalDeviceVulkan11Properties *dest, VkPhysicalDeviceMultiviewPropertiesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(maxMultiviewViewCount);
    TRANSFER_VALUE(maxMultiviewInstanceIndex);
}

void TransferValue(VkPhysicalDeviceVulkan11Features *dest, VkPhysicalDeviceMultiviewFeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(multiview);
    TRANSFER_VALUE(multiviewGeometryShader);
    TRANSFER_VALUE(multiviewTessellationShader);
}

void TransferValue(VkPhysicalDeviceVulkan11Properties *dest, VkPhysicalDeviceIDPropertiesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(deviceUUID);
    TRANSFER_VALUE(driverUUID);
    TRANSFER_VALUE(deviceLUID);
    TRANSFER_VALUE(deviceNodeMask);
    TRANSFER_VALUE(deviceLUIDValid);
}

void TransferValue(VkPhysicalDeviceVulkan11Features *dest, VkPhysicalDevice16BitStorageFeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(storageBuffer16BitAccess);
    TRANSFER_VALUE(uniformAndStorageBuffer16BitAccess);
    TRANSFER_VALUE(storagePushConstant16);
    TRANSFER_VALUE(storageInputOutput16);
}

void TransferValue(VkPhysicalDeviceVulkan11Properties *dest, VkPhysicalDevicePointClippingPropertiesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(pointClippingBehavior);
}

void TransferValue(VkPhysicalDeviceVulkan11Features *dest, VkPhysicalDeviceVariablePointerFeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(variablePointersStorageBuffer);
    TRANSFER_VALUE(variablePointers);
}

void TransferValue(VkPhysicalDeviceVulkan11Features *dest, VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(samplerYcbcrConversion);
}

void TransferValue(VkPhysicalDeviceVulkan11Properties *dest, VkPhysicalDeviceMaintenance3PropertiesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(maxPerSetDescriptors);
    TRANSFER_VALUE(maxMemoryAllocationSize);
}


// VK_VULKAN_1_2

void TransferValue(VkPhysicalDeviceVulkan12Features *dest, VkPhysicalDeviceFloat16Int8FeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(shaderFloat16);
    TRANSFER_VALUE(shaderInt8);
}

void TransferValue(VkPhysicalDeviceVulkan12Features *dest, VkPhysicalDeviceImagelessFramebufferFeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(imagelessFramebuffer);
}

void TransferValue(VkPhysicalDeviceVulkan12Properties *dest, VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(filterMinmaxSingleComponentFormats);
    TRANSFER_VALUE(filterMinmaxImageComponentMapping);
}

void TransferValue(VkPhysicalDeviceVulkan12Properties *dest, VkPhysicalDeviceDescriptorIndexingPropertiesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(maxUpdateAfterBindDescriptorsInAllPools);
    TRANSFER_VALUE(shaderUniformBufferArrayNonUniformIndexingNative);
    TRANSFER_VALUE(shaderSampledImageArrayNonUniformIndexingNative);
    TRANSFER_VALUE(shaderStorageBufferArrayNonUniformIndexingNative);
    TRANSFER_VALUE(shaderStorageImageArrayNonUniformIndexingNative);
    TRANSFER_VALUE(shaderInputAttachmentArrayNonUniformIndexingNative);
    TRANSFER_VALUE(robustBufferAccessUpdateAfterBind);
    TRANSFER_VALUE(quadDivergentImplicitLod);
    TRANSFER_VALUE(maxPerStageDescriptorUpdateAfterBindSamplers);
    TRANSFER_VALUE(maxPerStageDescriptorUpdateAfterBindUniformBuffers);
    TRANSFER_VALUE(maxPerStageDescriptorUpdateAfterBindStorageBuffers);
    TRANSFER_VALUE(maxPerStageDescriptorUpdateAfterBindSampledImages);
    TRANSFER_VALUE(maxPerStageDescriptorUpdateAfterBindStorageImages);
    TRANSFER_VALUE(maxPerStageDescriptorUpdateAfterBindInputAttachments);
    TRANSFER_VALUE(maxPerStageUpdateAfterBindResources);
    TRANSFER_VALUE(maxDescriptorSetUpdateAfterBindSamplers);
    TRANSFER_VALUE(maxDescriptorSetUpdateAfterBindUniformBuffers);
    TRANSFER_VALUE(maxDescriptorSetUpdateAfterBindUniformBuffersDynamic);
    TRANSFER_VALUE(maxDescriptorSetUpdateAfterBindStorageBuffers);
    TRANSFER_VALUE(maxDescriptorSetUpdateAfterBindStorageBuffersDynamic);
    TRANSFER_VALUE(maxDescriptorSetUpdateAfterBindSampledImages);
    TRANSFER_VALUE(maxDescriptorSetUpdateAfterBindStorageImages);
    TRANSFER_VALUE(maxDescriptorSetUpdateAfterBindInputAttachments);
}

void TransferValue(VkPhysicalDeviceVulkan12Features *dest, VkPhysicalDeviceDescriptorIndexingFeaturesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(shaderInputAttachmentArrayDynamicIndexing);
    TRANSFER_VALUE(shaderUniformTexelBufferArrayDynamicIndexing);
    TRANSFER_VALUE(shaderStorageTexelBufferArrayDynamicIndexing);
    TRANSFER_VALUE(shaderUniformBufferArrayNonUniformIndexing);
    TRANSFER_VALUE(shaderSampledImageArrayNonUniformIndexing);
    TRANSFER_VALUE(shaderStorageBufferArrayNonUniformIndexing);
    TRANSFER_VALUE(shaderStorageImageArrayNonUniformIndexing);
    TRANSFER_VALUE(shaderInputAttachmentArrayNonUniformIndexing);
    TRANSFER_VALUE(shaderUniformTexelBufferArrayNonUniformIndexing);
    TRANSFER_VALUE(shaderStorageTexelBufferArrayNonUniformIndexing);
    TRANSFER_VALUE(descriptorBindingUniformBufferUpdateAfterBind);
    TRANSFER_VALUE(descriptorBindingSampledImageUpdateAfterBind);
    TRANSFER_VALUE(descriptorBindingStorageImageUpdateAfterBind);
    TRANSFER_VALUE(descriptorBindingStorageBufferUpdateAfterBind);
    TRANSFER_VALUE(descriptorBindingUniformTexelBufferUpdateAfterBind);
    TRANSFER_VALUE(descriptorBindingStorageTexelBufferUpdateAfterBind);
    TRANSFER_VALUE(descriptorBindingUpdateUnusedWhilePending);
    TRANSFER_VALUE(descriptorBindingPartiallyBound);
    TRANSFER_VALUE(descriptorBindingVariableDescriptorCount);
    TRANSFER_VALUE(runtimeDescriptorArray);
}

void TransferValue(VkPhysicalDeviceVulkan12Features *dest, VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(shaderSubgroupExtendedTypes);
}

void TransferValue(VkPhysicalDeviceVulkan12Features *dest, VkPhysicalDevice8BitStorageFeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(storageBuffer8BitAccess);
    TRANSFER_VALUE(uniformAndStorageBuffer8BitAccess);
    TRANSFER_VALUE(storagePushConstant8);
}

void TransferValue(VkPhysicalDeviceVulkan12Features *dest, VkPhysicalDeviceShaderAtomicInt64FeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(shaderBufferInt64Atomics);
    TRANSFER_VALUE(shaderSharedInt64Atomics);
}

void TransferValue(VkPhysicalDeviceVulkan12Properties *dest, VkPhysicalDeviceDriverPropertiesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(driverID);
    TRANSFER_VALUE(driverName);
    TRANSFER_VALUE(driverInfo);
    TRANSFER_VALUE(conformanceVersion);
}

void TransferValue(VkPhysicalDeviceVulkan12Properties *dest, VkPhysicalDeviceFloatControlsPropertiesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(denormBehaviorIndependence);
    TRANSFER_VALUE(roundingModeIndependence);
    TRANSFER_VALUE(shaderSignedZeroInfNanPreserveFloat16);
    TRANSFER_VALUE(shaderSignedZeroInfNanPreserveFloat32);
    TRANSFER_VALUE(shaderSignedZeroInfNanPreserveFloat64);
    TRANSFER_VALUE(shaderDenormPreserveFloat16);
    TRANSFER_VALUE(shaderDenormPreserveFloat32);
    TRANSFER_VALUE(shaderDenormPreserveFloat64);
    TRANSFER_VALUE(shaderDenormFlushToZeroFloat16);
    TRANSFER_VALUE(shaderDenormFlushToZeroFloat32);
    TRANSFER_VALUE(shaderDenormFlushToZeroFloat64);
    TRANSFER_VALUE(shaderRoundingModeRTEFloat16);
    TRANSFER_VALUE(shaderRoundingModeRTEFloat32);
    TRANSFER_VALUE(shaderRoundingModeRTEFloat64);
    TRANSFER_VALUE(shaderRoundingModeRTZFloat16);
    TRANSFER_VALUE(shaderRoundingModeRTZFloat32);
    TRANSFER_VALUE(shaderRoundingModeRTZFloat64);
}

void TransferValue(VkPhysicalDeviceVulkan12Properties *dest, VkPhysicalDeviceDepthStencilResolvePropertiesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(supportedDepthResolveModes);
    TRANSFER_VALUE(supportedStencilResolveModes);
    TRANSFER_VALUE(independentResolveNone);
    TRANSFER_VALUE(independentResolve);
}

void TransferValue(VkPhysicalDeviceVulkan12Properties *dest, VkPhysicalDeviceTimelineSemaphorePropertiesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(maxTimelineSemaphoreValueDifference);
}

void TransferValue(VkPhysicalDeviceVulkan12Features *dest, VkPhysicalDeviceTimelineSemaphoreFeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(timelineSemaphore);
}

void TransferValue(VkPhysicalDeviceVulkan12Features *dest, VkPhysicalDeviceVulkanMemoryModelFeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(vulkanMemoryModel);
    TRANSFER_VALUE(vulkanMemoryModelDeviceScope);
    TRANSFER_VALUE(vulkanMemoryModelAvailabilityVisibilityChains);
}

void TransferValue(VkPhysicalDeviceVulkan12Features *dest, VkPhysicalDeviceScalarBlockLayoutFeaturesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(scalarBlockLayout);
}

void TransferValue(VkPhysicalDeviceVulkan12Features *dest, VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(separateDepthStencilLayouts);
}

void TransferValue(VkPhysicalDeviceVulkan12Features *dest, VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(uniformBufferStandardLayout);
}

void TransferValue(VkPhysicalDeviceVulkan12Features *dest, VkPhysicalDeviceBufferDeviceAddressFeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(bufferDeviceAddress);
    TRANSFER_VALUE(bufferDeviceAddressCaptureReplay);
    TRANSFER_VALUE(bufferDeviceAddressMultiDevice);
}

void TransferValue(VkPhysicalDeviceVulkan12Features *dest, VkPhysicalDeviceHostQueryResetFeaturesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(hostQueryReset);
}


// VK_VULKAN_1_3

void TransferValue(VkPhysicalDeviceVulkan13Features *dest, VkPhysicalDeviceDynamicRenderingFeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(dynamicRendering);
}

void TransferValue(VkPhysicalDeviceVulkan13Features *dest, VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(textureCompressionASTC_HDR);
}

void TransferValue(VkPhysicalDeviceVulkan13Properties *dest, VkPhysicalDeviceInlineUniformBlockPropertiesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(maxInlineUniformBlockSize);
    TRANSFER_VALUE(maxPerStageDescriptorInlineUniformBlocks);
    TRANSFER_VALUE(maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks);
    TRANSFER_VALUE(maxDescriptorSetInlineUniformBlocks);
    TRANSFER_VALUE(maxDescriptorSetUpdateAfterBindInlineUniformBlocks);
}

void TransferValue(VkPhysicalDeviceVulkan13Features *dest, VkPhysicalDeviceInlineUniformBlockFeaturesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(inlineUniformBlock);
    TRANSFER_VALUE(descriptorBindingInlineUniformBlockUpdateAfterBind);
}

void TransferValue(VkPhysicalDeviceVulkan13Features *dest, VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(shaderTerminateInvocation);
}

void TransferValue(VkPhysicalDeviceVulkan13Properties *dest, VkPhysicalDeviceSubgroupSizeControlPropertiesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(minSubgroupSize);
    TRANSFER_VALUE(maxSubgroupSize);
    TRANSFER_VALUE(maxComputeWorkgroupSubgroups);
    TRANSFER_VALUE(requiredSubgroupSizeStages);
}

void TransferValue(VkPhysicalDeviceVulkan13Features *dest, VkPhysicalDeviceSubgroupSizeControlFeaturesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(subgroupSizeControl);
    TRANSFER_VALUE(computeFullSubgroups);
}

void TransferValue(VkPhysicalDeviceVulkan13Features *dest, VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(shaderDemoteToHelperInvocation);
}

void TransferValue(VkPhysicalDeviceVulkan13Properties *dest, VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(integerDotProduct8BitUnsignedAccelerated);
    TRANSFER_VALUE(integerDotProduct8BitSignedAccelerated);
    TRANSFER_VALUE(integerDotProduct8BitMixedSignednessAccelerated);
    TRANSFER_VALUE(integerDotProduct4x8BitPackedUnsignedAccelerated);
    TRANSFER_VALUE(integerDotProduct4x8BitPackedSignedAccelerated);
    TRANSFER_VALUE(integerDotProduct4x8BitPackedMixedSignednessAccelerated);
    TRANSFER_VALUE(integerDotProduct16BitUnsignedAccelerated);
    TRANSFER_VALUE(integerDotProduct16BitSignedAccelerated);
    TRANSFER_VALUE(integerDotProduct16BitMixedSignednessAccelerated);
    TRANSFER_VALUE(integerDotProduct32BitUnsignedAccelerated);
    TRANSFER_VALUE(integerDotProduct32BitSignedAccelerated);
    TRANSFER_VALUE(integerDotProduct32BitMixedSignednessAccelerated);
    TRANSFER_VALUE(integerDotProduct64BitUnsignedAccelerated);
    TRANSFER_VALUE(integerDotProduct64BitSignedAccelerated);
    TRANSFER_VALUE(integerDotProduct64BitMixedSignednessAccelerated);
    TRANSFER_VALUE(integerDotProductAccumulatingSaturating8BitUnsignedAccelerated);
    TRANSFER_VALUE(integerDotProductAccumulatingSaturating8BitSignedAccelerated);
    TRANSFER_VALUE(integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated);
    TRANSFER_VALUE(integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated);
    TRANSFER_VALUE(integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated);
    TRANSFER_VALUE(integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated);
    TRANSFER_VALUE(integerDotProductAccumulatingSaturating16BitUnsignedAccelerated);
    TRANSFER_VALUE(integerDotProductAccumulatingSaturating16BitSignedAccelerated);
    TRANSFER_VALUE(integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated);
    TRANSFER_VALUE(integerDotProductAccumulatingSaturating32BitUnsignedAccelerated);
    TRANSFER_VALUE(integerDotProductAccumulatingSaturating32BitSignedAccelerated);
    TRANSFER_VALUE(integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated);
    TRANSFER_VALUE(integerDotProductAccumulatingSaturating64BitUnsignedAccelerated);
    TRANSFER_VALUE(integerDotProductAccumulatingSaturating64BitSignedAccelerated);
    TRANSFER_VALUE(integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated);
}

void TransferValue(VkPhysicalDeviceVulkan13Features *dest, VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(shaderIntegerDotProduct);
}

void TransferValue(VkPhysicalDeviceVulkan13Properties *dest, VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(storageTexelBufferOffsetAlignmentBytes);
    TRANSFER_VALUE(storageTexelBufferOffsetSingleTexelAlignment);
    TRANSFER_VALUE(uniformTexelBufferOffsetAlignmentBytes);
    TRANSFER_VALUE(uniformTexelBufferOffsetSingleTexelAlignment);
}

void TransferValue(VkPhysicalDeviceVulkan13Features *dest, VkPhysicalDevicePrivateDataFeaturesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(privateData);
}

void TransferValue(VkPhysicalDeviceVulkan13Features *dest, VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(pipelineCreationCacheControl);
}

void TransferValue(VkPhysicalDeviceVulkan13Features *dest, VkPhysicalDeviceSynchronization2FeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(synchronization2);
}

void TransferValue(VkPhysicalDeviceVulkan13Features *dest, VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(shaderZeroInitializeWorkgroupMemory);
}

void TransferValue(VkPhysicalDeviceVulkan13Features *dest, VkPhysicalDeviceImageRobustnessFeaturesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(robustImageAccess);
}

void TransferValue(VkPhysicalDeviceVulkan13Properties *dest, VkPhysicalDeviceMaintenance4PropertiesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(maxBufferSize);
}

void TransferValue(VkPhysicalDeviceVulkan13Features *dest, VkPhysicalDeviceMaintenance4FeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(maintenance4);
}


// VK_VULKAN_1_4

void TransferValue(VkPhysicalDeviceVulkan14Properties *dest, VkPhysicalDevicePipelineRobustnessPropertiesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(defaultRobustnessStorageBuffers);
    TRANSFER_VALUE(defaultRobustnessUniformBuffers);
    TRANSFER_VALUE(defaultRobustnessVertexInputs);
    TRANSFER_VALUE(defaultRobustnessImages);
}

void TransferValue(VkPhysicalDeviceVulkan14Features *dest, VkPhysicalDevicePipelineRobustnessFeaturesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(pipelineRobustness);
}

void TransferValue(VkPhysicalDeviceVulkan14Properties *dest, VkPhysicalDevicePushDescriptorPropertiesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(maxPushDescriptors);
}

void TransferValue(VkPhysicalDeviceVulkan14Features *dest, VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(vertexAttributeInstanceRateDivisor);
    TRANSFER_VALUE(vertexAttributeInstanceRateZeroDivisor);
}

void TransferValue(VkPhysicalDeviceVulkan14Features *dest, VkPhysicalDeviceDynamicRenderingLocalReadFeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(dynamicRenderingLocalRead);
}

void TransferValue(VkPhysicalDeviceVulkan14Properties *dest, VkPhysicalDeviceLineRasterizationPropertiesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(lineSubPixelPrecisionBits);
}

void TransferValue(VkPhysicalDeviceVulkan14Features *dest, VkPhysicalDeviceLineRasterizationFeaturesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(rectangularLines);
    TRANSFER_VALUE(bresenhamLines);
    TRANSFER_VALUE(smoothLines);
    TRANSFER_VALUE(stippledRectangularLines);
    TRANSFER_VALUE(stippledBresenhamLines);
    TRANSFER_VALUE(stippledSmoothLines);
}

void TransferValue(VkPhysicalDeviceVulkan14Features *dest, VkPhysicalDeviceIndexTypeUint8FeaturesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(indexTypeUint8);
}

void TransferValue(VkPhysicalDeviceVulkan14Properties *dest, VkPhysicalDeviceHostImageCopyPropertiesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(copySrcLayoutCount);
    TRANSFER_VALUE(pCopySrcLayouts);
    TRANSFER_VALUE(copyDstLayoutCount);
    TRANSFER_VALUE(pCopyDstLayouts);
    TRANSFER_VALUE(optimalTilingLayoutUUID);
    TRANSFER_VALUE(identicalMemoryTypeRequirements);
}

void TransferValue(VkPhysicalDeviceVulkan14Features *dest, VkPhysicalDeviceHostImageCopyFeaturesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(hostImageCopy);
}

void TransferValue(VkPhysicalDeviceVulkan14Features *dest, VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(globalPriorityQuery);
}

void TransferValue(VkPhysicalDeviceVulkan14Features *dest, VkPhysicalDeviceShaderSubgroupRotateFeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(shaderSubgroupRotate);
    TRANSFER_VALUE(shaderSubgroupRotateClustered);
}

void TransferValue(VkPhysicalDeviceVulkan14Features *dest, VkPhysicalDevicePipelineProtectedAccessFeaturesEXT *src, bool promoted_written) {
    TRANSFER_VALUE(pipelineProtectedAccess);
}

void TransferValue(VkPhysicalDeviceVulkan14Properties *dest, VkPhysicalDeviceMaintenance5PropertiesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(earlyFragmentMultisampleCoverageAfterSampleCounting);
    TRANSFER_VALUE(earlyFragmentSampleMaskTestBeforeSampleCounting);
    TRANSFER_VALUE(depthStencilSwizzleOneSupport);
    TRANSFER_VALUE(polygonModePointSize);
    TRANSFER_VALUE(nonStrictSinglePixelWideLinesUseParallelogram);
    TRANSFER_VALUE(nonStrictWideLinesUseParallelogram);
}

void TransferValue(VkPhysicalDeviceVulkan14Features *dest, VkPhysicalDeviceMaintenance5FeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(maintenance5);
}

void TransferValue(VkPhysicalDeviceVulkan14Properties *dest, VkPhysicalDeviceVertexAttributeDivisorPropertiesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(maxVertexAttribDivisor);
    TRANSFER_VALUE(supportsNonZeroFirstInstance);
}

void TransferValue(VkPhysicalDeviceVulkan14Features *dest, VkPhysicalDeviceShaderFloatControls2FeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(shaderFloatControls2);
}

void TransferValue(VkPhysicalDeviceVulkan14Features *dest, VkPhysicalDeviceShaderExpectAssumeFeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(shaderExpectAssume);
}

void TransferValue(VkPhysicalDeviceVulkan14Properties *dest, VkPhysicalDeviceMaintenance6PropertiesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(blockTexelViewCompatibleMultipleLayers);
    TRANSFER_VALUE(maxCombinedImageSamplerDescriptorCount);
    TRANSFER_VALUE(fragmentShadingRateClampCombinerInputs);
}

void TransferValue(VkPhysicalDeviceVulkan14Features *dest, VkPhysicalDeviceMaintenance6FeaturesKHR *src, bool promoted_written) {
    TRANSFER_VALUE(maintenance6);
}

#undef TRANSFER_VALUE_ARRAY
#undef TRANSFER_VALUE

void LoadDeviceFormats(VkInstance instance, PhysicalDeviceData *pdd, VkPhysicalDevice pd, MapOfVkFormatProperties *dest,
                       MapOfVkFormatProperties3 *dest3) {
    std::vector<VkFormat> formats = {
        VK_FORMAT_UNDEFINED,
        VK_FORMAT_R4G4_UNORM_PACK8,
        VK_FORMAT_R4G4B4A4_UNORM_PACK16,
        VK_FORMAT_B4G4R4A4_UNORM_PACK16,
        VK_FORMAT_R5G6B5_UNORM_PACK16,
        VK_FORMAT_B5G6R5_UNORM_PACK16,
        VK_FORMAT_R5G5B5A1_UNORM_PACK16,
        VK_FORMAT_B5G5R5A1_UNORM_PACK16,
        VK_FORMAT_A1R5G5B5_UNORM_PACK16,
        VK_FORMAT_R8_UNORM,
        VK_FORMAT_R8_SNORM,
        VK_FORMAT_R8_USCALED,
        VK_FORMAT_R8_SSCALED,
        VK_FORMAT_R8_UINT,
        VK_FORMAT_R8_SINT,
        VK_FORMAT_R8_SRGB,
        VK_FORMAT_R8G8_UNORM,
        VK_FORMAT_R8G8_SNORM,
        VK_FORMAT_R8G8_USCALED,
        VK_FORMAT_R8G8_SSCALED,
        VK_FORMAT_R8G8_UINT,
        VK_FORMAT_R8G8_SINT,
        VK_FORMAT_R8G8_SRGB,
        VK_FORMAT_R8G8B8_UNORM,
        VK_FORMAT_R8G8B8_SNORM,
        VK_FORMAT_R8G8B8_USCALED,
        VK_FORMAT_R8G8B8_SSCALED,
        VK_FORMAT_R8G8B8_UINT,
        VK_FORMAT_R8G8B8_SINT,
        VK_FORMAT_R8G8B8_SRGB,
        VK_FORMAT_B8G8R8_UNORM,
        VK_FORMAT_B8G8R8_SNORM,
        VK_FORMAT_B8G8R8_USCALED,
        VK_FORMAT_B8G8R8_SSCALED,
        VK_FORMAT_B8G8R8_UINT,
        VK_FORMAT_B8G8R8_SINT,
        VK_FORMAT_B8G8R8_SRGB,
        VK_FORMAT_R8G8B8A8_UNORM,
        VK_FORMAT_R8G8B8A8_SNORM,
        VK_FORMAT_R8G8B8A8_USCALED,
        VK_FORMAT_R8G8B8A8_SSCALED,
        VK_FORMAT_R8G8B8A8_UINT,
        VK_FORMAT_R8G8B8A8_SINT,
        VK_FORMAT_R8G8B8A8_SRGB,
        VK_FORMAT_B8G8R8A8_UNORM,
        VK_FORMAT_B8G8R8A8_SNORM,
        VK_FORMAT_B8G8R8A8_USCALED,
        VK_FORMAT_B8G8R8A8_SSCALED,
        VK_FORMAT_B8G8R8A8_UINT,
        VK_FORMAT_B8G8R8A8_SINT,
        VK_FORMAT_B8G8R8A8_SRGB,
        VK_FORMAT_A8B8G8R8_UNORM_PACK32,
        VK_FORMAT_A8B8G8R8_SNORM_PACK32,
        VK_FORMAT_A8B8G8R8_USCALED_PACK32,
        VK_FORMAT_A8B8G8R8_SSCALED_PACK32,
        VK_FORMAT_A8B8G8R8_UINT_PACK32,
        VK_FORMAT_A8B8G8R8_SINT_PACK32,
        VK_FORMAT_A8B8G8R8_SRGB_PACK32,
        VK_FORMAT_A2R10G10B10_UNORM_PACK32,
        VK_FORMAT_A2R10G10B10_SNORM_PACK32,
        VK_FORMAT_A2R10G10B10_USCALED_PACK32,
        VK_FORMAT_A2R10G10B10_SSCALED_PACK32,
        VK_FORMAT_A2R10G10B10_UINT_PACK32,
        VK_FORMAT_A2R10G10B10_SINT_PACK32,
        VK_FORMAT_A2B10G10R10_UNORM_PACK32,
        VK_FORMAT_A2B10G10R10_SNORM_PACK32,
        VK_FORMAT_A2B10G10R10_USCALED_PACK32,
        VK_FORMAT_A2B10G10R10_SSCALED_PACK32,
        VK_FORMAT_A2B10G10R10_UINT_PACK32,
        VK_FORMAT_A2B10G10R10_SINT_PACK32,
        VK_FORMAT_R16_UNORM,
        VK_FORMAT_R16_SNORM,
        VK_FORMAT_R16_USCALED,
        VK_FORMAT_R16_SSCALED,
        VK_FORMAT_R16_UINT,
        VK_FORMAT_R16_SINT,
        VK_FORMAT_R16_SFLOAT,
        VK_FORMAT_R16G16_UNORM,
        VK_FORMAT_R16G16_SNORM,
        VK_FORMAT_R16G16_USCALED,
        VK_FORMAT_R16G16_SSCALED,
        VK_FORMAT_R16G16_UINT,
        VK_FORMAT_R16G16_SINT,
        VK_FORMAT_R16G16_SFLOAT,
        VK_FORMAT_R16G16B16_UNORM,
        VK_FORMAT_R16G16B16_SNORM,
        VK_FORMAT_R16G16B16_USCALED,
        VK_FORMAT_R16G16B16_SSCALED,
        VK_FORMAT_R16G16B16_UINT,
        VK_FORMAT_R16G16B16_SINT,
        VK_FORMAT_R16G16B16_SFLOAT,
        VK_FORMAT_R16G16B16A16_UNORM,
        VK_FORMAT_R16G16B16A16_SNORM,
        VK_FORMAT_R16G16B16A16_USCALED,
        VK_FORMAT_R16G16B16A16_SSCALED,
        VK_FORMAT_R16G16B16A16_UINT,
        VK_FORMAT_R16G16B16A16_SINT,
        VK_FORMAT_R16G16B16A16_SFLOAT,
        VK_FORMAT_R32_UINT,
        VK_FORMAT_R32_SINT,
        VK_FORMAT_R32_SFLOAT,
        VK_FORMAT_R32G32_UINT,
        VK_FORMAT_R32G32_SINT,
        VK_FORMAT_R32G32_SFLOAT,
        VK_FORMAT_R32G32B32_UINT,
        VK_FORMAT_R32G32B32_SINT,
        VK_FORMAT_R32G32B32_SFLOAT,
        VK_FORMAT_R32G32B32A32_UINT,
        VK_FORMAT_R32G32B32A32_SINT,
        VK_FORMAT_R32G32B32A32_SFLOAT,
        VK_FORMAT_R64_UINT,
        VK_FORMAT_R64_SINT,
        VK_FORMAT_R64_SFLOAT,
        VK_FORMAT_R64G64_UINT,
        VK_FORMAT_R64G64_SINT,
        VK_FORMAT_R64G64_SFLOAT,
        VK_FORMAT_R64G64B64_UINT,
        VK_FORMAT_R64G64B64_SINT,
        VK_FORMAT_R64G64B64_SFLOAT,
        VK_FORMAT_R64G64B64A64_UINT,
        VK_FORMAT_R64G64B64A64_SINT,
        VK_FORMAT_R64G64B64A64_SFLOAT,
        VK_FORMAT_B10G11R11_UFLOAT_PACK32,
        VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,
        VK_FORMAT_D16_UNORM,
        VK_FORMAT_X8_D24_UNORM_PACK32,
        VK_FORMAT_D32_SFLOAT,
        VK_FORMAT_S8_UINT,
        VK_FORMAT_D16_UNORM_S8_UINT,
        VK_FORMAT_D24_UNORM_S8_UINT,
        VK_FORMAT_D32_SFLOAT_S8_UINT,
        VK_FORMAT_BC1_RGB_UNORM_BLOCK,
        VK_FORMAT_BC1_RGB_SRGB_BLOCK,
        VK_FORMAT_BC1_RGBA_UNORM_BLOCK,
        VK_FORMAT_BC1_RGBA_SRGB_BLOCK,
        VK_FORMAT_BC2_UNORM_BLOCK,
        VK_FORMAT_BC2_SRGB_BLOCK,
        VK_FORMAT_BC3_UNORM_BLOCK,
        VK_FORMAT_BC3_SRGB_BLOCK,
        VK_FORMAT_BC4_UNORM_BLOCK,
        VK_FORMAT_BC4_SNORM_BLOCK,
        VK_FORMAT_BC5_UNORM_BLOCK,
        VK_FORMAT_BC5_SNORM_BLOCK,
        VK_FORMAT_BC6H_UFLOAT_BLOCK,
        VK_FORMAT_BC6H_SFLOAT_BLOCK,
        VK_FORMAT_BC7_UNORM_BLOCK,
        VK_FORMAT_BC7_SRGB_BLOCK,
        VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,
        VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,
        VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,
        VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,
        VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,
        VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,
        VK_FORMAT_EAC_R11_UNORM_BLOCK,
        VK_FORMAT_EAC_R11_SNORM_BLOCK,
        VK_FORMAT_EAC_R11G11_UNORM_BLOCK,
        VK_FORMAT_EAC_R11G11_SNORM_BLOCK,
        VK_FORMAT_ASTC_4x4_UNORM_BLOCK,
        VK_FORMAT_ASTC_4x4_SRGB_BLOCK,
        VK_FORMAT_ASTC_5x4_UNORM_BLOCK,
        VK_FORMAT_ASTC_5x4_SRGB_BLOCK,
        VK_FORMAT_ASTC_5x5_UNORM_BLOCK,
        VK_FORMAT_ASTC_5x5_SRGB_BLOCK,
        VK_FORMAT_ASTC_6x5_UNORM_BLOCK,
        VK_FORMAT_ASTC_6x5_SRGB_BLOCK,
        VK_FORMAT_ASTC_6x6_UNORM_BLOCK,
        VK_FORMAT_ASTC_6x6_SRGB_BLOCK,
        VK_FORMAT_ASTC_8x5_UNORM_BLOCK,
        VK_FORMAT_ASTC_8x5_SRGB_BLOCK,
        VK_FORMAT_ASTC_8x6_UNORM_BLOCK,
        VK_FORMAT_ASTC_8x6_SRGB_BLOCK,
        VK_FORMAT_ASTC_8x8_UNORM_BLOCK,
        VK_FORMAT_ASTC_8x8_SRGB_BLOCK,
        VK_FORMAT_ASTC_10x5_UNORM_BLOCK,
        VK_FORMAT_ASTC_10x5_SRGB_BLOCK,
        VK_FORMAT_ASTC_10x6_UNORM_BLOCK,
        VK_FORMAT_ASTC_10x6_SRGB_BLOCK,
        VK_FORMAT_ASTC_10x8_UNORM_BLOCK,
        VK_FORMAT_ASTC_10x8_SRGB_BLOCK,
        VK_FORMAT_ASTC_10x10_UNORM_BLOCK,
        VK_FORMAT_ASTC_10x10_SRGB_BLOCK,
        VK_FORMAT_ASTC_12x10_UNORM_BLOCK,
        VK_FORMAT_ASTC_12x10_SRGB_BLOCK,
        VK_FORMAT_ASTC_12x12_UNORM_BLOCK,
        VK_FORMAT_ASTC_12x12_SRGB_BLOCK,
        VK_FORMAT_G8B8G8R8_422_UNORM,
        VK_FORMAT_B8G8R8G8_422_UNORM,
        VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM,
        VK_FORMAT_G8_B8R8_2PLANE_420_UNORM,
        VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM,
        VK_FORMAT_G8_B8R8_2PLANE_422_UNORM,
        VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM,
        VK_FORMAT_R10X6_UNORM_PACK16,
        VK_FORMAT_R10X6G10X6_UNORM_2PACK16,
        VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,
        VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16,
        VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16,
        VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16,
        VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16,
        VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16,
        VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16,
        VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16,
        VK_FORMAT_R12X4_UNORM_PACK16,
        VK_FORMAT_R12X4G12X4_UNORM_2PACK16,
        VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16,
        VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16,
        VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16,
        VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16,
        VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16,
        VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16,
        VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16,
        VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16,
        VK_FORMAT_G16B16G16R16_422_UNORM,
        VK_FORMAT_B16G16R16G16_422_UNORM,
        VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM,
        VK_FORMAT_G16_B16R16_2PLANE_420_UNORM,
        VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM,
        VK_FORMAT_G16_B16R16_2PLANE_422_UNORM,
        VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM,
        VK_FORMAT_G8_B8R8_2PLANE_444_UNORM,
        VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16,
        VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16,
        VK_FORMAT_G16_B16R16_2PLANE_444_UNORM,
        VK_FORMAT_A4R4G4B4_UNORM_PACK16,
        VK_FORMAT_A4B4G4R4_UNORM_PACK16,
        VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK,
        VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK,
        VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK,
        VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK,
        VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK,
        VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK,
        VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK,
        VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK,
        VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK,
        VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK,
        VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK,
        VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK,
        VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK,
        VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK,
        VK_FORMAT_A1B5G5R5_UNORM_PACK16,
        VK_FORMAT_A8_UNORM,
        VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG,
        VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG,
        VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG,
        VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG,
        VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG,
        VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG,
        VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG,
        VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG,
        VK_FORMAT_ASTC_3x3x3_UNORM_BLOCK_EXT,
        VK_FORMAT_ASTC_3x3x3_SRGB_BLOCK_EXT,
        VK_FORMAT_ASTC_3x3x3_SFLOAT_BLOCK_EXT,
        VK_FORMAT_ASTC_4x3x3_UNORM_BLOCK_EXT,
        VK_FORMAT_ASTC_4x3x3_SRGB_BLOCK_EXT,
        VK_FORMAT_ASTC_4x3x3_SFLOAT_BLOCK_EXT,
        VK_FORMAT_ASTC_4x4x3_UNORM_BLOCK_EXT,
        VK_FORMAT_ASTC_4x4x3_SRGB_BLOCK_EXT,
        VK_FORMAT_ASTC_4x4x3_SFLOAT_BLOCK_EXT,
        VK_FORMAT_ASTC_4x4x4_UNORM_BLOCK_EXT,
        VK_FORMAT_ASTC_4x4x4_SRGB_BLOCK_EXT,
        VK_FORMAT_ASTC_4x4x4_SFLOAT_BLOCK_EXT,
        VK_FORMAT_ASTC_5x4x4_UNORM_BLOCK_EXT,
        VK_FORMAT_ASTC_5x4x4_SRGB_BLOCK_EXT,
        VK_FORMAT_ASTC_5x4x4_SFLOAT_BLOCK_EXT,
        VK_FORMAT_ASTC_5x5x4_UNORM_BLOCK_EXT,
        VK_FORMAT_ASTC_5x5x4_SRGB_BLOCK_EXT,
        VK_FORMAT_ASTC_5x5x4_SFLOAT_BLOCK_EXT,
        VK_FORMAT_ASTC_5x5x5_UNORM_BLOCK_EXT,
        VK_FORMAT_ASTC_5x5x5_SRGB_BLOCK_EXT,
        VK_FORMAT_ASTC_5x5x5_SFLOAT_BLOCK_EXT,
        VK_FORMAT_ASTC_6x5x5_UNORM_BLOCK_EXT,
        VK_FORMAT_ASTC_6x5x5_SRGB_BLOCK_EXT,
        VK_FORMAT_ASTC_6x5x5_SFLOAT_BLOCK_EXT,
        VK_FORMAT_ASTC_6x6x5_UNORM_BLOCK_EXT,
        VK_FORMAT_ASTC_6x6x5_SRGB_BLOCK_EXT,
        VK_FORMAT_ASTC_6x6x5_SFLOAT_BLOCK_EXT,
        VK_FORMAT_ASTC_6x6x6_UNORM_BLOCK_EXT,
        VK_FORMAT_ASTC_6x6x6_SRGB_BLOCK_EXT,
        VK_FORMAT_ASTC_6x6x6_SFLOAT_BLOCK_EXT,
        VK_FORMAT_R8_BOOL_ARM,
        VK_FORMAT_R16_SFLOAT_FPENCODING_BFLOAT16_ARM,
        VK_FORMAT_R8_SFLOAT_FPENCODING_FLOAT8E4M3_ARM,
        VK_FORMAT_R8_SFLOAT_FPENCODING_FLOAT8E5M2_ARM,
        VK_FORMAT_R16G16_SFIXED5_NV,
        VK_FORMAT_R10X6_UINT_PACK16_ARM,
        VK_FORMAT_R10X6G10X6_UINT_2PACK16_ARM,
        VK_FORMAT_R10X6G10X6B10X6A10X6_UINT_4PACK16_ARM,
        VK_FORMAT_R12X4_UINT_PACK16_ARM,
        VK_FORMAT_R12X4G12X4_UINT_2PACK16_ARM,
        VK_FORMAT_R12X4G12X4B12X4A12X4_UINT_4PACK16_ARM,
        VK_FORMAT_R14X2_UINT_PACK16_ARM,
        VK_FORMAT_R14X2G14X2_UINT_2PACK16_ARM,
        VK_FORMAT_R14X2G14X2B14X2A14X2_UINT_4PACK16_ARM,
        VK_FORMAT_R14X2_UNORM_PACK16_ARM,
        VK_FORMAT_R14X2G14X2_UNORM_2PACK16_ARM,
        VK_FORMAT_R14X2G14X2B14X2A14X2_UNORM_4PACK16_ARM,
        VK_FORMAT_G14X2_B14X2R14X2_2PLANE_420_UNORM_3PACK16_ARM,
        VK_FORMAT_G14X2_B14X2R14X2_2PLANE_422_UNORM_3PACK16_ARM,
    };
    const auto dt = instance_dispatch_table(instance);
    for (const auto format : formats) {
        VkFormatProperties3KHR format_properties_3 = {};
        format_properties_3.sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR;

        VkFormatProperties2 format_properties = {};
        format_properties.sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2;
        format_properties.pNext = &format_properties_3;

        if (pdd->GetEffectiveVersion() >= VK_API_VERSION_1_1) {
            dt->GetPhysicalDeviceFormatProperties2(pd, format, &format_properties);
        } else {
            dt->GetPhysicalDeviceFormatProperties2KHR(pd, format, &format_properties);
        }
        (*dest)[format] = format_properties.formatProperties;
        (*dest3)[format] = format_properties_3;
    }
}

void LoadQueueFamilyProperties(VkInstance instance, VkPhysicalDevice pd, PhysicalDeviceData *pdd) {
    const auto dt = instance_dispatch_table(instance);
    uint32_t count = 0;
    if (pdd->GetEffectiveVersion() >= VK_API_VERSION_1_1) {
        dt->GetPhysicalDeviceQueueFamilyProperties2(pd, &count, nullptr);
    } else {
        dt->GetPhysicalDeviceQueueFamilyProperties2KHR(pd, &count, nullptr);
    }
    if (count > 0) {
        pdd->device_queue_family_properties_.resize(count);
        std::vector<void *> pNext(count);
        std::vector<VkQueueFamilyProperties2> props(count);
        for (uint32_t i = 0; i < count; ++i) {
            if (PhysicalDeviceData::HasExtension(pdd, VK_KHR_MAINTENANCE_9_EXTENSION_NAME)) {
                pdd->device_queue_family_properties_[i].ownership_transfer_properties_.pNext = pNext[i];

                pNext[i] = &pdd->device_queue_family_properties_[i].ownership_transfer_properties_;
            }
            if (PhysicalDeviceData::HasExtension(pdd, VK_KHR_MAINTENANCE_11_EXTENSION_NAME)) {
                pdd->device_queue_family_properties_[i].optimal_image_transfer_granularity_properties_.pNext = pNext[i];

                pNext[i] = &pdd->device_queue_family_properties_[i].optimal_image_transfer_granularity_properties_;
            }
            if (PhysicalDeviceData::HasExtension(pdd, VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME)) {
                pdd->device_queue_family_properties_[i].global_priority_properties_.pNext = pNext[i];

                pNext[i] = &pdd->device_queue_family_properties_[i].global_priority_properties_;
            }
            if (PhysicalDeviceData::HasExtension(pdd, VK_KHR_VIDEO_QUEUE_EXTENSION_NAME)) {
                pdd->device_queue_family_properties_[i].video_properties_.pNext = pNext[i];

                pNext[i] = &pdd->device_queue_family_properties_[i].video_properties_;

                pdd->device_queue_family_properties_[i].query_result_status_properties_.pNext = pNext[i];

                pNext[i] = &pdd->device_queue_family_properties_[i].query_result_status_properties_;
            }
            if (PhysicalDeviceData::HasExtension(pdd, VK_NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_EXTENSION_NAME)) {
                pdd->device_queue_family_properties_[i].checkpoint_properties_.pNext = pNext[i];

                pNext[i] = &pdd->device_queue_family_properties_[i].checkpoint_properties_;

                if (PhysicalDeviceData::HasExtension(pdd, VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME)) {
                    pdd->device_queue_family_properties_[i].checkpoint_properties_2_.pNext = pNext[i];

                    pNext[i] = &pdd->device_queue_family_properties_[i].checkpoint_properties_2_;
                }
            }
            pdd->device_queue_family_properties_[i].properties_2.pNext = pNext[i];
            props[i] = pdd->device_queue_family_properties_[i].properties_2;
        }
        if (pdd->GetEffectiveVersion() >= VK_API_VERSION_1_1) {
            dt->GetPhysicalDeviceQueueFamilyProperties2(pd, &count, props.data());
        } else {
            dt->GetPhysicalDeviceQueueFamilyProperties2KHR(pd, &count, props.data());
        }
        for (uint32_t i = 0; i < count; ++i) {
            pdd->device_queue_family_properties_[i].properties_2 = props[i];
        }
    }
}

static void LoadVideoProfiles(VkInstance instance, VkPhysicalDevice pd, PhysicalDeviceData *pdd, SimulateCapabilityFlags flags) {
    if (!PhysicalDeviceData::HasExtension(pdd, "VK_KHR_video_queue")) {
        return;
    }

    auto check_api_version = [&](uint32_t api_version) { return pdd->GetEffectiveVersion() >= api_version; };
    auto check_extension = [&](const char* extension) { return PhysicalDeviceData::HasExtension(pdd, extension); };

    const auto dt = instance_dispatch_table(instance);
    ProfileLayerSettings *layer_settings = &JsonLoader::Find(instance)->layer_settings;
    ForEachVideoProfile([&](const VkVideoProfileInfoKHR& info, const char *name) {
        VideoProfileData video_profile{};

        // Construct and verify video profile info chain
        video_profile.info = VideoProfileInfoChain(&info);
        if (!video_profile.info.valid) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, "Invalid video profile info chain for video profile '%s'.\n", name);
            return;
        }

        // Construct and verify video profile capabilities chain
        video_profile.caps = VideoCapabilitiesChain(info.videoCodecOperation, check_api_version, check_extension);
        if (!video_profile.caps.valid) {
            LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT, "Invalid video capabilities chain for video profile '%s'.\n", name);
            return;
        }

        // Query physical device support and capabilities
        VkResult result = dt->GetPhysicalDeviceVideoCapabilitiesKHR(pd, &video_profile.info.video_profile_info_,
                                                                    &video_profile.caps.video_capabilities_);
        if (result < VK_SUCCESS) return;

        // If needed, also load video format data
        if (flags & SIMULATE_VIDEO_FORMATS_BIT) {
            VkVideoProfileListInfoKHR video_profile_list{VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR};
            video_profile_list.profileCount = 1;
            video_profile_list.pProfiles = &info;
            VkPhysicalDeviceVideoFormatInfoKHR video_format_info{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR,
                                                                 &video_profile_list};
            for (const auto usage : video_profile.GetSupportedFormatCategories()) {
                video_format_info.imageUsage = usage;

                // Query number of video formats for the given usage
                uint32_t format_count = 0;
                result = dt->GetPhysicalDeviceVideoFormatPropertiesKHR(pd, &video_format_info, &format_count, nullptr);
                if (result < VK_SUCCESS) continue;
                if (format_count == 0) continue;

                // Construct and verify video profile format chains
                std::vector<VkVideoFormatPropertiesKHR> video_format_props(format_count);
                std::vector<VideoFormatPropertiesChain> video_profile_formats(format_count,
                    VideoFormatPropertiesChain(info.videoCodecOperation, usage, check_api_version, check_extension));
                if (!video_profile_formats[0].valid) {
                    LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT,
                               "Invalid video format properties chain for video profile '%s'.\n", name);
                    continue;
                }
                for (uint32_t i = 0; i < format_count; ++i) {
                    video_format_props[i] = video_profile_formats[i].video_format_properties_;
                }
                result = dt->GetPhysicalDeviceVideoFormatPropertiesKHR(pd, &video_format_info, &format_count, video_format_props.data());
                if (result < VK_SUCCESS) {
                    LogMessage(layer_settings, DEBUG_REPORT_ERROR_BIT,
                               "Failed to query video format properties for video profile '%s'.\n", name);
                    continue;
                }

                // Store video formats in the video profile data
                for (uint32_t i = 0; i < format_count; ++i) {
                    video_profile_formats[i].video_format_properties_ = video_format_props[i];
                    video_profile.formats[usage].insert(video_profile_formats[i]);
                }
            }
        }

        // Store video profile data in the physical device data
        pdd->set_of_device_video_profiles_.insert(video_profile);
    });
}

VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
                                                        VkPhysicalDevice *pPhysicalDevices) {
    // Our layer-specific initialization...

    std::lock_guard<std::recursive_mutex> lock(global_lock);
    const auto dt = instance_dispatch_table(instance);

    ProfileLayerSettings *layer_settings = &JsonLoader::Find(instance)->layer_settings;

    VkResult result = VK_SUCCESS;
    result = dt->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);

    // HACK!! epd_count is used to ensure the following code only gets called _after_ vkCreateInstance finishes *in the "vkcube +
    // profiles" use case*
    if (pPhysicalDevices && (VK_SUCCESS == result)) {
        std::vector<VkPhysicalDevice> physical_devices;
        result = EnumerateAll<VkPhysicalDevice>(physical_devices, [&](uint32_t *count, VkPhysicalDevice *results) {
            return dt->EnumeratePhysicalDevices(instance, count, results);
        });

        if (result != VK_SUCCESS) {
            return result;
        }

        // For each physical device, create and populate a PDD instance.
        for (const auto &physical_device : physical_devices) {
            if (PhysicalDeviceData::Find(physical_device)) {
                continue;
            }

            PhysicalDeviceData &pdd = PhysicalDeviceData::Create(physical_device, instance);
            ArrayOfVkExtensionProperties local_device_extensions;
            EnumerateAll<VkExtensionProperties>(local_device_extensions, [&](uint32_t *count, VkExtensionProperties *results) {
                return dt->EnumerateDeviceExtensionProperties(physical_device, nullptr, count, results);
            });

            pdd.device_extensions_.reserve(local_device_extensions.size());
            for(const auto& ext: local_device_extensions) {
                pdd.device_extensions_.insert({&(ext.extensionName[0]), ext});
            }

            pdd.simulation_extensions_ = pdd.device_extensions_;

            dt->GetPhysicalDeviceProperties(physical_device, &pdd.physical_device_properties_);
            uint32_t effective_api_version = pdd.GetEffectiveVersion();
            bool api_version_above_1_1 = effective_api_version >= VK_API_VERSION_1_1;
            bool api_version_above_1_2 = effective_api_version >= VK_API_VERSION_1_2;
            bool api_version_above_1_3 = effective_api_version >= VK_API_VERSION_1_3;
            bool api_version_above_1_4 = effective_api_version >= VK_API_VERSION_1_4;

            ::device_has_astc_hdr = ::PhysicalDeviceData::HasExtension(&pdd, VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME);
            ::device_has_pvrtc = ::PhysicalDeviceData::HasExtension(&pdd, VK_IMG_FORMAT_PVRTC_EXTENSION_NAME);

            // Initialize PDD members to the actual Vulkan implementation's defaults.
            {
                VkPhysicalDeviceProperties2KHR property_chain = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR};
                VkPhysicalDeviceFeatures2KHR feature_chain = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR};
                VkPhysicalDeviceMemoryProperties2KHR memory_chain = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR};

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME)) {
                    property_chain.pNext = &(pdd.physical_device_portability_subset_properties_);
                    feature_chain.pNext = &(pdd.physical_device_portability_subset_features_);
                } else if (layer_settings->simulate.emulate_portability) {
                    pdd.physical_device_portability_subset_properties_ = {
                        VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR, nullptr, layer_settings->portability.minVertexInputBindingStrideAlignment};
                    pdd.physical_device_portability_subset_features_ = {
                        VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR,
                        nullptr,
                        layer_settings->portability.constantAlphaColorBlendFactors,
                        layer_settings->portability.events,
                        layer_settings->portability.imageViewFormatReinterpretation,
                        layer_settings->portability.imageViewFormatSwizzle,
                        layer_settings->portability.imageView2DOn3DImage,
                        layer_settings->portability.multisampleArrayImage,
                        layer_settings->portability.mutableComparisonSamplers,
                        layer_settings->portability.pointPolygons,
                        layer_settings->portability.samplerMipLodBias,
                        layer_settings->portability.separateStencilMaskRef,
                        layer_settings->portability.shaderSampleRateInterpolationFunctions,
                        layer_settings->portability.tessellationIsolines,
                        layer_settings->portability.tessellationPointMode,
                        layer_settings->portability.triangleFans,
                        layer_settings->portability.vertexAttributeAccessBeyondStride};
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
                    pdd.physical_device_transform_feedback_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_transform_feedback_properties_);
                    pdd.physical_device_transform_feedback_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_transform_feedback_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME)) {
                    pdd.physical_device_dynamic_rendering_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_dynamic_rendering_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_CORNER_SAMPLED_IMAGE_EXTENSION_NAME)) {
                    pdd.physical_device_corner_sampled_image_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_corner_sampled_image_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
                    pdd.physical_device_multiview_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_multiview_properties_);
                    pdd.physical_device_multiview_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_multiview_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME)) {
                    pdd.physical_device_texture_compression_astchdrfeatures_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_texture_compression_astchdrfeatures_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME)) {
                    pdd.physical_device_astcdecode_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_astcdecode_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME)) {
                    pdd.physical_device_pipeline_robustness_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_pipeline_robustness_properties_);
                    pdd.physical_device_pipeline_robustness_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_pipeline_robustness_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME)) {
                    pdd.physical_device_idproperties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_idproperties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
                    pdd.physical_device_push_descriptor_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_push_descriptor_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME)) {
                    pdd.physical_device_conditional_rendering_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_conditional_rendering_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME)) {
                    pdd.physical_device_float_16_int_8_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_float_16_int_8_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_16BIT_STORAGE_EXTENSION_NAME)) {
                    pdd.physical_device_16_bit_storage_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_16_bit_storage_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_EXTENSION_NAME)) {
                    pdd.physical_device_multiview_per_view_attributes_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_multiview_per_view_attributes_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_DISCARD_RECTANGLES_EXTENSION_NAME)) {
                    pdd.physical_device_discard_rectangle_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_discard_rectangle_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME)) {
                    pdd.physical_device_conservative_rasterization_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_conservative_rasterization_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME)) {
                    pdd.physical_device_depth_clip_enable_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_depth_clip_enable_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME)) {
                    pdd.physical_device_imageless_framebuffer_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_imageless_framebuffer_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_IMG_RELAXED_LINE_RASTERIZATION_EXTENSION_NAME)) {
                    pdd.physical_device_relaxed_line_rasterization_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_relaxed_line_rasterization_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME)) {
                    pdd.physical_device_performance_query_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_performance_query_properties_);
                    pdd.physical_device_performance_query_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_performance_query_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_MAINTENANCE_2_EXTENSION_NAME)) {
                    pdd.physical_device_point_clipping_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_point_clipping_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME)) {
                    pdd.physical_device_variable_pointer_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_variable_pointer_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME)) {
                    pdd.physical_device_sampler_filter_minmax_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_sampler_filter_minmax_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_AMD_GPA_INTERFACE_EXTENSION_NAME)) {
                    pdd.physical_device_gpa_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_gpa_properties_);
                    pdd.physical_device_gpa_properties_2_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_gpa_properties_2_);
                    pdd.physical_device_gpa_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_gpa_features_);
                }
#ifdef VK_ENABLE_BETA_EXTENSIONS

                if (PhysicalDeviceData::HasExtension(&pdd, VK_AMDX_SHADER_ENQUEUE_EXTENSION_NAME)) {
                    pdd.physical_device_shader_enqueue_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_shader_enqueue_properties_);
                    pdd.physical_device_shader_enqueue_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_enqueue_features_);
                }
#endif // VK_ENABLE_BETA_EXTENSIONS

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_DESCRIPTOR_HEAP_EXTENSION_NAME)) {
                    pdd.physical_device_descriptor_heap_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_descriptor_heap_properties_);
                    pdd.physical_device_descriptor_heap_tensor_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_descriptor_heap_tensor_properties_);
                    pdd.physical_device_descriptor_heap_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_descriptor_heap_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME)) {
                    pdd.physical_device_inline_uniform_block_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_inline_uniform_block_properties_);
                    pdd.physical_device_inline_uniform_block_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_inline_uniform_block_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SHADER_BFLOAT16_EXTENSION_NAME)) {
                    pdd.physical_device_shader_bfloat_16_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_bfloat_16_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SAMPLE_LOCATIONS_EXTENSION_NAME)) {
                    pdd.physical_device_sample_locations_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_sample_locations_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME)) {
                    pdd.physical_device_blend_operation_advanced_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_blend_operation_advanced_properties_);
                    pdd.physical_device_blend_operation_advanced_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_blend_operation_advanced_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME)) {
                    pdd.physical_device_acceleration_structure_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_acceleration_structure_properties_);
                    pdd.physical_device_acceleration_structure_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_acceleration_structure_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME)) {
                    pdd.physical_device_ray_tracing_pipeline_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_ray_tracing_pipeline_properties_);
                    pdd.physical_device_ray_tracing_pipeline_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_ray_tracing_pipeline_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_RAY_QUERY_EXTENSION_NAME)) {
                    pdd.physical_device_ray_query_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_ray_query_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_SHADER_SM_BUILTINS_EXTENSION_NAME)) {
                    pdd.physical_device_shader_smbuiltins_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_shader_smbuiltins_properties_);
                    pdd.physical_device_shader_smbuiltins_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_smbuiltins_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME)) {
                    pdd.physical_device_sampler_ycbcr_conversion_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_sampler_ycbcr_conversion_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME)) {
                    pdd.physical_device_descriptor_indexing_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_descriptor_indexing_properties_);
                    pdd.physical_device_descriptor_indexing_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_descriptor_indexing_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME)) {
                    pdd.physical_device_shading_rate_image_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_shading_rate_image_properties_);
                    pdd.physical_device_shading_rate_image_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shading_rate_image_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_RAY_TRACING_EXTENSION_NAME)) {
                    pdd.physical_device_ray_tracing_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_ray_tracing_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_REPRESENTATIVE_FRAGMENT_TEST_EXTENSION_NAME)) {
                    pdd.physical_device_representative_fragment_test_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_representative_fragment_test_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_MAINTENANCE_3_EXTENSION_NAME)) {
                    pdd.physical_device_maintenance_3_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_maintenance_3_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_QCOM_COOPERATIVE_MATRIX_CONVERSION_EXTENSION_NAME)) {
                    pdd.physical_device_cooperative_matrix_conversion_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_cooperative_matrix_conversion_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_QCOM_ELAPSED_TIMER_QUERY_EXTENSION_NAME)) {
                    pdd.physical_device_elapsed_timer_query_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_elapsed_timer_query_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME)) {
                    pdd.physical_device_shader_subgroup_extended_types_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_subgroup_extended_types_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_8BIT_STORAGE_EXTENSION_NAME)) {
                    pdd.physical_device_8_bit_storage_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_8_bit_storage_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME)) {
                    pdd.physical_device_external_memory_host_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_external_memory_host_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME)) {
                    pdd.physical_device_shader_atomic_int_64_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_atomic_int_64_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SHADER_CLOCK_EXTENSION_NAME)) {
                    pdd.physical_device_shader_clock_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_clock_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_AMD_SHADER_CORE_PROPERTIES_EXTENSION_NAME)) {
                    pdd.physical_device_shader_core_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_shader_core_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME) || PhysicalDeviceData::HasExtension(&pdd, VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME)) {
                    pdd.physical_device_vertex_attribute_divisor_properties_ext_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_vertex_attribute_divisor_properties_ext_);
                    pdd.physical_device_vertex_attribute_divisor_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_vertex_attribute_divisor_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME)) {
                    pdd.physical_device_driver_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_driver_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME)) {
                    pdd.physical_device_float_controls_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_float_controls_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME)) {
                    pdd.physical_device_depth_stencil_resolve_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_depth_stencil_resolve_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME) || PhysicalDeviceData::HasExtension(&pdd, VK_KHR_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME)) {
                    pdd.physical_device_compute_shader_derivatives_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_compute_shader_derivatives_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_MESH_SHADER_EXTENSION_NAME)) {
                    pdd.physical_device_mesh_shader_properties_nv_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_mesh_shader_properties_nv_);
                    pdd.physical_device_mesh_shader_features_nv_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_mesh_shader_features_nv_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME) || PhysicalDeviceData::HasExtension(&pdd, VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME)) {
                    pdd.physical_device_fragment_shader_barycentric_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_fragment_shader_barycentric_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME)) {
                    pdd.physical_device_shader_image_footprint_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_image_footprint_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME)) {
                    pdd.physical_device_exclusive_scissor_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_exclusive_scissor_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME)) {
                    pdd.physical_device_timeline_semaphore_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_timeline_semaphore_properties_);
                    pdd.physical_device_timeline_semaphore_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_timeline_semaphore_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_PRESENT_TIMING_EXTENSION_NAME)) {
                    pdd.physical_device_present_timing_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_present_timing_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_EXTENSION_NAME)) {
                    pdd.physical_device_shader_integer_functions_2_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_integer_functions_2_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME)) {
                    pdd.physical_device_vulkan_memory_model_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_vulkan_memory_model_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_PCI_BUS_INFO_EXTENSION_NAME)) {
                    pdd.physical_device_pcibus_info_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_pcibus_info_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SHADER_TERMINATE_INVOCATION_EXTENSION_NAME)) {
                    pdd.physical_device_shader_terminate_invocation_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_terminate_invocation_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME)) {
                    pdd.physical_device_fragment_density_map_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_fragment_density_map_properties_);
                    pdd.physical_device_fragment_density_map_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_fragment_density_map_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME)) {
                    pdd.physical_device_scalar_block_layout_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_scalar_block_layout_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME)) {
                    pdd.physical_device_subgroup_size_control_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_subgroup_size_control_properties_);
                    pdd.physical_device_subgroup_size_control_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_subgroup_size_control_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME)) {
                    pdd.physical_device_fragment_shading_rate_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_fragment_shading_rate_properties_);
                    pdd.physical_device_fragment_shading_rate_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_fragment_shading_rate_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_AMD_SHADER_CORE_PROPERTIES_2_EXTENSION_NAME)) {
                    pdd.physical_device_shader_core_properties_2_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_shader_core_properties_2_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME)) {
                    pdd.physical_device_coherent_memory_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_coherent_memory_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SHADER_CONSTANT_DATA_EXTENSION_NAME)) {
                    pdd.physical_device_shader_constant_data_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_constant_data_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME)) {
                    pdd.physical_device_dynamic_rendering_local_read_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_dynamic_rendering_local_read_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SHADER_ABORT_EXTENSION_NAME)) {
                    pdd.physical_device_shader_abort_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_shader_abort_properties_);
                    pdd.physical_device_shader_abort_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_abort_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SHADER_IMAGE_ATOMIC_INT64_EXTENSION_NAME)) {
                    pdd.physical_device_shader_image_atomic_int_64_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_image_atomic_int_64_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SHADER_QUAD_CONTROL_EXTENSION_NAME)) {
                    pdd.physical_device_shader_quad_control_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_quad_control_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME)) {
                    pdd.physical_device_memory_priority_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_memory_priority_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_EXTENSION_NAME)) {
                    pdd.physical_device_dedicated_allocation_image_aliasing_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_dedicated_allocation_image_aliasing_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME)) {
                    pdd.physical_device_separate_depth_stencil_layouts_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_separate_depth_stencil_layouts_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME)) {
                    pdd.physical_device_buffer_address_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_buffer_address_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_PRESENT_WAIT_EXTENSION_NAME)) {
                    pdd.physical_device_present_wait_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_present_wait_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME)) {
                    pdd.physical_device_cooperative_matrix_properties_nv_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_cooperative_matrix_properties_nv_);
                    pdd.physical_device_cooperative_matrix_features_nv_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_cooperative_matrix_features_nv_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_COVERAGE_REDUCTION_MODE_EXTENSION_NAME)) {
                    pdd.physical_device_coverage_reduction_mode_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_coverage_reduction_mode_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME)) {
                    pdd.physical_device_fragment_shader_interlock_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_fragment_shader_interlock_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME)) {
                    pdd.physical_device_ycbcr_image_arrays_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_ycbcr_image_arrays_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME)) {
                    pdd.physical_device_uniform_buffer_standard_layout_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_uniform_buffer_standard_layout_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME)) {
                    pdd.physical_device_provoking_vertex_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_provoking_vertex_properties_);
                    pdd.physical_device_provoking_vertex_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_provoking_vertex_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME)) {
                    pdd.physical_device_buffer_device_address_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_buffer_device_address_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME) || PhysicalDeviceData::HasExtension(&pdd, VK_KHR_LINE_RASTERIZATION_EXTENSION_NAME)) {
                    pdd.physical_device_line_rasterization_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_line_rasterization_properties_);
                    pdd.physical_device_line_rasterization_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_line_rasterization_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME)) {
                    pdd.physical_device_shader_atomic_float_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_atomic_float_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME)) {
                    pdd.physical_device_host_query_reset_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_host_query_reset_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME) || PhysicalDeviceData::HasExtension(&pdd, VK_KHR_INDEX_TYPE_UINT8_EXTENSION_NAME)) {
                    pdd.physical_device_index_type_uint_8_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_index_type_uint_8_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME)) {
                    pdd.physical_device_extended_dynamic_state_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_extended_dynamic_state_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME)) {
                    pdd.physical_device_pipeline_executable_properties_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_pipeline_executable_properties_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME)) {
                    pdd.physical_device_host_image_copy_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_host_image_copy_properties_);
                    pdd.physical_device_host_image_copy_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_host_image_copy_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_MAP_MEMORY_PLACED_EXTENSION_NAME)) {
                    pdd.physical_device_map_memory_placed_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_map_memory_placed_properties_);
                    pdd.physical_device_map_memory_placed_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_map_memory_placed_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SHADER_ATOMIC_FLOAT_2_EXTENSION_NAME)) {
                    pdd.physical_device_shader_atomic_float_2_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_atomic_float_2_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME) || PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME)) {
                    pdd.physical_device_swapchain_maintenance_1_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_swapchain_maintenance_1_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME)) {
                    pdd.physical_device_shader_demote_to_helper_invocation_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_demote_to_helper_invocation_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME)) {
                    pdd.physical_device_device_generated_commands_properties_nv_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_device_generated_commands_properties_nv_);
                    pdd.physical_device_device_generated_commands_features_nv_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_device_generated_commands_features_nv_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_INHERITED_VIEWPORT_SCISSOR_EXTENSION_NAME)) {
                    pdd.physical_device_inherited_viewport_scissor_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_inherited_viewport_scissor_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SHADER_INTEGER_DOT_PRODUCT_EXTENSION_NAME)) {
                    pdd.physical_device_shader_integer_dot_product_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_shader_integer_dot_product_properties_);
                    pdd.physical_device_shader_integer_dot_product_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_integer_dot_product_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME)) {
                    pdd.physical_device_texel_buffer_alignment_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_texel_buffer_alignment_properties_);
                    pdd.physical_device_texel_buffer_alignment_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_texel_buffer_alignment_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_DEPTH_BIAS_CONTROL_EXTENSION_NAME)) {
                    pdd.physical_device_depth_bias_control_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_depth_bias_control_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_DEVICE_MEMORY_REPORT_EXTENSION_NAME)) {
                    pdd.physical_device_device_memory_report_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_device_memory_report_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_ROBUSTNESS_2_EXTENSION_NAME) || PhysicalDeviceData::HasExtension(&pdd, VK_KHR_ROBUSTNESS_2_EXTENSION_NAME)) {
                    pdd.physical_device_robustness_2_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_robustness_2_properties_);
                    pdd.physical_device_robustness_2_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_robustness_2_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME)) {
                    pdd.physical_device_custom_border_color_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_custom_border_color_properties_);
                    pdd.physical_device_custom_border_color_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_custom_border_color_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_TEXTURE_COMPRESSION_ASTC_3D_EXTENSION_NAME)) {
                    pdd.physical_device_texture_compression_astc_3_dfeatures_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_texture_compression_astc_3_dfeatures_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_PRESENT_BARRIER_EXTENSION_NAME)) {
                    pdd.physical_device_present_barrier_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_present_barrier_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_PRESENT_ID_EXTENSION_NAME)) {
                    pdd.physical_device_present_id_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_present_id_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_PRIVATE_DATA_EXTENSION_NAME)) {
                    pdd.physical_device_private_data_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_private_data_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME)) {
                    pdd.physical_device_pipeline_creation_cache_control_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_pipeline_creation_cache_control_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_DEVICE_DIAGNOSTICS_CONFIG_EXTENSION_NAME)) {
                    pdd.physical_device_diagnostics_config_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_diagnostics_config_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_QCOM_QUEUE_PERF_HINT_EXTENSION_NAME)) {
                    pdd.physical_device_queue_perf_hint_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_queue_perf_hint_properties_);
                    pdd.physical_device_queue_perf_hint_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_queue_perf_hint_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_QCOM_IMAGE_PROCESSING_3_EXTENSION_NAME)) {
                    pdd.physical_device_image_processing_3_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_image_processing_3_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_QCOM_SHADER_MULTIPLE_WAIT_QUEUES_EXTENSION_NAME)) {
                    pdd.physical_device_shader_multiple_wait_queues_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_shader_multiple_wait_queues_properties_);
                    pdd.physical_device_shader_multiple_wait_queues_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_multiple_wait_queues_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SHADER_SPLIT_BARRIER_EXTENSION_NAME)) {
                    pdd.physical_device_shader_split_barrier_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_shader_split_barrier_properties_);
                    pdd.physical_device_shader_split_barrier_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_split_barrier_features_);
                }
#ifdef VK_ENABLE_BETA_EXTENSIONS

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_CUDA_KERNEL_LAUNCH_EXTENSION_NAME)) {
                    pdd.physical_device_cuda_kernel_launch_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_cuda_kernel_launch_properties_);
                    pdd.physical_device_cuda_kernel_launch_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_cuda_kernel_launch_features_);
                }
#endif // VK_ENABLE_BETA_EXTENSIONS

                if (PhysicalDeviceData::HasExtension(&pdd, VK_QCOM_TILE_SHADING_EXTENSION_NAME)) {
                    pdd.physical_device_tile_shading_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_tile_shading_properties_);
                    pdd.physical_device_tile_shading_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_tile_shading_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME)) {
                    pdd.physical_device_synchronization_2_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_synchronization_2_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME)) {
                    pdd.physical_device_descriptor_buffer_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_descriptor_buffer_properties_);
                    pdd.physical_device_descriptor_buffer_density_map_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_descriptor_buffer_density_map_properties_);
                    pdd.physical_device_descriptor_buffer_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_descriptor_buffer_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_DEVICE_ADDRESS_COMMANDS_EXTENSION_NAME)) {
                    pdd.physical_device_device_address_commands_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_device_address_commands_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_GRAPHICS_PIPELINE_LIBRARY_EXTENSION_NAME)) {
                    pdd.physical_device_graphics_pipeline_library_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_graphics_pipeline_library_properties_);
                    pdd.physical_device_graphics_pipeline_library_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_graphics_pipeline_library_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_AMD_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_EXTENSION_NAME)) {
                    pdd.physical_device_shader_early_and_late_fragment_tests_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_early_and_late_fragment_tests_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME)) {
                    pdd.physical_device_fragment_shader_barycentric_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_fragment_shader_barycentric_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_EXTENSION_NAME)) {
                    pdd.physical_device_shader_subgroup_uniform_control_flow_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_subgroup_uniform_control_flow_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_EXTENSION_NAME)) {
                    pdd.physical_device_zero_initialize_workgroup_memory_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_zero_initialize_workgroup_memory_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_FRAGMENT_SHADING_RATE_ENUMS_EXTENSION_NAME)) {
                    pdd.physical_device_fragment_shading_rate_enums_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_fragment_shading_rate_enums_properties_);
                    pdd.physical_device_fragment_shading_rate_enums_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_fragment_shading_rate_enums_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_RAY_TRACING_MOTION_BLUR_EXTENSION_NAME)) {
                    pdd.physical_device_ray_tracing_motion_blur_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_ray_tracing_motion_blur_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_MESH_SHADER_EXTENSION_NAME)) {
                    pdd.physical_device_mesh_shader_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_mesh_shader_properties_);
                    pdd.physical_device_mesh_shader_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_mesh_shader_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_YCBCR_2PLANE_444_FORMATS_EXTENSION_NAME)) {
                    pdd.physical_device_ycbcr_2_plane_444_formats_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_ycbcr_2_plane_444_formats_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME)) {
                    pdd.physical_device_fragment_density_map_2_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_fragment_density_map_2_properties_);
                    pdd.physical_device_fragment_density_map_2_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_fragment_density_map_2_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME)) {
                    pdd.physical_device_image_robustness_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_image_robustness_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME)) {
                    pdd.physical_device_workgroup_memory_explicit_layout_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_workgroup_memory_explicit_layout_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_IMAGE_COMPRESSION_CONTROL_EXTENSION_NAME)) {
                    pdd.physical_device_image_compression_control_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_image_compression_control_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_EXTENSION_NAME)) {
                    pdd.physical_device_attachment_feedback_loop_layout_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_attachment_feedback_loop_layout_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_4444_FORMATS_EXTENSION_NAME)) {
                    pdd.physical_device_4444_formats_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_4444_formats_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_DEVICE_FAULT_EXTENSION_NAME) || PhysicalDeviceData::HasExtension(&pdd, VK_KHR_DEVICE_FAULT_EXTENSION_NAME)) {
                    pdd.physical_device_fault_features_ext_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_fault_features_ext_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME) || PhysicalDeviceData::HasExtension(&pdd, VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME)) {
                    pdd.physical_device_rasterization_order_attachment_access_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_rasterization_order_attachment_access_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_RGBA10X6_FORMATS_EXTENSION_NAME)) {
                    pdd.physical_device_rgba_10_x_6_formats_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_rgba_10_x_6_formats_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME) || PhysicalDeviceData::HasExtension(&pdd, VK_EXT_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME)) {
                    pdd.physical_device_mutable_descriptor_type_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_mutable_descriptor_type_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME)) {
                    pdd.physical_device_vertex_input_dynamic_state_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_vertex_input_dynamic_state_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_PHYSICAL_DEVICE_DRM_EXTENSION_NAME)) {
                    pdd.physical_device_drm_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_drm_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_DEVICE_ADDRESS_BINDING_REPORT_EXTENSION_NAME)) {
                    pdd.physical_device_address_binding_report_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_address_binding_report_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME)) {
                    pdd.physical_device_depth_clip_control_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_depth_clip_control_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME)) {
                    pdd.physical_device_primitive_topology_list_restart_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_primitive_topology_list_restart_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_PRESENT_MODE_FIFO_LATEST_READY_EXTENSION_NAME) || PhysicalDeviceData::HasExtension(&pdd, VK_KHR_PRESENT_MODE_FIFO_LATEST_READY_EXTENSION_NAME)) {
                    pdd.physical_device_present_mode_fifo_latest_ready_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_present_mode_fifo_latest_ready_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_HUAWEI_SUBPASS_SHADING_EXTENSION_NAME)) {
                    pdd.physical_device_subpass_shading_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_subpass_shading_properties_);
                    pdd.physical_device_subpass_shading_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_subpass_shading_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_HUAWEI_INVOCATION_MASK_EXTENSION_NAME)) {
                    pdd.physical_device_invocation_mask_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_invocation_mask_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_EXTERNAL_MEMORY_RDMA_EXTENSION_NAME)) {
                    pdd.physical_device_external_memory_rdmafeatures_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_external_memory_rdmafeatures_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_PIPELINE_PROPERTIES_EXTENSION_NAME)) {
                    pdd.physical_device_pipeline_properties_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_pipeline_properties_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_FRAME_BOUNDARY_EXTENSION_NAME)) {
                    pdd.physical_device_frame_boundary_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_frame_boundary_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_EXTENSION_NAME)) {
                    pdd.physical_device_multisampled_render_to_single_sampled_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_multisampled_render_to_single_sampled_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME)) {
                    pdd.physical_device_extended_dynamic_state_2_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_extended_dynamic_state_2_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME)) {
                    pdd.physical_device_color_write_enable_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_color_write_enable_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_PRIMITIVES_GENERATED_QUERY_EXTENSION_NAME)) {
                    pdd.physical_device_primitives_generated_query_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_primitives_generated_query_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_RAY_TRACING_MAINTENANCE_1_EXTENSION_NAME)) {
                    pdd.physical_device_ray_tracing_maintenance_1_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_ray_tracing_maintenance_1_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SHADER_UNTYPED_POINTERS_EXTENSION_NAME)) {
                    pdd.physical_device_shader_untyped_pointers_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_untyped_pointers_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_GLOBAL_PRIORITY_QUERY_EXTENSION_NAME) || PhysicalDeviceData::HasExtension(&pdd, VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME)) {
                    pdd.physical_device_global_priority_query_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_global_priority_query_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_VALVE_VIDEO_ENCODE_RGB_CONVERSION_EXTENSION_NAME)) {
                    pdd.physical_device_video_encode_rgb_conversion_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_video_encode_rgb_conversion_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_IMAGE_VIEW_MIN_LOD_EXTENSION_NAME)) {
                    pdd.physical_device_image_view_min_lod_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_image_view_min_lod_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_MULTI_DRAW_EXTENSION_NAME)) {
                    pdd.physical_device_multi_draw_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_multi_draw_properties_);
                    pdd.physical_device_multi_draw_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_multi_draw_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_IMAGE_2D_VIEW_OF_3D_EXTENSION_NAME)) {
                    pdd.physical_device_image_2_dview_of_3_dfeatures_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_image_2_dview_of_3_dfeatures_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SHADER_TILE_IMAGE_EXTENSION_NAME)) {
                    pdd.physical_device_shader_tile_image_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_shader_tile_image_properties_);
                    pdd.physical_device_shader_tile_image_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_tile_image_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_OPACITY_MICROMAP_EXTENSION_NAME) || PhysicalDeviceData::HasExtension(&pdd, VK_KHR_OPACITY_MICROMAP_EXTENSION_NAME)) {
                    pdd.physical_device_opacity_micromap_properties_ext_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_opacity_micromap_properties_ext_);
                    pdd.physical_device_opacity_micromap_features_ext_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_opacity_micromap_features_ext_);
                }
#ifdef VK_ENABLE_BETA_EXTENSIONS

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_DISPLACEMENT_MICROMAP_EXTENSION_NAME)) {
                    pdd.physical_device_displacement_micromap_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_displacement_micromap_properties_);
                    pdd.physical_device_displacement_micromap_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_displacement_micromap_features_);
                }
#endif // VK_ENABLE_BETA_EXTENSIONS

                if (PhysicalDeviceData::HasExtension(&pdd, VK_HUAWEI_CLUSTER_CULLING_SHADER_EXTENSION_NAME)) {
                    pdd.physical_device_cluster_culling_shader_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_cluster_culling_shader_properties_);
                    pdd.physical_device_cluster_culling_shader_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_cluster_culling_shader_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_BORDER_COLOR_SWIZZLE_EXTENSION_NAME)) {
                    pdd.physical_device_border_color_swizzle_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_border_color_swizzle_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_EXTENSION_NAME)) {
                    pdd.physical_device_pageable_device_local_memory_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_pageable_device_local_memory_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_MAINTENANCE_4_EXTENSION_NAME)) {
                    pdd.physical_device_maintenance_4_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_maintenance_4_properties_);
                    pdd.physical_device_maintenance_4_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_maintenance_4_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_ARM_SHADER_CORE_PROPERTIES_EXTENSION_NAME)) {
                    pdd.physical_device_shader_core_properties_arm_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_shader_core_properties_arm_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SHADER_SUBGROUP_ROTATE_EXTENSION_NAME)) {
                    pdd.physical_device_shader_subgroup_rotate_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_subgroup_rotate_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_ARM_SCHEDULING_CONTROLS_EXTENSION_NAME)) {
                    pdd.physical_device_scheduling_controls_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_scheduling_controls_properties_);
                    pdd.physical_device_scheduling_controls_dispatch_parameters_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_scheduling_controls_dispatch_parameters_properties_);
                    pdd.physical_device_scheduling_controls_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_scheduling_controls_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_IMAGE_SLICED_VIEW_OF_3D_EXTENSION_NAME)) {
                    pdd.physical_device_image_sliced_view_of_3_dfeatures_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_image_sliced_view_of_3_dfeatures_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_VALVE_DESCRIPTOR_SET_HOST_MAPPING_EXTENSION_NAME)) {
                    pdd.physical_device_descriptor_set_host_mapping_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_descriptor_set_host_mapping_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_DEPTH_CLAMP_ZERO_ONE_EXTENSION_NAME) || PhysicalDeviceData::HasExtension(&pdd, VK_KHR_DEPTH_CLAMP_ZERO_ONE_EXTENSION_NAME)) {
                    pdd.physical_device_depth_clamp_zero_one_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_depth_clamp_zero_one_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_NON_SEAMLESS_CUBE_MAP_EXTENSION_NAME)) {
                    pdd.physical_device_non_seamless_cube_map_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_non_seamless_cube_map_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_ARM_RENDER_PASS_STRIPED_EXTENSION_NAME)) {
                    pdd.physical_device_render_pass_striped_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_render_pass_striped_properties_);
                    pdd.physical_device_render_pass_striped_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_render_pass_striped_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_QCOM_FRAGMENT_DENSITY_MAP_OFFSET_EXTENSION_NAME) || PhysicalDeviceData::HasExtension(&pdd, VK_EXT_FRAGMENT_DENSITY_MAP_OFFSET_EXTENSION_NAME)) {
                    pdd.physical_device_fragment_density_map_offset_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_fragment_density_map_offset_properties_);
                    pdd.physical_device_fragment_density_map_offset_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_fragment_density_map_offset_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_COPY_MEMORY_INDIRECT_EXTENSION_NAME) || PhysicalDeviceData::HasExtension(&pdd, VK_KHR_COPY_MEMORY_INDIRECT_EXTENSION_NAME)) {
                    pdd.physical_device_copy_memory_indirect_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_copy_memory_indirect_properties_);
                    pdd.physical_device_copy_memory_indirect_features_nv_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_copy_memory_indirect_features_nv_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_MEMORY_DECOMPRESSION_EXTENSION_NAME) || PhysicalDeviceData::HasExtension(&pdd, VK_EXT_MEMORY_DECOMPRESSION_EXTENSION_NAME)) {
                    pdd.physical_device_memory_decompression_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_memory_decompression_properties_);
                    pdd.physical_device_memory_decompression_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_memory_decompression_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_DEVICE_GENERATED_COMMANDS_COMPUTE_EXTENSION_NAME)) {
                    pdd.physical_device_device_generated_commands_compute_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_device_generated_commands_compute_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_RAY_TRACING_LINEAR_SWEPT_SPHERES_EXTENSION_NAME)) {
                    pdd.physical_device_ray_tracing_linear_swept_spheres_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_ray_tracing_linear_swept_spheres_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_LINEAR_COLOR_ATTACHMENT_EXTENSION_NAME)) {
                    pdd.physical_device_linear_color_attachment_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_linear_color_attachment_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SHADER_MAXIMAL_RECONVERGENCE_EXTENSION_NAME)) {
                    pdd.physical_device_shader_maximal_reconvergence_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_maximal_reconvergence_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME)) {
                    pdd.physical_device_image_compression_control_swapchain_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_image_compression_control_swapchain_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_QCOM_IMAGE_PROCESSING_EXTENSION_NAME)) {
                    pdd.physical_device_image_processing_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_image_processing_properties_);
                    pdd.physical_device_image_processing_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_image_processing_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_NESTED_COMMAND_BUFFER_EXTENSION_NAME)) {
                    pdd.physical_device_nested_command_buffer_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_nested_command_buffer_properties_);
                    pdd.physical_device_nested_command_buffer_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_nested_command_buffer_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME)) {
                    pdd.physical_device_extended_dynamic_state_3_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_extended_dynamic_state_3_properties_);
                    pdd.physical_device_extended_dynamic_state_3_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_extended_dynamic_state_3_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SUBPASS_MERGE_FEEDBACK_EXTENSION_NAME)) {
                    pdd.physical_device_subpass_merge_feedback_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_subpass_merge_feedback_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_ARM_TENSORS_EXTENSION_NAME)) {
                    pdd.physical_device_tensor_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_tensor_properties_);
                    pdd.physical_device_descriptor_buffer_tensor_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_descriptor_buffer_tensor_properties_);
                    pdd.physical_device_tensor_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_tensor_features_);
                    pdd.physical_device_descriptor_buffer_tensor_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_descriptor_buffer_tensor_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SHADER_MODULE_IDENTIFIER_EXTENSION_NAME)) {
                    pdd.physical_device_shader_module_identifier_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_shader_module_identifier_properties_);
                    pdd.physical_device_shader_module_identifier_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_module_identifier_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_OPTICAL_FLOW_EXTENSION_NAME)) {
                    pdd.physical_device_optical_flow_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_optical_flow_properties_);
                    pdd.physical_device_optical_flow_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_optical_flow_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_LEGACY_DITHERING_EXTENSION_NAME)) {
                    pdd.physical_device_legacy_dithering_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_legacy_dithering_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_PIPELINE_PROTECTED_ACCESS_EXTENSION_NAME)) {
                    pdd.physical_device_pipeline_protected_access_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_pipeline_protected_access_features_);
                }
#ifdef VK_USE_PLATFORM_ANDROID_KHR

                if (PhysicalDeviceData::HasExtension(&pdd, VK_ANDROID_EXTERNAL_FORMAT_RESOLVE_EXTENSION_NAME)) {
                    pdd.physical_device_external_format_resolve_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_external_format_resolve_properties_);
                    pdd.physical_device_external_format_resolve_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_external_format_resolve_features_);
                }
#endif // VK_USE_PLATFORM_ANDROID_KHR

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_MAINTENANCE_5_EXTENSION_NAME)) {
                    pdd.physical_device_maintenance_5_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_maintenance_5_properties_);
                    pdd.physical_device_maintenance_5_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_maintenance_5_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_AMD_ANTI_LAG_EXTENSION_NAME)) {
                    pdd.physical_device_anti_lag_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_anti_lag_features_);
                }
#ifdef VK_ENABLE_BETA_EXTENSIONS

                if (PhysicalDeviceData::HasExtension(&pdd, VK_AMDX_DENSE_GEOMETRY_FORMAT_EXTENSION_NAME)) {
                    pdd.physical_device_dense_geometry_format_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_dense_geometry_format_features_);
                }
#endif // VK_ENABLE_BETA_EXTENSIONS

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_PRESENT_ID_2_EXTENSION_NAME)) {
                    pdd.physical_device_present_id_2_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_present_id_2_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_PRESENT_WAIT_2_EXTENSION_NAME)) {
                    pdd.physical_device_present_wait_2_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_present_wait_2_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_RAY_TRACING_POSITION_FETCH_EXTENSION_NAME)) {
                    pdd.physical_device_ray_tracing_position_fetch_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_ray_tracing_position_fetch_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SHADER_OBJECT_EXTENSION_NAME)) {
                    pdd.physical_device_shader_object_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_shader_object_properties_);
                    pdd.physical_device_shader_object_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_object_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_PIPELINE_BINARY_EXTENSION_NAME)) {
                    pdd.physical_device_pipeline_binary_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_pipeline_binary_properties_);
                    pdd.physical_device_pipeline_binary_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_pipeline_binary_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_QCOM_TILE_PROPERTIES_EXTENSION_NAME)) {
                    pdd.physical_device_tile_properties_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_tile_properties_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_SEC_AMIGO_PROFILING_EXTENSION_NAME)) {
                    pdd.physical_device_amigo_profiling_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_amigo_profiling_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_QCOM_MULTIVIEW_PER_VIEW_VIEWPORTS_EXTENSION_NAME)) {
                    pdd.physical_device_multiview_per_view_viewports_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_multiview_per_view_viewports_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME) || PhysicalDeviceData::HasExtension(&pdd, VK_EXT_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME)) {
                    pdd.physical_device_ray_tracing_invocation_reorder_properties_nv_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_ray_tracing_invocation_reorder_properties_nv_);
                    pdd.physical_device_ray_tracing_invocation_reorder_features_nv_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_ray_tracing_invocation_reorder_features_nv_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_COOPERATIVE_VECTOR_EXTENSION_NAME)) {
                    pdd.physical_device_cooperative_vector_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_cooperative_vector_properties_);
                    pdd.physical_device_cooperative_vector_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_cooperative_vector_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_EXTENDED_SPARSE_ADDRESS_SPACE_EXTENSION_NAME)) {
                    pdd.physical_device_extended_sparse_address_space_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_extended_sparse_address_space_properties_);
                    pdd.physical_device_extended_sparse_address_space_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_extended_sparse_address_space_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_LEGACY_VERTEX_ATTRIBUTES_EXTENSION_NAME)) {
                    pdd.physical_device_legacy_vertex_attributes_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_legacy_vertex_attributes_properties_);
                    pdd.physical_device_legacy_vertex_attributes_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_legacy_vertex_attributes_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_ARM_SHADER_CORE_BUILTINS_EXTENSION_NAME)) {
                    pdd.physical_device_shader_core_builtins_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_shader_core_builtins_properties_);
                    pdd.physical_device_shader_core_builtins_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_core_builtins_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_PIPELINE_LIBRARY_GROUP_HANDLES_EXTENSION_NAME)) {
                    pdd.physical_device_pipeline_library_group_handles_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_pipeline_library_group_handles_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_EXTENSION_NAME)) {
                    pdd.physical_device_dynamic_rendering_unused_attachments_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_dynamic_rendering_unused_attachments_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_INTERNALLY_SYNCHRONIZED_QUEUES_EXTENSION_NAME)) {
                    pdd.physical_device_internally_synchronized_queues_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_internally_synchronized_queues_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_COOPERATIVE_MATRIX_EXTENSION_NAME)) {
                    pdd.physical_device_cooperative_matrix_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_cooperative_matrix_properties_);
                    pdd.physical_device_cooperative_matrix_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_cooperative_matrix_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_ARM_DATA_GRAPH_EXTENSION_NAME)) {
                    pdd.physical_device_data_graph_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_data_graph_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_QCOM_MULTIVIEW_PER_VIEW_RENDER_AREAS_EXTENSION_NAME)) {
                    pdd.physical_device_multiview_per_view_render_areas_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_multiview_per_view_render_areas_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME)) {
                    pdd.physical_device_compute_shader_derivatives_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_compute_shader_derivatives_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_VIDEO_ENCODE_AV1_EXTENSION_NAME)) {
                    pdd.physical_device_video_encode_av_1_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_video_encode_av_1_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_VIDEO_DECODE_VP9_EXTENSION_NAME)) {
                    pdd.physical_device_video_decode_vp_9_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_video_decode_vp_9_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_VIDEO_MAINTENANCE_1_EXTENSION_NAME)) {
                    pdd.physical_device_video_maintenance_1_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_video_maintenance_1_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_PER_STAGE_DESCRIPTOR_SET_EXTENSION_NAME)) {
                    pdd.physical_device_per_stage_descriptor_set_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_per_stage_descriptor_set_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_QCOM_IMAGE_PROCESSING_2_EXTENSION_NAME)) {
                    pdd.physical_device_image_processing_2_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_image_processing_2_properties_);
                    pdd.physical_device_image_processing_2_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_image_processing_2_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_QCOM_FILTER_CUBIC_WEIGHTS_EXTENSION_NAME)) {
                    pdd.physical_device_cubic_weights_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_cubic_weights_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_QCOM_YCBCR_DEGAMMA_EXTENSION_NAME)) {
                    pdd.physical_device_ycbcr_degamma_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_ycbcr_degamma_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_QCOM_FILTER_CUBIC_CLAMP_EXTENSION_NAME)) {
                    pdd.physical_device_cubic_clamp_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_cubic_clamp_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_EXTENSION_NAME)) {
                    pdd.physical_device_attachment_feedback_loop_dynamic_state_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_attachment_feedback_loop_dynamic_state_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME)) {
                    pdd.physical_device_vertex_attribute_divisor_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_vertex_attribute_divisor_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_UNIFIED_IMAGE_LAYOUTS_EXTENSION_NAME)) {
                    pdd.physical_device_unified_image_layouts_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_unified_image_layouts_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SHADER_FLOAT_CONTROLS_2_EXTENSION_NAME)) {
                    pdd.physical_device_shader_float_controls_2_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_float_controls_2_features_);
                }
#ifdef VK_USE_PLATFORM_SCREEN_QNX

                if (PhysicalDeviceData::HasExtension(&pdd, VK_QNX_EXTERNAL_MEMORY_SCREEN_BUFFER_EXTENSION_NAME)) {
                    pdd.physical_device_external_memory_screen_buffer_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_external_memory_screen_buffer_features_);
                }
#endif // VK_USE_PLATFORM_SCREEN_QNX

                if (PhysicalDeviceData::HasExtension(&pdd, VK_MSFT_LAYERED_DRIVER_EXTENSION_NAME)) {
                    pdd.physical_device_layered_driver_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_layered_driver_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SHADER_EXPECT_ASSUME_EXTENSION_NAME)) {
                    pdd.physical_device_shader_expect_assume_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_expect_assume_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_MAINTENANCE_6_EXTENSION_NAME)) {
                    pdd.physical_device_maintenance_6_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_maintenance_6_properties_);
                    pdd.physical_device_maintenance_6_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_maintenance_6_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_DESCRIPTOR_POOL_OVERALLOCATION_EXTENSION_NAME)) {
                    pdd.physical_device_descriptor_pool_overallocation_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_descriptor_pool_overallocation_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_QCOM_TILE_MEMORY_HEAP_EXTENSION_NAME)) {
                    pdd.physical_device_tile_memory_heap_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_tile_memory_heap_properties_);
                    pdd.physical_device_tile_memory_heap_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_tile_memory_heap_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_COPY_MEMORY_INDIRECT_EXTENSION_NAME)) {
                    pdd.physical_device_copy_memory_indirect_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_copy_memory_indirect_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_VIDEO_ENCODE_INTRA_REFRESH_EXTENSION_NAME)) {
                    pdd.physical_device_video_encode_intra_refresh_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_video_encode_intra_refresh_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_VIDEO_ENCODE_QUANTIZATION_MAP_EXTENSION_NAME)) {
                    pdd.physical_device_video_encode_quantization_map_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_video_encode_quantization_map_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_RAW_ACCESS_CHAINS_EXTENSION_NAME)) {
                    pdd.physical_device_raw_access_chains_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_raw_access_chains_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_EXTERNAL_COMPUTE_QUEUE_EXTENSION_NAME)) {
                    pdd.physical_device_external_compute_queue_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_external_compute_queue_properties_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_EXTENSION_NAME)) {
                    pdd.physical_device_shader_relaxed_extended_instruction_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_relaxed_extended_instruction_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_COMMAND_BUFFER_INHERITANCE_EXTENSION_NAME)) {
                    pdd.physical_device_command_buffer_inheritance_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_command_buffer_inheritance_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_MAINTENANCE_7_EXTENSION_NAME)) {
                    pdd.physical_device_maintenance_7_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_maintenance_7_properties_);
                    pdd.physical_device_layered_api_properties_list_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_layered_api_properties_list_);
                    pdd.physical_device_maintenance_7_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_maintenance_7_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_SHADER_ATOMIC_FLOAT16_VECTOR_EXTENSION_NAME)) {
                    pdd.physical_device_shader_atomic_float_16_vector_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_atomic_float_16_vector_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SHADER_REPLICATED_COMPOSITES_EXTENSION_NAME)) {
                    pdd.physical_device_shader_replicated_composites_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_replicated_composites_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SHADER_FLOAT8_EXTENSION_NAME)) {
                    pdd.physical_device_shader_float_8_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_float_8_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_RAY_TRACING_VALIDATION_EXTENSION_NAME)) {
                    pdd.physical_device_ray_tracing_validation_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_ray_tracing_validation_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_CLUSTER_ACCELERATION_STRUCTURE_EXTENSION_NAME)) {
                    pdd.physical_device_cluster_acceleration_structure_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_cluster_acceleration_structure_properties_);
                    pdd.physical_device_cluster_acceleration_structure_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_cluster_acceleration_structure_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_PARTITIONED_ACCELERATION_STRUCTURE_EXTENSION_NAME)) {
                    pdd.physical_device_partitioned_acceleration_structure_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_partitioned_acceleration_structure_properties_);
                    pdd.physical_device_partitioned_acceleration_structure_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_partitioned_acceleration_structure_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME)) {
                    pdd.physical_device_device_generated_commands_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_device_generated_commands_properties_);
                    pdd.physical_device_device_generated_commands_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_device_generated_commands_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_DEVICE_FAULT_EXTENSION_NAME)) {
                    pdd.physical_device_fault_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_fault_properties_);
                    pdd.physical_device_fault_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_fault_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_MAINTENANCE_8_EXTENSION_NAME)) {
                    pdd.physical_device_maintenance_8_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_maintenance_8_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_MESA_IMAGE_ALIGNMENT_CONTROL_EXTENSION_NAME)) {
                    pdd.physical_device_image_alignment_control_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_image_alignment_control_properties_);
                    pdd.physical_device_image_alignment_control_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_image_alignment_control_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_SHADER_FMA_EXTENSION_NAME)) {
                    pdd.physical_device_shader_fma_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_fma_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_PUSH_CONSTANT_BANK_EXTENSION_NAME)) {
                    pdd.physical_device_push_constant_bank_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_push_constant_bank_properties_);
                    pdd.physical_device_push_constant_bank_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_push_constant_bank_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME)) {
                    pdd.physical_device_ray_tracing_invocation_reorder_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_ray_tracing_invocation_reorder_properties_);
                    pdd.physical_device_ray_tracing_invocation_reorder_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_ray_tracing_invocation_reorder_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_DEPTH_CLAMP_CONTROL_EXTENSION_NAME)) {
                    pdd.physical_device_depth_clamp_control_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_depth_clamp_control_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_MAINTENANCE_9_EXTENSION_NAME)) {
                    pdd.physical_device_maintenance_9_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_maintenance_9_properties_);
                    pdd.physical_device_maintenance_9_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_maintenance_9_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_VIDEO_MAINTENANCE_2_EXTENSION_NAME)) {
                    pdd.physical_device_video_maintenance_2_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_video_maintenance_2_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_HUAWEI_HDR_VIVID_EXTENSION_NAME)) {
                    pdd.physical_device_hdr_vivid_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_hdr_vivid_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_COOPERATIVE_MATRIX_2_EXTENSION_NAME)) {
                    pdd.physical_device_cooperative_matrix_2_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_cooperative_matrix_2_properties_);
                    pdd.physical_device_cooperative_matrix_2_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_cooperative_matrix_2_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_ARM_PIPELINE_OPACITY_MICROMAP_EXTENSION_NAME)) {
                    pdd.physical_device_pipeline_opacity_micromap_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_pipeline_opacity_micromap_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_VIDEO_ENCODE_FEEDBACK_2_EXTENSION_NAME)) {
                    pdd.physical_device_video_encode_feedback_2_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_video_encode_feedback_2_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_ARM_PERFORMANCE_COUNTERS_BY_REGION_EXTENSION_NAME)) {
                    pdd.physical_device_performance_counters_by_region_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_performance_counters_by_region_properties_);
                    pdd.physical_device_performance_counters_by_region_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_performance_counters_by_region_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_ARM_SHADER_INSTRUMENTATION_EXTENSION_NAME)) {
                    pdd.physical_device_shader_instrumentation_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_shader_instrumentation_properties_);
                    pdd.physical_device_shader_instrumentation_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_instrumentation_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_VERTEX_ATTRIBUTE_ROBUSTNESS_EXTENSION_NAME) || PhysicalDeviceData::HasExtension(&pdd, VK_KHR_MAINTENANCE_9_EXTENSION_NAME)) {
                    pdd.physical_device_vertex_attribute_robustness_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_vertex_attribute_robustness_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_ARM_FORMAT_PACK_EXTENSION_NAME)) {
                    pdd.physical_device_format_pack_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_format_pack_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_VALVE_FRAGMENT_DENSITY_MAP_LAYERED_EXTENSION_NAME)) {
                    pdd.physical_device_fragment_density_map_layered_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_fragment_density_map_layered_properties_);
                    pdd.physical_device_fragment_density_map_layered_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_fragment_density_map_layered_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_PRESENT_METERING_EXTENSION_NAME)) {
                    pdd.physical_device_present_metering_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_present_metering_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_MULTISAMPLED_RENDER_TO_SWAPCHAIN_EXTENSION_NAME)) {
                    pdd.physical_device_multisampled_render_to_swapchain_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_multisampled_render_to_swapchain_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_ZERO_INITIALIZE_DEVICE_MEMORY_EXTENSION_NAME)) {
                    pdd.physical_device_zero_initialize_device_memory_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_zero_initialize_device_memory_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_OPACITY_MICROMAP_EXTENSION_NAME)) {
                    pdd.physical_device_opacity_micromap_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_opacity_micromap_properties_);
                    pdd.physical_device_opacity_micromap_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_opacity_micromap_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SHADER_64BIT_INDEXING_EXTENSION_NAME)) {
                    pdd.physical_device_shader_64_bit_indexing_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_64_bit_indexing_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_CUSTOM_RESOLVE_EXTENSION_NAME)) {
                    pdd.physical_device_custom_resolve_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_custom_resolve_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_QCOM_DATA_GRAPH_MODEL_EXTENSION_NAME)) {
                    pdd.physical_device_data_graph_model_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_data_graph_model_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_MAINTENANCE_10_EXTENSION_NAME)) {
                    pdd.physical_device_maintenance_10_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_maintenance_10_properties_);
                    pdd.physical_device_maintenance_10_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_maintenance_10_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_ARM_DATA_GRAPH_OPTICAL_FLOW_EXTENSION_NAME)) {
                    pdd.physical_device_data_graph_optical_flow_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_data_graph_optical_flow_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SHADER_LONG_VECTOR_EXTENSION_NAME)) {
                    pdd.physical_device_shader_long_vector_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_shader_long_vector_properties_);
                    pdd.physical_device_shader_long_vector_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_long_vector_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_SEC_PIPELINE_CACHE_INCREMENTAL_MODE_EXTENSION_NAME)) {
                    pdd.physical_device_pipeline_cache_incremental_mode_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_pipeline_cache_incremental_mode_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SHADER_UNIFORM_BUFFER_UNSIZED_ARRAY_EXTENSION_NAME)) {
                    pdd.physical_device_shader_uniform_buffer_unsized_array_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_uniform_buffer_unsized_array_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_COMPUTE_OCCUPANCY_PRIORITY_EXTENSION_NAME)) {
                    pdd.physical_device_compute_occupancy_priority_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_compute_occupancy_priority_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_MAINTENANCE_11_EXTENSION_NAME)) {
                    pdd.physical_device_maintenance_11_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_maintenance_11_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SHADER_SUBGROUP_PARTITIONED_EXTENSION_NAME)) {
                    pdd.physical_device_shader_subgroup_partitioned_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_subgroup_partitioned_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_KHR_EXTENDED_FLAGS_EXTENSION_NAME)) {
                    pdd.physical_device_extended_flags_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_extended_flags_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_SHADER_OCP_MICROSCALING_TYPES_EXTENSION_NAME)) {
                    pdd.physical_device_shader_ocpmicroscaling_types_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_ocpmicroscaling_types_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_VALVE_SHADER_MIXED_FLOAT_DOT_PRODUCT_EXTENSION_NAME)) {
                    pdd.physical_device_shader_mixed_float_dot_product_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_mixed_float_dot_product_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_SEC_THROTTLE_HINT_EXTENSION_NAME)) {
                    pdd.physical_device_throttle_hint_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_throttle_hint_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_ARM_DATA_GRAPH_NEURAL_ACCELERATOR_STATISTICS_EXTENSION_NAME)) {
                    pdd.physical_device_data_graph_neural_accelerator_statistics_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_data_graph_neural_accelerator_statistics_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_EXT_PRIMITIVE_RESTART_INDEX_EXTENSION_NAME)) {
                    pdd.physical_device_primitive_restart_index_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_primitive_restart_index_features_);
                }

                if (PhysicalDeviceData::HasExtension(&pdd, VK_NV_COOPERATIVE_MATRIX_DECODE_VECTOR_EXTENSION_NAME)) {
                    pdd.physical_device_cooperative_matrix_decode_vector_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_cooperative_matrix_decode_vector_features_);
                }

                if (api_version_above_1_1) {
                    pdd.physical_device_subgroup_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_subgroup_properties_);
                }

                if (api_version_above_1_1) {
                    pdd.physical_device_protected_memory_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_protected_memory_properties_);
                }

                if (api_version_above_1_2) {
                    pdd.physical_device_vulkan_11_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_vulkan_11_properties_);
                }

                if (api_version_above_1_2) {
                    pdd.physical_device_vulkan_12_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_vulkan_12_properties_);
                }

                if (api_version_above_1_3) {
                    pdd.physical_device_vulkan_13_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_vulkan_13_properties_);
                }

                if (api_version_above_1_4) {
                    pdd.physical_device_vulkan_14_properties_.pNext = property_chain.pNext;

                    property_chain.pNext = &(pdd.physical_device_vulkan_14_properties_);
                }

                if (api_version_above_1_1) {
                    pdd.physical_device_protected_memory_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_protected_memory_features_);
                }

                if (api_version_above_1_1) {
                    pdd.physical_device_shader_draw_parameter_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_shader_draw_parameter_features_);
                }

                if (api_version_above_1_2) {
                    pdd.physical_device_vulkan_11_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_vulkan_11_features_);
                }

                if (api_version_above_1_2) {
                    pdd.physical_device_vulkan_12_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_vulkan_12_features_);
                }

                if (api_version_above_1_3) {
                    pdd.physical_device_vulkan_13_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_vulkan_13_features_);
                }

                if (api_version_above_1_4) {
                    pdd.physical_device_vulkan_14_features_.pNext = feature_chain.pNext;

                    feature_chain.pNext = &(pdd.physical_device_vulkan_14_features_);
                }

                if (pdd.GetEffectiveVersion() >= VK_API_VERSION_1_1) {
                    dt->GetPhysicalDeviceProperties2(physical_device, &property_chain);
                    if (layer_settings->simulate.default_feature_values == DEFAULT_FEATURE_VALUES_DEVICE) {
                        dt->GetPhysicalDeviceFeatures2(physical_device, &feature_chain);
                    }
                    dt->GetPhysicalDeviceMemoryProperties2(physical_device, &memory_chain);
                } else {
                    dt->GetPhysicalDeviceProperties2(physical_device, &property_chain);
                    if (layer_settings->simulate.default_feature_values == DEFAULT_FEATURE_VALUES_DEVICE) {
                        dt->GetPhysicalDeviceFeatures2(physical_device, &feature_chain);
                    }
                    dt->GetPhysicalDeviceMemoryProperties2(physical_device, &memory_chain);
                }

                pdd.physical_device_properties_ = property_chain.properties;
                pdd.physical_device_features_ = feature_chain.features;
                pdd.physical_device_memory_properties_ = memory_chain.memoryProperties;
            }

            ::device_has_astc = pdd.physical_device_features_.textureCompressionASTC_LDR == VK_TRUE;
            ::device_has_bc = pdd.physical_device_features_.textureCompressionBC == VK_TRUE;
            ::device_has_etc2 = pdd.physical_device_features_.textureCompressionETC2 == VK_TRUE;

            if (layer_settings->simulate.capabilities & SIMULATE_FORMATS_BIT) {
                LoadDeviceFormats(instance, &pdd, physical_device, &pdd.device_formats_, &pdd.device_formats_3_);
            }
            if (layer_settings->simulate.capabilities & SIMULATE_QUEUE_FAMILY_PROPERTIES_BIT) {
                LoadQueueFamilyProperties(instance, physical_device, &pdd);
            }
            if (layer_settings->simulate.capabilities & (SIMULATE_VIDEO_CAPABILITIES_BIT | SIMULATE_VIDEO_FORMATS_BIT)) {
                LoadVideoProfiles(instance, physical_device, &pdd, layer_settings->simulate.capabilities);
            }

            LogMessage(layer_settings, DEBUG_REPORT_NOTIFICATION_BIT,
                       "Found \"%s\" with Vulkan %d.%d.%d driver.\n", pdd.physical_device_properties_.deviceName,
                              VK_API_VERSION_MAJOR(pdd.physical_device_properties_.apiVersion),
                              VK_API_VERSION_MINOR(pdd.physical_device_properties_.apiVersion),
                              VK_API_VERSION_PATCH(pdd.physical_device_properties_.apiVersion));

            // Override PDD members with values from configuration file(s).
            if (result == VK_SUCCESS) {
                JsonLoader &json_loader = *JsonLoader::Find(instance);
                result = json_loader.LoadDevice(pdd.physical_device_properties_.deviceName, &pdd);
            }

            // VK_VULKAN_1_1
            TransferValue(&(pdd.physical_device_vulkan_11_properties_), &(pdd.physical_device_multiview_properties_), pdd.vulkan_1_1_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_11_features_), &(pdd.physical_device_multiview_features_), pdd.vulkan_1_1_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_11_properties_), &(pdd.physical_device_idproperties_), pdd.vulkan_1_1_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_11_features_), &(pdd.physical_device_16_bit_storage_features_), pdd.vulkan_1_1_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_11_properties_), &(pdd.physical_device_point_clipping_properties_), pdd.vulkan_1_1_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_11_features_), &(pdd.physical_device_variable_pointer_features_), pdd.vulkan_1_1_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_11_features_), &(pdd.physical_device_sampler_ycbcr_conversion_features_), pdd.vulkan_1_1_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_11_properties_), &(pdd.physical_device_maintenance_3_properties_), pdd.vulkan_1_1_properties_written_);

            // VK_VULKAN_1_2
            TransferValue(&(pdd.physical_device_vulkan_12_features_), &(pdd.physical_device_float_16_int_8_features_), pdd.vulkan_1_2_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_12_features_), &(pdd.physical_device_imageless_framebuffer_features_), pdd.vulkan_1_2_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_12_properties_), &(pdd.physical_device_sampler_filter_minmax_properties_), pdd.vulkan_1_2_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_12_properties_), &(pdd.physical_device_descriptor_indexing_properties_), pdd.vulkan_1_2_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_12_features_), &(pdd.physical_device_descriptor_indexing_features_), pdd.vulkan_1_2_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_12_features_), &(pdd.physical_device_shader_subgroup_extended_types_features_), pdd.vulkan_1_2_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_12_features_), &(pdd.physical_device_8_bit_storage_features_), pdd.vulkan_1_2_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_12_features_), &(pdd.physical_device_shader_atomic_int_64_features_), pdd.vulkan_1_2_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_12_properties_), &(pdd.physical_device_driver_properties_), pdd.vulkan_1_2_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_12_properties_), &(pdd.physical_device_float_controls_properties_), pdd.vulkan_1_2_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_12_properties_), &(pdd.physical_device_depth_stencil_resolve_properties_), pdd.vulkan_1_2_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_12_properties_), &(pdd.physical_device_timeline_semaphore_properties_), pdd.vulkan_1_2_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_12_features_), &(pdd.physical_device_timeline_semaphore_features_), pdd.vulkan_1_2_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_12_features_), &(pdd.physical_device_vulkan_memory_model_features_), pdd.vulkan_1_2_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_12_features_), &(pdd.physical_device_scalar_block_layout_features_), pdd.vulkan_1_2_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_12_features_), &(pdd.physical_device_separate_depth_stencil_layouts_features_), pdd.vulkan_1_2_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_12_features_), &(pdd.physical_device_uniform_buffer_standard_layout_features_), pdd.vulkan_1_2_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_12_features_), &(pdd.physical_device_buffer_device_address_features_), pdd.vulkan_1_2_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_12_features_), &(pdd.physical_device_host_query_reset_features_), pdd.vulkan_1_2_features_written_);

            // VK_VULKAN_1_3
            TransferValue(&(pdd.physical_device_vulkan_13_features_), &(pdd.physical_device_dynamic_rendering_features_), pdd.vulkan_1_3_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_13_features_), &(pdd.physical_device_texture_compression_astchdrfeatures_), pdd.vulkan_1_3_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_13_properties_), &(pdd.physical_device_inline_uniform_block_properties_), pdd.vulkan_1_3_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_13_features_), &(pdd.physical_device_inline_uniform_block_features_), pdd.vulkan_1_3_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_13_features_), &(pdd.physical_device_shader_terminate_invocation_features_), pdd.vulkan_1_3_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_13_properties_), &(pdd.physical_device_subgroup_size_control_properties_), pdd.vulkan_1_3_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_13_features_), &(pdd.physical_device_subgroup_size_control_features_), pdd.vulkan_1_3_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_13_features_), &(pdd.physical_device_shader_demote_to_helper_invocation_features_), pdd.vulkan_1_3_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_13_properties_), &(pdd.physical_device_shader_integer_dot_product_properties_), pdd.vulkan_1_3_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_13_features_), &(pdd.physical_device_shader_integer_dot_product_features_), pdd.vulkan_1_3_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_13_properties_), &(pdd.physical_device_texel_buffer_alignment_properties_), pdd.vulkan_1_3_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_13_features_), &(pdd.physical_device_private_data_features_), pdd.vulkan_1_3_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_13_features_), &(pdd.physical_device_pipeline_creation_cache_control_features_), pdd.vulkan_1_3_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_13_features_), &(pdd.physical_device_synchronization_2_features_), pdd.vulkan_1_3_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_13_features_), &(pdd.physical_device_zero_initialize_workgroup_memory_features_), pdd.vulkan_1_3_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_13_features_), &(pdd.physical_device_image_robustness_features_), pdd.vulkan_1_3_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_13_properties_), &(pdd.physical_device_maintenance_4_properties_), pdd.vulkan_1_3_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_13_features_), &(pdd.physical_device_maintenance_4_features_), pdd.vulkan_1_3_features_written_);

            // VK_VULKAN_1_4
            TransferValue(&(pdd.physical_device_vulkan_14_properties_), &(pdd.physical_device_pipeline_robustness_properties_), pdd.vulkan_1_4_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_14_features_), &(pdd.physical_device_pipeline_robustness_features_), pdd.vulkan_1_4_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_14_properties_), &(pdd.physical_device_push_descriptor_properties_), pdd.vulkan_1_4_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_14_features_), &(pdd.physical_device_vertex_attribute_divisor_features_), pdd.vulkan_1_4_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_14_features_), &(pdd.physical_device_dynamic_rendering_local_read_features_), pdd.vulkan_1_4_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_14_properties_), &(pdd.physical_device_line_rasterization_properties_), pdd.vulkan_1_4_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_14_features_), &(pdd.physical_device_line_rasterization_features_), pdd.vulkan_1_4_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_14_features_), &(pdd.physical_device_index_type_uint_8_features_), pdd.vulkan_1_4_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_14_properties_), &(pdd.physical_device_host_image_copy_properties_), pdd.vulkan_1_4_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_14_features_), &(pdd.physical_device_host_image_copy_features_), pdd.vulkan_1_4_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_14_features_), &(pdd.physical_device_global_priority_query_features_), pdd.vulkan_1_4_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_14_features_), &(pdd.physical_device_shader_subgroup_rotate_features_), pdd.vulkan_1_4_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_14_features_), &(pdd.physical_device_pipeline_protected_access_features_), pdd.vulkan_1_4_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_14_properties_), &(pdd.physical_device_maintenance_5_properties_), pdd.vulkan_1_4_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_14_features_), &(pdd.physical_device_maintenance_5_features_), pdd.vulkan_1_4_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_14_properties_), &(pdd.physical_device_vertex_attribute_divisor_properties_), pdd.vulkan_1_4_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_14_features_), &(pdd.physical_device_shader_float_controls_2_features_), pdd.vulkan_1_4_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_14_features_), &(pdd.physical_device_shader_expect_assume_features_), pdd.vulkan_1_4_features_written_);
            TransferValue(&(pdd.physical_device_vulkan_14_properties_), &(pdd.physical_device_maintenance_6_properties_), pdd.vulkan_1_4_properties_written_);
            TransferValue(&(pdd.physical_device_vulkan_14_features_), &(pdd.physical_device_maintenance_6_features_), pdd.vulkan_1_4_features_written_);

            if (layer_settings->simulate.capabilities & SIMULATE_EXTENSIONS_BIT) {
                pdd.simulation_extensions_ = pdd.map_of_extension_properties_;
            } else {
                pdd.simulation_extensions_ = pdd.device_extensions_;
            }

            for (std::size_t j = 0, m = layer_settings->simulate.exclude_device_extensions.size(); j < m; ++j) {
                pdd.simulation_extensions_.erase(layer_settings->simulate.exclude_device_extensions[j].c_str());
            }
        }
    }

    LogFlush(layer_settings);

    return result;
}

VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *pName) {
// Apply the DRY principle, see https://en.wikipedia.org/wiki/Don%27t_repeat_yourself
#define GET_PROC_ADDR(func) \
    if (strcmp("vk" #func, pName) == 0) return reinterpret_cast<PFN_vkVoidFunction>(func);
    GET_PROC_ADDR(GetInstanceProcAddr);
    GET_PROC_ADDR(CreateInstance);
    GET_PROC_ADDR(EnumerateInstanceLayerProperties);
    GET_PROC_ADDR(EnumerateInstanceExtensionProperties);
    GET_PROC_ADDR(EnumerateDeviceExtensionProperties);
    GET_PROC_ADDR(EnumeratePhysicalDevices);
    GET_PROC_ADDR(DestroyInstance);
    GET_PROC_ADDR(GetPhysicalDeviceProperties);
    GET_PROC_ADDR(GetPhysicalDeviceProperties2);
    GET_PROC_ADDR(GetPhysicalDeviceProperties2KHR);
    GET_PROC_ADDR(GetPhysicalDeviceFeatures);
    GET_PROC_ADDR(GetPhysicalDeviceFeatures2);
    GET_PROC_ADDR(GetPhysicalDeviceFeatures2KHR);
    GET_PROC_ADDR(GetPhysicalDeviceFormatProperties);
    GET_PROC_ADDR(GetPhysicalDeviceFormatProperties2);
    GET_PROC_ADDR(GetPhysicalDeviceFormatProperties2KHR);
    GET_PROC_ADDR(GetPhysicalDeviceImageFormatProperties);
    GET_PROC_ADDR(GetPhysicalDeviceImageFormatProperties2);
    GET_PROC_ADDR(GetPhysicalDeviceImageFormatProperties2KHR);
    GET_PROC_ADDR(GetPhysicalDeviceToolProperties);
    GET_PROC_ADDR(GetPhysicalDeviceToolPropertiesEXT);
    GET_PROC_ADDR(GetPhysicalDeviceQueueFamilyProperties);
    GET_PROC_ADDR(GetPhysicalDeviceQueueFamilyProperties2);
    GET_PROC_ADDR(GetPhysicalDeviceQueueFamilyProperties2KHR);
    GET_PROC_ADDR(GetPhysicalDeviceVideoCapabilitiesKHR);
    GET_PROC_ADDR(GetPhysicalDeviceVideoFormatPropertiesKHR);
#undef GET_PROC_ADDR

    if (!instance) {
        return nullptr;
    }

    std::lock_guard<std::recursive_mutex> lock(global_lock);
    const auto dt = instance_dispatch_table(instance);

    if (!dt->GetInstanceProcAddr) {
        return nullptr;
    }
    return dt->GetInstanceProcAddr(instance, pName);
}
