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

// dma_buf_utils.cpp: Utilities to interact with Linux dma bufs.

#include "dma_buf_utils.h"

#include "common/debug.h"

#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

#include <array>

namespace angle
{
GLenum DrmFourCCFormatToGLInternalFormat(int fourccFormat, bool *isYUV)
{
    *isYUV = false;

    switch (fourccFormat)
    {
        case DRM_FORMAT_R8:
            return GL_R8;
        case DRM_FORMAT_R16:
            return GL_R16_EXT;
        case DRM_FORMAT_GR88:
            return GL_RG8_EXT;
        case DRM_FORMAT_ABGR8888:
            return GL_RGBA8;
        case DRM_FORMAT_XBGR8888:
            return GL_RGBX8_ANGLE;
        case DRM_FORMAT_ARGB8888:
            return GL_BGRA8_EXT;
        case DRM_FORMAT_XRGB8888:
            return GL_BGRX8_ANGLEX;
        case DRM_FORMAT_ABGR2101010:
        case DRM_FORMAT_ARGB2101010:
            return GL_RGB10_A2_EXT;
        case DRM_FORMAT_ABGR16161616F:
            return GL_RGBA16F_EXT;
        case DRM_FORMAT_RGB565:
            return GL_RGB565;
        case DRM_FORMAT_NV12:
        case DRM_FORMAT_YVU420:
        case DRM_FORMAT_P010:
            *isYUV = true;
            return GL_RGB8;
        default:
            UNREACHABLE();
            WARN() << "Unknown dma_buf format " << fourccFormat
                   << " used to initialize an EGL image.";
            return GL_RGB8;
    }
}

uint32_t GLInternalFormatToDrmFourCCFormat(GLenum internalFormat)
{
    switch (internalFormat)
    {
        case GL_R8:
            return DRM_FORMAT_R8;
        case GL_RGB8:
            return DRM_FORMAT_GR88;
        case GL_RGB565:
            return DRM_FORMAT_RGB565;
        case GL_RGBA8:
            return DRM_FORMAT_ABGR8888;
        case GL_BGRA8_EXT:
            return DRM_FORMAT_ARGB8888;
        case GL_BGRX8_ANGLEX:
            return DRM_FORMAT_XRGB8888;
        case GL_RGBX8_ANGLE:
            return DRM_FORMAT_XBGR8888;
        case GL_RGB10_A2:
            return DRM_FORMAT_ABGR2101010;
        default:
            WARN() << "Unknown internalFormat: " << internalFormat << ". Treating as 0";
            return 0;
    }
}

#if defined(ANGLE_ENABLE_VULKAN)
std::vector<int> VkFormatToDrmFourCCFormat(VkFormat format)
{
    switch (format)
    {
        case VK_FORMAT_R8_UNORM:
        case VK_FORMAT_R8_SRGB:
            return {DRM_FORMAT_R8};
        case VK_FORMAT_R16_UNORM:
            return {DRM_FORMAT_R16};
        case VK_FORMAT_R8G8_UNORM:
        case VK_FORMAT_R8G8_SRGB:
            return {DRM_FORMAT_GR88};
        case VK_FORMAT_R8G8B8_UNORM:
        case VK_FORMAT_R8G8B8_SRGB:
            return {DRM_FORMAT_BGR888};
        case VK_FORMAT_B8G8R8_UNORM:
        case VK_FORMAT_B8G8R8_SRGB:
            return {DRM_FORMAT_RGB888};
        case VK_FORMAT_R8G8B8A8_UNORM:
        case VK_FORMAT_R8G8B8A8_SRGB:
            return {DRM_FORMAT_ABGR8888, DRM_FORMAT_XBGR8888};
        case VK_FORMAT_B8G8R8A8_UNORM:
        case VK_FORMAT_B8G8R8A8_SRGB:
            return {DRM_FORMAT_ARGB8888, DRM_FORMAT_XRGB8888};
        case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
            return {DRM_FORMAT_ARGB2101010};
        case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
            return {DRM_FORMAT_ABGR2101010};
        case VK_FORMAT_B5G6R5_UNORM_PACK16:
            return {DRM_FORMAT_RGB565};
        default:
            return {};
    }
}

std::vector<VkFormat> DrmFourCCFormatToVkFormats(int fourccFormat)
{
    switch (fourccFormat)
    {
        case DRM_FORMAT_R8:
            return {VK_FORMAT_R8_UNORM, VK_FORMAT_R8_SRGB};
        case DRM_FORMAT_R16:
            return {VK_FORMAT_R16_UNORM};
        case DRM_FORMAT_GR88:
            return {VK_FORMAT_R8G8_UNORM, VK_FORMAT_R8G8_SRGB};
        case DRM_FORMAT_BGR888:
            return {VK_FORMAT_R8G8B8_UNORM, VK_FORMAT_R8G8B8_SRGB};
        case DRM_FORMAT_RGB888:
            return {VK_FORMAT_B8G8R8_UNORM, VK_FORMAT_B8G8R8_SRGB};
        case DRM_FORMAT_ABGR8888:
        case DRM_FORMAT_XBGR8888:
            return {VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_R8G8B8A8_SRGB};
        case DRM_FORMAT_ARGB8888:
        case DRM_FORMAT_XRGB8888:
            return {VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_B8G8R8A8_SRGB};
        case DRM_FORMAT_ABGR2101010:
            return {VK_FORMAT_A2R10G10B10_UNORM_PACK32};
        case DRM_FORMAT_ARGB2101010:
            return {VK_FORMAT_A2B10G10R10_UNORM_PACK32};
        case DRM_FORMAT_RGB565:
            return {VK_FORMAT_B5G6R5_UNORM_PACK16};
        case DRM_FORMAT_NV12:
            return {VK_FORMAT_G8_B8R8_2PLANE_420_UNORM};
        default:
            WARN() << "Unknown dma_buf format " << fourccFormat
                   << " used to initialize an EGL image.";
            return {};
    }
}

#endif  // ANGLE_ENABLE_VULKAN

}  // namespace angle
