kwin/src/utils/drm_format_helper.cpp

127 lines
3.5 KiB
C++
Raw Normal View History

/*
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2023 Xaver Hugl <xaver.hugl@gmail.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "drm_format_helper.h"
namespace KWin
{
std::optional<FormatInfo> FormatInfo::get(uint32_t drmFormat)
{
switch (drmFormat) {
case DRM_FORMAT_XRGB8888:
case DRM_FORMAT_XBGR8888:
case DRM_FORMAT_RGBX8888:
case DRM_FORMAT_BGRX8888:
return FormatInfo{
.drmFormat = drmFormat,
.bitsPerColor = 8,
.alphaBits = 0,
.bitsPerPixel = 32,
.openglFormat = GL_RGBA8,
};
case DRM_FORMAT_ARGB8888:
case DRM_FORMAT_ABGR8888:
case DRM_FORMAT_RGBA8888:
case DRM_FORMAT_BGRA8888:
return FormatInfo{
.drmFormat = drmFormat,
.bitsPerColor = 8,
.alphaBits = 8,
.bitsPerPixel = 32,
.openglFormat = GL_RGBA8,
};
case DRM_FORMAT_XRGB2101010:
case DRM_FORMAT_XBGR2101010:
case DRM_FORMAT_RGBX1010102:
case DRM_FORMAT_BGRX1010102:
return FormatInfo{
.drmFormat = drmFormat,
.bitsPerColor = 10,
.alphaBits = 0,
.bitsPerPixel = 32,
.openglFormat = GL_RGB10_A2,
};
case DRM_FORMAT_ARGB2101010:
case DRM_FORMAT_ABGR2101010:
case DRM_FORMAT_RGBA1010102:
case DRM_FORMAT_BGRA1010102:
return FormatInfo{
.drmFormat = drmFormat,
.bitsPerColor = 10,
.alphaBits = 2,
.bitsPerPixel = 32,
.openglFormat = GL_RGB10_A2,
};
case DRM_FORMAT_XRGB16161616F:
case DRM_FORMAT_XBGR16161616F:
return FormatInfo{
.drmFormat = drmFormat,
.bitsPerColor = 16,
.alphaBits = 0,
.bitsPerPixel = 64,
.openglFormat = GL_RGBA16F,
};
case DRM_FORMAT_ARGB16161616F:
case DRM_FORMAT_ABGR16161616F:
return FormatInfo{
.drmFormat = drmFormat,
.bitsPerColor = 16,
.alphaBits = 16,
.bitsPerPixel = 64,
.openglFormat = GL_RGBA16F,
};
case DRM_FORMAT_ARGB4444:
case DRM_FORMAT_ABGR4444:
case DRM_FORMAT_RGBA4444:
case DRM_FORMAT_BGRA4444:
return FormatInfo{
.drmFormat = drmFormat,
.bitsPerColor = 4,
.alphaBits = 4,
.bitsPerPixel = 16,
.openglFormat = GL_RGBA4,
};
case DRM_FORMAT_ARGB1555:
case DRM_FORMAT_ABGR1555:
case DRM_FORMAT_RGBA5551:
case DRM_FORMAT_BGRA5551:
return FormatInfo{
.drmFormat = drmFormat,
.bitsPerColor = 5,
.alphaBits = 1,
.bitsPerPixel = 16,
.openglFormat = GL_RGB5_A1,
};
case DRM_FORMAT_NV12:
return FormatInfo{
.drmFormat = drmFormat,
.bitsPerColor = 8,
.alphaBits = 0,
.bitsPerPixel = 24,
.openglFormat = GL_R8,
};
default:
return std::nullopt;
}
}
QString FormatInfo::drmFormatName(const QString &prefix, uint32_t format)
{
return QString::asprintf(
"%s%c%c%c%c %s-endian (0x%08x)", prefix.toUtf8().constData(),
QLatin1Char(format & 0xff).toLatin1(),
QLatin1Char((format >> 8) & 0xff).toLatin1(),
QLatin1Char((format >> 16) & 0xff).toLatin1(),
QLatin1Char((format >> 24) & 0x7f).toLatin1(),
format & DRM_FORMAT_BIG_ENDIAN ? "big" : "little",
format);
}
}