// 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.

#include "dawn/native/vulkan/VulkanFunctions.h"

#include "dawn/common/DynamicLib.h"
#include "dawn/native/vulkan/VulkanInfo.h"

namespace dawn::native::vulkan {

#define GET_GLOBAL_PROC(name)                                                              \
    do {                                                                                   \
        name = reinterpret_cast<decltype(name)>(GetInstanceProcAddr(nullptr, "vk" #name)); \
        if (name == nullptr) {                                                             \
            return DAWN_INTERNAL_ERROR(std::string("Couldn't get proc vk") + #name);       \
        }                                                                                  \
    } while (0)

    MaybeError VulkanFunctions::LoadGlobalProcs(const DynamicLib& vulkanLib) {
        if (!vulkanLib.GetProc(&GetInstanceProcAddr, "vkGetInstanceProcAddr")) {
            return DAWN_INTERNAL_ERROR("Couldn't get vkGetInstanceProcAddr");
        }

        GET_GLOBAL_PROC(CreateInstance);
        GET_GLOBAL_PROC(EnumerateInstanceExtensionProperties);
        GET_GLOBAL_PROC(EnumerateInstanceLayerProperties);

        // Is not available in Vulkan 1.0, so allow nullptr
        EnumerateInstanceVersion = reinterpret_cast<decltype(EnumerateInstanceVersion)>(
            GetInstanceProcAddr(nullptr, "vkEnumerateInstanceVersion"));

        return {};
    }

#define GET_INSTANCE_PROC_BASE(name, procName)                                                  \
    do {                                                                                        \
        name = reinterpret_cast<decltype(name)>(GetInstanceProcAddr(instance, "vk" #procName)); \
        if (name == nullptr) {                                                                  \
            return DAWN_INTERNAL_ERROR(std::string("Couldn't get proc vk") + #procName);        \
        }                                                                                       \
    } while (0)

#define GET_INSTANCE_PROC(name) GET_INSTANCE_PROC_BASE(name, name)
#define GET_INSTANCE_PROC_VENDOR(name, vendor) GET_INSTANCE_PROC_BASE(name, name##vendor)

    MaybeError VulkanFunctions::LoadInstanceProcs(VkInstance instance,
                                                  const VulkanGlobalInfo& globalInfo) {
        // Load this proc first so that we can destroy the instance even if some other
        // GET_INSTANCE_PROC fails
        GET_INSTANCE_PROC(DestroyInstance);

        GET_INSTANCE_PROC(CreateDevice);
        GET_INSTANCE_PROC(DestroyDevice);
        GET_INSTANCE_PROC(EnumerateDeviceExtensionProperties);
        GET_INSTANCE_PROC(EnumerateDeviceLayerProperties);
        GET_INSTANCE_PROC(EnumeratePhysicalDevices);
        GET_INSTANCE_PROC(GetDeviceProcAddr);
        GET_INSTANCE_PROC(GetPhysicalDeviceFeatures);
        GET_INSTANCE_PROC(GetPhysicalDeviceFormatProperties);
        GET_INSTANCE_PROC(GetPhysicalDeviceImageFormatProperties);
        GET_INSTANCE_PROC(GetPhysicalDeviceMemoryProperties);
        GET_INSTANCE_PROC(GetPhysicalDeviceProperties);
        GET_INSTANCE_PROC(GetPhysicalDeviceQueueFamilyProperties);
        GET_INSTANCE_PROC(GetPhysicalDeviceSparseImageFormatProperties);

        if (globalInfo.HasExt(InstanceExt::DebugUtils)) {
            GET_INSTANCE_PROC(CmdBeginDebugUtilsLabelEXT);
            GET_INSTANCE_PROC(CmdEndDebugUtilsLabelEXT);
            GET_INSTANCE_PROC(CmdInsertDebugUtilsLabelEXT);
            GET_INSTANCE_PROC(CreateDebugUtilsMessengerEXT);
            GET_INSTANCE_PROC(DestroyDebugUtilsMessengerEXT);
            GET_INSTANCE_PROC(QueueBeginDebugUtilsLabelEXT);
            GET_INSTANCE_PROC(QueueEndDebugUtilsLabelEXT);
            GET_INSTANCE_PROC(QueueInsertDebugUtilsLabelEXT);
            GET_INSTANCE_PROC(SetDebugUtilsObjectNameEXT);
            GET_INSTANCE_PROC(SetDebugUtilsObjectTagEXT);
            GET_INSTANCE_PROC(SubmitDebugUtilsMessageEXT);
        }

        // Vulkan 1.1 is not required to report promoted extensions from 1.0 and is not required to
        // support the vendor entrypoint in GetProcAddress.
        if (globalInfo.apiVersion >= VK_MAKE_VERSION(1, 1, 0)) {
            GET_INSTANCE_PROC(GetPhysicalDeviceExternalBufferProperties);
        } else if (globalInfo.HasExt(InstanceExt::ExternalMemoryCapabilities)) {
            GET_INSTANCE_PROC_VENDOR(GetPhysicalDeviceExternalBufferProperties, KHR);
        }

        if (globalInfo.apiVersion >= VK_MAKE_VERSION(1, 1, 0)) {
            GET_INSTANCE_PROC(GetPhysicalDeviceExternalSemaphoreProperties);
        } else if (globalInfo.HasExt(InstanceExt::ExternalSemaphoreCapabilities)) {
            GET_INSTANCE_PROC_VENDOR(GetPhysicalDeviceExternalSemaphoreProperties, KHR);
        }

        if (globalInfo.apiVersion >= VK_MAKE_VERSION(1, 1, 0)) {
            GET_INSTANCE_PROC(GetPhysicalDeviceFeatures2);
            GET_INSTANCE_PROC(GetPhysicalDeviceProperties2);
            GET_INSTANCE_PROC(GetPhysicalDeviceFormatProperties2);
            GET_INSTANCE_PROC(GetPhysicalDeviceImageFormatProperties2);
            GET_INSTANCE_PROC(GetPhysicalDeviceQueueFamilyProperties2);
            GET_INSTANCE_PROC(GetPhysicalDeviceMemoryProperties2);
            GET_INSTANCE_PROC(GetPhysicalDeviceSparseImageFormatProperties2);
        } else if (globalInfo.HasExt(InstanceExt::GetPhysicalDeviceProperties2)) {
            GET_INSTANCE_PROC_VENDOR(GetPhysicalDeviceFeatures2, KHR);
            GET_INSTANCE_PROC_VENDOR(GetPhysicalDeviceProperties2, KHR);
            GET_INSTANCE_PROC_VENDOR(GetPhysicalDeviceFormatProperties2, KHR);
            GET_INSTANCE_PROC_VENDOR(GetPhysicalDeviceImageFormatProperties2, KHR);
            GET_INSTANCE_PROC_VENDOR(GetPhysicalDeviceQueueFamilyProperties2, KHR);
            GET_INSTANCE_PROC_VENDOR(GetPhysicalDeviceMemoryProperties2, KHR);
            GET_INSTANCE_PROC_VENDOR(GetPhysicalDeviceSparseImageFormatProperties2, KHR);
        }

        if (globalInfo.HasExt(InstanceExt::Surface)) {
            GET_INSTANCE_PROC(DestroySurfaceKHR);
            GET_INSTANCE_PROC(GetPhysicalDeviceSurfaceSupportKHR);
            GET_INSTANCE_PROC(GetPhysicalDeviceSurfaceCapabilitiesKHR);
            GET_INSTANCE_PROC(GetPhysicalDeviceSurfaceFormatsKHR);
            GET_INSTANCE_PROC(GetPhysicalDeviceSurfacePresentModesKHR);
        }

#if defined(VK_USE_PLATFORM_FUCHSIA)
        if (globalInfo.HasExt(InstanceExt::FuchsiaImagePipeSurface)) {
            GET_INSTANCE_PROC(CreateImagePipeSurfaceFUCHSIA);
        }
#endif  // defined(VK_USE_PLATFORM_FUCHSIA)

#if defined(DAWN_ENABLE_BACKEND_METAL)
        if (globalInfo.HasExt(InstanceExt::MetalSurface)) {
            GET_INSTANCE_PROC(CreateMetalSurfaceEXT);
        }
#endif  // defined(DAWN_ENABLE_BACKEND_METAL)

#if defined(DAWN_PLATFORM_WINDOWS)
        if (globalInfo.HasExt(InstanceExt::Win32Surface)) {
            GET_INSTANCE_PROC(CreateWin32SurfaceKHR);
            GET_INSTANCE_PROC(GetPhysicalDeviceWin32PresentationSupportKHR);
        }
#endif  // defined(DAWN_PLATFORM_WINDOWS)

#if defined(DAWN_PLATFORM_ANDROID)
        if (globalInfo.HasExt(InstanceExt::AndroidSurface)) {
            GET_INSTANCE_PROC(CreateAndroidSurfaceKHR);
        }
#endif  // defined(DAWN_PLATFORM_ANDROID)

#if defined(DAWN_USE_X11)
        if (globalInfo.HasExt(InstanceExt::XlibSurface)) {
            GET_INSTANCE_PROC(CreateXlibSurfaceKHR);
            GET_INSTANCE_PROC(GetPhysicalDeviceXlibPresentationSupportKHR);
        }
        if (globalInfo.HasExt(InstanceExt::XcbSurface)) {
            GET_INSTANCE_PROC(CreateXcbSurfaceKHR);
            GET_INSTANCE_PROC(GetPhysicalDeviceXcbPresentationSupportKHR);
        }
#endif  // defined(DAWN_USE_X11)
        return {};
    }

#define GET_DEVICE_PROC(name)                                                           \
    do {                                                                                \
        name = reinterpret_cast<decltype(name)>(GetDeviceProcAddr(device, "vk" #name)); \
        if (name == nullptr) {                                                          \
            return DAWN_INTERNAL_ERROR(std::string("Couldn't get proc vk") + #name);    \
        }                                                                               \
    } while (0)

    MaybeError VulkanFunctions::LoadDeviceProcs(VkDevice device,
                                                const VulkanDeviceInfo& deviceInfo) {
        GET_DEVICE_PROC(AllocateCommandBuffers);
        GET_DEVICE_PROC(AllocateDescriptorSets);
        GET_DEVICE_PROC(AllocateMemory);
        GET_DEVICE_PROC(BeginCommandBuffer);
        GET_DEVICE_PROC(BindBufferMemory);
        GET_DEVICE_PROC(BindImageMemory);
        GET_DEVICE_PROC(CmdBeginQuery);
        GET_DEVICE_PROC(CmdBeginRenderPass);
        GET_DEVICE_PROC(CmdBindDescriptorSets);
        GET_DEVICE_PROC(CmdBindIndexBuffer);
        GET_DEVICE_PROC(CmdBindPipeline);
        GET_DEVICE_PROC(CmdBindVertexBuffers);
        GET_DEVICE_PROC(CmdBlitImage);
        GET_DEVICE_PROC(CmdClearAttachments);
        GET_DEVICE_PROC(CmdClearColorImage);
        GET_DEVICE_PROC(CmdClearDepthStencilImage);
        GET_DEVICE_PROC(CmdCopyBuffer);
        GET_DEVICE_PROC(CmdCopyBufferToImage);
        GET_DEVICE_PROC(CmdCopyImage);
        GET_DEVICE_PROC(CmdCopyImageToBuffer);
        GET_DEVICE_PROC(CmdCopyQueryPoolResults);
        GET_DEVICE_PROC(CmdDispatch);
        GET_DEVICE_PROC(CmdDispatchIndirect);
        GET_DEVICE_PROC(CmdDraw);
        GET_DEVICE_PROC(CmdDrawIndexed);
        GET_DEVICE_PROC(CmdDrawIndexedIndirect);
        GET_DEVICE_PROC(CmdDrawIndirect);
        GET_DEVICE_PROC(CmdEndQuery);
        GET_DEVICE_PROC(CmdEndRenderPass);
        GET_DEVICE_PROC(CmdExecuteCommands);
        GET_DEVICE_PROC(CmdFillBuffer);
        GET_DEVICE_PROC(CmdNextSubpass);
        GET_DEVICE_PROC(CmdPipelineBarrier);
        GET_DEVICE_PROC(CmdPushConstants);
        GET_DEVICE_PROC(CmdResetEvent);
        GET_DEVICE_PROC(CmdResetQueryPool);
        GET_DEVICE_PROC(CmdResolveImage);
        GET_DEVICE_PROC(CmdSetBlendConstants);
        GET_DEVICE_PROC(CmdSetDepthBias);
        GET_DEVICE_PROC(CmdSetDepthBounds);
        GET_DEVICE_PROC(CmdSetEvent);
        GET_DEVICE_PROC(CmdSetLineWidth);
        GET_DEVICE_PROC(CmdSetScissor);
        GET_DEVICE_PROC(CmdSetStencilCompareMask);
        GET_DEVICE_PROC(CmdSetStencilReference);
        GET_DEVICE_PROC(CmdSetStencilWriteMask);
        GET_DEVICE_PROC(CmdSetViewport);
        GET_DEVICE_PROC(CmdUpdateBuffer);
        GET_DEVICE_PROC(CmdWaitEvents);
        GET_DEVICE_PROC(CmdWriteTimestamp);
        GET_DEVICE_PROC(CreateBuffer);
        GET_DEVICE_PROC(CreateBufferView);
        GET_DEVICE_PROC(CreateCommandPool);
        GET_DEVICE_PROC(CreateComputePipelines);
        GET_DEVICE_PROC(CreateDescriptorPool);
        GET_DEVICE_PROC(CreateDescriptorSetLayout);
        GET_DEVICE_PROC(CreateEvent);
        GET_DEVICE_PROC(CreateFence);
        GET_DEVICE_PROC(CreateFramebuffer);
        GET_DEVICE_PROC(CreateGraphicsPipelines);
        GET_DEVICE_PROC(CreateImage);
        GET_DEVICE_PROC(CreateImageView);
        GET_DEVICE_PROC(CreatePipelineCache);
        GET_DEVICE_PROC(CreatePipelineLayout);
        GET_DEVICE_PROC(CreateQueryPool);
        GET_DEVICE_PROC(CreateRenderPass);
        GET_DEVICE_PROC(CreateSampler);
        GET_DEVICE_PROC(CreateSemaphore);
        GET_DEVICE_PROC(CreateShaderModule);
        GET_DEVICE_PROC(DestroyBuffer);
        GET_DEVICE_PROC(DestroyBufferView);
        GET_DEVICE_PROC(DestroyCommandPool);
        GET_DEVICE_PROC(DestroyDescriptorPool);
        GET_DEVICE_PROC(DestroyDescriptorSetLayout);
        GET_DEVICE_PROC(DestroyEvent);
        GET_DEVICE_PROC(DestroyFence);
        GET_DEVICE_PROC(DestroyFramebuffer);
        GET_DEVICE_PROC(DestroyImage);
        GET_DEVICE_PROC(DestroyImageView);
        GET_DEVICE_PROC(DestroyPipeline);
        GET_DEVICE_PROC(DestroyPipelineCache);
        GET_DEVICE_PROC(DestroyPipelineLayout);
        GET_DEVICE_PROC(DestroyQueryPool);
        GET_DEVICE_PROC(DestroyRenderPass);
        GET_DEVICE_PROC(DestroySampler);
        GET_DEVICE_PROC(DestroySemaphore);
        GET_DEVICE_PROC(DestroyShaderModule);
        GET_DEVICE_PROC(DeviceWaitIdle);
        GET_DEVICE_PROC(EndCommandBuffer);
        GET_DEVICE_PROC(FlushMappedMemoryRanges);
        GET_DEVICE_PROC(FreeCommandBuffers);
        GET_DEVICE_PROC(FreeDescriptorSets);
        GET_DEVICE_PROC(FreeMemory);
        GET_DEVICE_PROC(GetBufferMemoryRequirements);
        GET_DEVICE_PROC(GetDeviceMemoryCommitment);
        GET_DEVICE_PROC(GetDeviceQueue);
        GET_DEVICE_PROC(GetEventStatus);
        GET_DEVICE_PROC(GetFenceStatus);
        GET_DEVICE_PROC(GetImageMemoryRequirements);
        GET_DEVICE_PROC(GetImageSparseMemoryRequirements);
        GET_DEVICE_PROC(GetImageSubresourceLayout);
        GET_DEVICE_PROC(GetPipelineCacheData);
        GET_DEVICE_PROC(GetQueryPoolResults);
        GET_DEVICE_PROC(GetRenderAreaGranularity);
        GET_DEVICE_PROC(InvalidateMappedMemoryRanges);
        GET_DEVICE_PROC(MapMemory);
        GET_DEVICE_PROC(MergePipelineCaches);
        GET_DEVICE_PROC(QueueBindSparse);
        GET_DEVICE_PROC(QueueSubmit);
        GET_DEVICE_PROC(QueueWaitIdle);
        GET_DEVICE_PROC(ResetCommandBuffer);
        GET_DEVICE_PROC(ResetCommandPool);
        GET_DEVICE_PROC(ResetDescriptorPool);
        GET_DEVICE_PROC(ResetEvent);
        GET_DEVICE_PROC(ResetFences);
        GET_DEVICE_PROC(SetEvent);
        GET_DEVICE_PROC(UnmapMemory);
        GET_DEVICE_PROC(UpdateDescriptorSets);
        GET_DEVICE_PROC(WaitForFences);

        if (deviceInfo.HasExt(DeviceExt::ExternalMemoryFD)) {
            GET_DEVICE_PROC(GetMemoryFdKHR);
            GET_DEVICE_PROC(GetMemoryFdPropertiesKHR);
        }

        if (deviceInfo.HasExt(DeviceExt::ExternalSemaphoreFD)) {
            GET_DEVICE_PROC(ImportSemaphoreFdKHR);
            GET_DEVICE_PROC(GetSemaphoreFdKHR);
        }

        if (deviceInfo.HasExt(DeviceExt::Swapchain)) {
            GET_DEVICE_PROC(CreateSwapchainKHR);
            GET_DEVICE_PROC(DestroySwapchainKHR);
            GET_DEVICE_PROC(GetSwapchainImagesKHR);
            GET_DEVICE_PROC(AcquireNextImageKHR);
            GET_DEVICE_PROC(QueuePresentKHR);
        }

        if (deviceInfo.HasExt(DeviceExt::GetMemoryRequirements2)) {
            GET_DEVICE_PROC(GetBufferMemoryRequirements2);
            GET_DEVICE_PROC(GetImageMemoryRequirements2);
            GET_DEVICE_PROC(GetImageSparseMemoryRequirements2);
        }

#if VK_USE_PLATFORM_FUCHSIA
        if (deviceInfo.HasExt(DeviceExt::ExternalMemoryZirconHandle)) {
            GET_DEVICE_PROC(GetMemoryZirconHandleFUCHSIA);
            GET_DEVICE_PROC(GetMemoryZirconHandlePropertiesFUCHSIA);
        }

        if (deviceInfo.HasExt(DeviceExt::ExternalSemaphoreZirconHandle)) {
            GET_DEVICE_PROC(ImportSemaphoreZirconHandleFUCHSIA);
            GET_DEVICE_PROC(GetSemaphoreZirconHandleFUCHSIA);
        }
#endif

        return {};
    }

}  // namespace dawn::native::vulkan
