// Copyright 2018 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/d3d12/PlatformFunctions.h"

#include "common/DynamicLib.h"

#include <comdef.h>
#include <array>
#include <sstream>

namespace dawn_native { namespace d3d12 {
    namespace {
        // Extract Version from "10.0.{Version}.0" if possible, otherwise return 0.
        uint32_t GetWindowsSDKVersionFromDirectoryName(const char* directoryName) {
            constexpr char kPrefix[] = "10.0.";
            constexpr char kPostfix[] = ".0";

            constexpr uint32_t kPrefixLen = sizeof(kPrefix) - 1;
            constexpr uint32_t kPostfixLen = sizeof(kPostfix) - 1;
            const uint32_t directoryNameLen = strlen(directoryName);

            if (directoryNameLen < kPrefixLen + kPostfixLen + 1) {
                return 0;
            }

            // Check if directoryName starts with "10.0.".
            if (strncmp(directoryName, kPrefix, kPrefixLen) != 0) {
                return 0;
            }

            // Check if directoryName ends with ".0".
            if (strncmp(directoryName + (directoryNameLen - kPostfixLen), kPostfix, kPostfixLen) !=
                0) {
                return 0;
            }

            // Extract Version from "10.0.{Version}.0" and convert Version into an integer.
            return atoi(directoryName + kPrefixLen);
        }

        class ScopedFileHandle final {
          public:
            explicit ScopedFileHandle(HANDLE handle) : mHandle(handle) {
            }
            ~ScopedFileHandle() {
                if (mHandle != INVALID_HANDLE_VALUE) {
                    ASSERT(FindClose(mHandle));
                }
            }
            HANDLE GetHandle() const {
                return mHandle;
            }

          private:
            HANDLE mHandle;
        };

        std::string GetWindowsSDKBasePath() {
            const char* kDefaultWindowsSDKPath =
                "C:\\Program Files (x86)\\Windows Kits\\10\\bin\\*";
            WIN32_FIND_DATAA fileData;
            ScopedFileHandle handle(FindFirstFileA(kDefaultWindowsSDKPath, &fileData));
            if (handle.GetHandle() == INVALID_HANDLE_VALUE) {
                return "";
            }

            uint32_t highestWindowsSDKVersion = 0;
            do {
                if (!(fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
                    continue;
                }

                highestWindowsSDKVersion =
                    std::max(highestWindowsSDKVersion,
                             GetWindowsSDKVersionFromDirectoryName(fileData.cFileName));
            } while (FindNextFileA(handle.GetHandle(), &fileData));

            if (highestWindowsSDKVersion == 0) {
                return "";
            }

            // Currently we only support using DXC on x64.
            std::ostringstream ostream;
            ostream << "C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0."
                    << highestWindowsSDKVersion << ".0\\x64\\";

            return ostream.str();
        }
    }  // anonymous namespace

    PlatformFunctions::PlatformFunctions() = default;
    PlatformFunctions::~PlatformFunctions() = default;

    MaybeError PlatformFunctions::LoadFunctions() {
        DAWN_TRY(LoadD3D12());
        DAWN_TRY(LoadDXGI());
        LoadDXCLibraries();
        DAWN_TRY(LoadFXCompiler());
        DAWN_TRY(LoadD3D11());
        LoadPIXRuntime();
        return {};
    }

    MaybeError PlatformFunctions::LoadD3D12() {
#if DAWN_PLATFORM_WINUWP
        d3d12CreateDevice = &D3D12CreateDevice;
        d3d12GetDebugInterface = &D3D12GetDebugInterface;
        d3d12SerializeRootSignature = &D3D12SerializeRootSignature;
        d3d12CreateRootSignatureDeserializer = &D3D12CreateRootSignatureDeserializer;
        d3d12SerializeVersionedRootSignature = &D3D12SerializeVersionedRootSignature;
        d3d12CreateVersionedRootSignatureDeserializer =
            &D3D12CreateVersionedRootSignatureDeserializer;
#else
        std::string error;
        if (!mD3D12Lib.Open("d3d12.dll", &error) ||
            !mD3D12Lib.GetProc(&d3d12CreateDevice, "D3D12CreateDevice", &error) ||
            !mD3D12Lib.GetProc(&d3d12GetDebugInterface, "D3D12GetDebugInterface", &error) ||
            !mD3D12Lib.GetProc(&d3d12SerializeRootSignature, "D3D12SerializeRootSignature",
                               &error) ||
            !mD3D12Lib.GetProc(&d3d12CreateRootSignatureDeserializer,
                               "D3D12CreateRootSignatureDeserializer", &error) ||
            !mD3D12Lib.GetProc(&d3d12SerializeVersionedRootSignature,
                               "D3D12SerializeVersionedRootSignature", &error) ||
            !mD3D12Lib.GetProc(&d3d12CreateVersionedRootSignatureDeserializer,
                               "D3D12CreateVersionedRootSignatureDeserializer", &error)) {
            return DAWN_INTERNAL_ERROR(error.c_str());
        }
#endif

        return {};
    }

