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

// A mock GLFW implementation that supports Fuchsia, but only implements
// the functions called from Dawn.

#include <dlfcn.h>

// NOTE: This must be included before GLFW/glfw3.h because the latter will
// include <vulkan/vulkan.h> and "common/vulkan_platform.h" wants to be
// the first header to do so for validity reasons (e.g. undefining weird
// macros on Windows and Linux).
// clang-format off
#include "dawn/common/vulkan_platform.h"
#include "dawn/common/Assert.h"
#include "GLFW/glfw3.h"
// clang-format on

int glfwInit(void) {
    return GLFW_TRUE;
}

void glfwDefaultWindowHints(void) {}

void glfwWindowHint(int hint, int value) {
    DAWN_UNUSED(hint);
    DAWN_UNUSED(value);
}

struct GLFWwindow {
    PFN_vkGetInstanceProcAddr GetInstanceProcAddress = nullptr;
    void* vulkan_loader = nullptr;

    GLFWwindow() {
        vulkan_loader = ::dlopen("libvulkan.so", RTLD_NOW);
        ASSERT(vulkan_loader != nullptr);
        GetInstanceProcAddress = reinterpret_cast<PFN_vkGetInstanceProcAddr>(
            dlsym(vulkan_loader, "vkGetInstanceProcAddr"));
        ASSERT(GetInstanceProcAddress != nullptr);
    }

    ~GLFWwindow() {
        if (vulkan_loader) {
            ::dlclose(vulkan_loader);
        }
        vulkan_loader = nullptr;
    }
};

GLFWwindow* glfwCreateWindow(int width,
                             int height,
                             const char* title,
                             GLFWmonitor* monitor,
                             GLFWwindow* share) {
    ASSERT(monitor == nullptr);
    ASSERT(share == nullptr);
    DAWN_UNUSED(width);
    DAWN_UNUSED(height);
    DAWN_UNUSED(title);
    return new GLFWwindow();
}

VkResult glfwCreateWindowSurface(VkInstance instance,
                                 GLFWwindow* window,
                                 const VkAllocationCallbacks* allocator,
                                 VkSurfaceKHR* surface) {
    // IMPORTANT: This assumes that the VkInstance was created with a Fuchsia
    // swapchain layer enabled, as well as the corresponding extension that
    // is queried here to perform the surface creation. Dawn should do all
    // required steps in VulkanInfo.cpp, VulkanFunctions.cpp and BackendVk.cpp.

    auto vkCreateImagePipeSurfaceFUCHSIA = reinterpret_cast<PFN_vkCreateImagePipeSurfaceFUCHSIA>(
        window->GetInstanceProcAddress(instance, "vkCreateImagePipeSurfaceFUCHSIA"));
    ASSERT(vkCreateImagePipeSurfaceFUCHSIA != nullptr);
    if (!vkCreateImagePipeSurfaceFUCHSIA) {
        *surface = VK_NULL_HANDLE;
        return VK_ERROR_FEATURE_NOT_PRESENT;
    }

    const struct VkImagePipeSurfaceCreateInfoFUCHSIA create_info = {
        VK_STRUCTURE_TYPE_IMAGEPIPE_SURFACE_CREATE_INFO_FUCHSIA,
        nullptr,            // pNext
        0,                  // flags, ignored for now
        ZX_HANDLE_INVALID,  // imagePipeHandle, a null handle matches the framebuffer.
    };

    return vkCreateImagePipeSurfaceFUCHSIA(instance, &create_info, nullptr, surface);
}
