Hash :
98b0855b
Author :
Date :
2023-09-08T10:50:58
Add drm format ABGR16161616F to linux We need to support drm 16f formats for lacros HDR. Bug: chromium:1473267 Change-Id: Idd3cb5e75e1fabf046c8aa21a6b7f51aafde15e7 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4851773 Reviewed-by: Peng Huang <penghuang@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Peng Huang <penghuang@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
//
// 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;
}
}
#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
#if defined(ANGLE_PLATFORM_LINUX) && defined(ANGLE_USES_GBM)
# include <gbm.h>
int GLInternalFormatToGbmFourCCFormat(GLenum internalFormat)
{
switch (internalFormat)
{
case GL_R8:
return GBM_FORMAT_R8;
case GL_RGB8:
return GBM_FORMAT_GR88;
case GL_RGB565:
return GBM_FORMAT_RGB565;
case GL_RGBA8:
return GBM_FORMAT_ABGR8888;
case GL_BGRA8_EXT:
return GBM_FORMAT_ARGB8888;
case GL_BGRX8_ANGLEX:
return GBM_FORMAT_XRGB8888;
case GL_RGBX8_ANGLE:
return GBM_FORMAT_XBGR8888;
case GL_RGB10_A2:
return GBM_FORMAT_ABGR2101010;
default:
WARN() << "Unknown internalFormat: " << internalFormat << ". Treating as 0";
return 0;
}
}
#endif
} // namespace angle