Hash :
616a341b
Author :
Date :
2025-08-26T13:56:40
Vulkan: Set EGL_NATIVE_VISUAL_ID for EGL_KHR_platform_gbm Spec requires EGLConfig on GBM platform to report a GBM color format in EGL_NATIVE_VISUAL_ID. Previously this field was left unset. This change ensures compliance by assigning the appropriate GBM color format. Bug: angleproject:7829 Change-Id: I6c5a23374824c444e0de0b6592ea31eb855722e4 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6882716 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Geoff Lang <geofflang@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
//
// 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