Hash :
d917f771
Author :
Date :
2025-09-01T18:44:34
Vulkan: Simplify/Fix DmaBufImageSiblingVkLinux import probing Remove the multi-format probing logic in DmaBufImageSiblingVkLinux. Use the renderer’s base VkFormat and a single check with VkImageFormatListCreateInfo, instead of looping over mVkFormats with mutable/non-mutable combinations. This cuts down redundant queries and streamlines initImpl. Also, this CL fixes some issues occur when mapping DRM format into Vulkan backend formats. - Default to SampleOnly but prefer Renderable if the modifier properties exposes both sampling and rendering, since usage at import time is unknown. - Fix emulated-format handling issue by using getIntendedFormatID() and getActualImageFormatID() instead of deriving both IDs from VkFormat with GetFormatIDFromVkFormat() directly. Bug: angleproject:442313595 Bug: angleproject:426475684 Change-Id: Ia38d8e7901da10948a2c15eb284b055359dd4a2d Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6904888 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: mohan maiya <m.maiya@samsung.com>
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;
}
}
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 {};
}
}
// Maps a DRM FourCC formats to a view-compatible set of VkFormats.
// Returns only the base format's linear/sRGB pair when both exist.
// Callers expect these formats to be mutually compatible and pass the list
// to VkImageFormatListCreateInfo for image creation.
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