// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "tcuFunctionLibrary.hpp"
#include "tcuPlatform.hpp"
#include "vkPlatform.hpp"

class FuchsiaVkLibrary : public vk::Library {
public:
    FuchsiaVkLibrary(const char* libraryPath)
        : library_(libraryPath), driver_(library_) {}

    const vk::PlatformInterface& getPlatformInterface() const {
        return driver_;
    }
    const tcu::FunctionLibrary&             getFunctionLibrary              (void) const
    {
            return library_;
    }

private:
    const tcu::DynamicFunctionLibrary library_;
    const vk::PlatformDriver driver_;
};

class FuchsiaVkPlatform : public vk::Platform {
public:
    vk::Library* createLibrary(const char* libraryPath) const { return new FuchsiaVkLibrary(libraryPath ? libraryPath : "libvulkan.so"); }

    void describePlatform (std::ostream& dst) const
    {
        dst << "OS: Fuchsia\n";
        const char* cpu = "Unknown";
#if defined(__x86_64__)
        cpu = "x86_64";
#elif defined(__aarch64__)
        cpu = "aarch64";
#endif
        dst << "CPU: " << cpu << "\n";
    }

    void getMemoryLimits(tcu::PlatformMemoryLimits& limits) const {
        // Copied from tcuX11VulkanPlatform.cpp
        limits.totalSystemMemory = 256 * 1024 * 1024;
        limits.totalDeviceLocalMemory = 0; // unified memory
        limits.deviceMemoryAllocationGranularity = 64 * 1024;
        limits.devicePageSize = 4096;
        limits.devicePageTableEntrySize = 8;
        limits.devicePageTableHierarchyLevels = 3;
    }
};

class FuchsiaPlatform : public tcu::Platform {
public:
    ~FuchsiaPlatform() {}

    const vk::Platform& getVulkanPlatform() const { return vk_platform_; }

private:
    FuchsiaVkPlatform vk_platform_;
};

tcu::Platform* createPlatform() {
    return new FuchsiaPlatform();
}
