// Copyright 2017 The Dawn Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef DAWNNATIVE_VULKAN_VULKANINFO_H_
#define DAWNNATIVE_VULKAN_VULKANINFO_H_

#include "common/ityp_array.h"
#include "common/vulkan_platform.h"
#include "dawn_native/Error.h"
#include "dawn_native/vulkan/VulkanExtensions.h"

#include <vector>

namespace dawn_native::vulkan {

    class Adapter;
    class Backend;
    struct VulkanFunctions;

    // Global information - gathered before the instance is created
    struct VulkanGlobalKnobs {
        VulkanLayerSet layers;
        ityp::array<VulkanLayer, InstanceExtSet, static_cast<uint32_t>(VulkanLayer::EnumCount)>
            layerExtensions;

        // During information gathering `extensions` only contains the instance's extensions but
        // during the instance creation logic it becomes the OR of the instance's extensions and
        // the selected layers' extensions.
        InstanceExtSet extensions;
        bool HasExt(InstanceExt ext) const;
    };

    struct VulkanGlobalInfo : VulkanGlobalKnobs {
        uint32_t apiVersion;
    };

    // Device information - gathered before the device is created.
    struct VulkanDeviceKnobs {
        VkPhysicalDeviceFeatures features;
        VkPhysicalDeviceShaderFloat16Int8FeaturesKHR shaderFloat16Int8Features;
        VkPhysicalDevice16BitStorageFeaturesKHR _16BitStorageFeatures;
        VkPhysicalDeviceSubgroupSizeControlFeaturesEXT subgroupSizeControlFeatures;

        bool HasExt(DeviceExt ext) const;
        DeviceExtSet extensions;
    };

    struct VulkanDeviceInfo : VulkanDeviceKnobs {
        VkPhysicalDeviceProperties properties;
        VkPhysicalDeviceDriverProperties driverProperties;
        VkPhysicalDeviceSubgroupSizeControlPropertiesEXT subgroupSizeControlProperties;

        std::vector<VkQueueFamilyProperties> queueFamilies;

        std::vector<VkMemoryType> memoryTypes;
        std::vector<VkMemoryHeap> memoryHeaps;

        std::vector<VkLayerProperties> layers;
        // TODO(cwallez@chromium.org): layer instance extensions
    };

    struct VulkanSurfaceInfo {
        VkSurfaceCapabilitiesKHR capabilities;
        std::vector<VkSurfaceFormatKHR> formats;
        std::vector<VkPresentModeKHR> presentModes;
        std::vector<bool> supportedQueueFamilies;
    };

    ResultOrError<VulkanGlobalInfo> GatherGlobalInfo(const VulkanFunctions& vkFunctions);
    ResultOrError<std::vector<VkPhysicalDevice>> GatherPhysicalDevices(
        VkInstance instance,
        const VulkanFunctions& vkFunctions);
    ResultOrError<VulkanDeviceInfo> GatherDeviceInfo(const Adapter& adapter);
    ResultOrError<VulkanSurfaceInfo> GatherSurfaceInfo(const Adapter& adapter,
                                                       VkSurfaceKHR surface);
}  // namespace dawn_native::vulkan

#endif  // DAWNNATIVE_VULKAN_VULKANINFO_H_