    MaybeError PlatformFunctions::LoadD3D11() {
#if DAWN_PLATFORM_WINUWP
        d3d11on12CreateDevice = &D3D11On12CreateDevice;
#else
        std::string error;
        if (!mD3D11Lib.Open("d3d11.dll", &error) ||
            !mD3D11Lib.GetProc(&d3d11on12CreateDevice, "D3D11On12CreateDevice", &error)) {
            return DAWN_INTERNAL_ERROR(error.c_str());
        }
#endif

        return {};
    }

    MaybeError PlatformFunctions::LoadDXGI() {
#if DAWN_PLATFORM_WINUWP
#    if defined(_DEBUG)
        // DXGIGetDebugInterface1 is tagged as a development-only capability
        // which implies that linking to this function will cause
        // the application to fail Windows store certification
        // But we need it when debuging using VS Graphics Diagnostics or PIX
        // So we only link to it in debug build
        dxgiGetDebugInterface1 = &DXGIGetDebugInterface1;
#    endif
        createDxgiFactory2 = &CreateDXGIFactory2;
#else
        std::string error;
        if (!mDXGILib.Open("dxgi.dll", &error) ||
            !mDXGILib.GetProc(&dxgiGetDebugInterface1, "DXGIGetDebugInterface1", &error) ||
            !mDXGILib.GetProc(&createDxgiFactory2, "CreateDXGIFactory2", &error)) {
            return DAWN_INTERNAL_ERROR(error.c_str());
        }
#endif

        return {};
    }

    void PlatformFunctions::LoadDXCLibraries() {
        // TODO(dawn:766)
        // Statically linked with dxcompiler.lib in UWP
        // currently linked with dxcompiler.lib making CoreApp unable to activate
        // LoadDXIL and LoadDXCompiler will fail in UWP, but LoadFunctions() can still be
        // successfully executed.

        const std::string& windowsSDKBasePath = GetWindowsSDKBasePath();

        LoadDXIL(windowsSDKBasePath);
        LoadDXCompiler(windowsSDKBasePath);
    }

    void PlatformFunctions::LoadDXIL(const std::string& baseWindowsSDKPath) {
        const char* dxilDLLName = "dxil.dll";
        const std::array<std::string, 2> kDxilDLLPaths = {
            {dxilDLLName, baseWindowsSDKPath + dxilDLLName}};

        for (const std::string& dxilDLLPath : kDxilDLLPaths) {
            if (mDXILLib.Open(dxilDLLPath, nullptr)) {
                return;
            }
        }
        ASSERT(!mDXILLib.Valid());
    }

    void PlatformFunctions::LoadDXCompiler(const std::string& baseWindowsSDKPath) {
        // DXIL must be loaded before DXC, otherwise shader signing is unavailable
        if (!mDXILLib.Valid()) {
            return;
        }

        const char* dxCompilerDLLName = "dxcompiler.dll";
        const std::array<std::string, 2> kDxCompilerDLLPaths = {
            {dxCompilerDLLName, baseWindowsSDKPath + dxCompilerDLLName}};

        DynamicLib dxCompilerLib;
        for (const std::string& dxCompilerDLLName : kDxCompilerDLLPaths) {
            if (dxCompilerLib.Open(dxCompilerDLLName, nullptr)) {
                break;
            }
        }

        if (dxCompilerLib.Valid() &&
            dxCompilerLib.GetProc(&dxcCreateInstance, "DxcCreateInstance", nullptr)) {
            mDXCompilerLib = std::move(dxCompilerLib);
        } else {
            mDXILLib.Close();
        }
    }

    MaybeError PlatformFunctions::LoadFXCompiler() {
#if DAWN_PLATFORM_WINUWP
        d3dCompile = &D3DCompile;
#else
        std::string error;
        if (!mFXCompilerLib.Open("d3dcompiler_47.dll", &error) ||
            !mFXCompilerLib.GetProc(&d3dCompile, "D3DCompile", &error)) {
            return DAWN_INTERNAL_ERROR(error.c_str());
        }
#endif
        return {};
    }

    bool PlatformFunctions::IsPIXEventRuntimeLoaded() const {
        return mPIXEventRuntimeLib.Valid();
    }

    bool PlatformFunctions::IsDXCAvailable() const {
        return mDXILLib.Valid() && mDXCompilerLib.Valid();
    }

    void PlatformFunctions::LoadPIXRuntime() {
        // TODO(dawn:766):
        // In UWP PIX should be statically linked WinPixEventRuntime_UAP.lib
        // So maybe we should put WinPixEventRuntime as a third party package
        // Currently PIX is not going to be loaded in UWP since the following
        // mPIXEventRuntimeLib.Open will fail.
        if (!mPIXEventRuntimeLib.Open("WinPixEventRuntime.dll") ||
            !mPIXEventRuntimeLib.GetProc(&pixBeginEventOnCommandList,
                                         "PIXBeginEventOnCommandList") ||
            !mPIXEventRuntimeLib.GetProc(&pixEndEventOnCommandList, "PIXEndEventOnCommandList") ||
            !mPIXEventRuntimeLib.GetProc(&pixSetMarkerOnCommandList, "PIXSetMarkerOnCommandList")) {
            mPIXEventRuntimeLib.Close();
        }
    }

}}  // namespace dawn_native::d3d12
