-#include "gbm_priv.h"
-
-int gbm_bpp_from_format(uint32_t format)
-{
- if (format == GBM_BO_FORMAT_XRGB8888)
- format = GBM_FORMAT_XRGB8888;
- if (format == GBM_BO_FORMAT_ARGB8888)
- format = GBM_FORMAT_ARGB8888;
-
- switch(format)
- {
- case GBM_FORMAT_C8:
- case GBM_FORMAT_RGB332:
- case GBM_FORMAT_BGR233:
- return 8;
-
- case GBM_FORMAT_XRGB4444:
- case GBM_FORMAT_XBGR4444:
- case GBM_FORMAT_RGBX4444:
- case GBM_FORMAT_BGRX4444:
- case GBM_FORMAT_ARGB4444:
- case GBM_FORMAT_ABGR4444:
- case GBM_FORMAT_RGBA4444:
- case GBM_FORMAT_BGRA4444:
- case GBM_FORMAT_XRGB1555:
- case GBM_FORMAT_XBGR1555:
- case GBM_FORMAT_RGBX5551:
- case GBM_FORMAT_BGRX5551:
- case GBM_FORMAT_ARGB1555:
- case GBM_FORMAT_ABGR1555:
- case GBM_FORMAT_RGBA5551:
- case GBM_FORMAT_BGRA5551:
- case GBM_FORMAT_RGB565:
- case GBM_FORMAT_BGR565:
- return 16;
-
- case GBM_FORMAT_RGB888:
- case GBM_FORMAT_BGR888:
- return 24;
-
- case GBM_FORMAT_XRGB8888:
- case GBM_FORMAT_XBGR8888:
- case GBM_FORMAT_RGBX8888:
- case GBM_FORMAT_BGRX8888:
- case GBM_FORMAT_ARGB8888:
- case GBM_FORMAT_ABGR8888:
- case GBM_FORMAT_RGBA8888:
- case GBM_FORMAT_BGRA8888:
- case GBM_FORMAT_XRGB2101010:
- case GBM_FORMAT_XBGR2101010:
- case GBM_FORMAT_RGBX1010102:
- case GBM_FORMAT_BGRX1010102:
- case GBM_FORMAT_ARGB2101010:
- case GBM_FORMAT_ABGR2101010:
- case GBM_FORMAT_RGBA1010102:
- case GBM_FORMAT_BGRA1010102:
- case GBM_FORMAT_YUYV:
- case GBM_FORMAT_YVYU:
- case GBM_FORMAT_UYVY:
- case GBM_FORMAT_VYUY:
- case GBM_FORMAT_AYUV:
- return 32;
+#include "drv_priv.h"
+#include "helpers.h"
+#include "util.h"
+
+struct planar_layout {
+ size_t num_planes;
+ int horizontal_subsampling[DRV_MAX_PLANES];
+ int vertical_subsampling[DRV_MAX_PLANES];
+ int bytes_per_pixel[DRV_MAX_PLANES];
+};
+
+// clang-format off
+
+static const struct planar_layout packed_1bpp_layout = {
+ .num_planes = 1,
+ .horizontal_subsampling = { 1 },
+ .vertical_subsampling = { 1 },
+ .bytes_per_pixel = { 1 }
+};
+
+static const struct planar_layout packed_2bpp_layout = {
+ .num_planes = 1,
+ .horizontal_subsampling = { 1 },
+ .vertical_subsampling = { 1 },
+ .bytes_per_pixel = { 2 }
+};
+
+static const struct planar_layout packed_3bpp_layout = {
+ .num_planes = 1,
+ .horizontal_subsampling = { 1 },
+ .vertical_subsampling = { 1 },
+ .bytes_per_pixel = { 3 }
+};
+
+static const struct planar_layout packed_4bpp_layout = {
+ .num_planes = 1,
+ .horizontal_subsampling = { 1 },
+ .vertical_subsampling = { 1 },
+ .bytes_per_pixel = { 4 }
+};
+
+static const struct planar_layout packed_8bpp_layout = {
+ .num_planes = 1,
+ .horizontal_subsampling = { 1 },
+ .vertical_subsampling = { 1 },
+ .bytes_per_pixel = { 8 }
+};
+
+static const struct planar_layout biplanar_yuv_420_layout = {
+ .num_planes = 2,
+ .horizontal_subsampling = { 1, 2 },
+ .vertical_subsampling = { 1, 2 },
+ .bytes_per_pixel = { 1, 2 }
+};
+
+static const struct planar_layout triplanar_yuv_420_layout = {
+ .num_planes = 3,
+ .horizontal_subsampling = { 1, 2, 2 },
+ .vertical_subsampling = { 1, 2, 2 },
+ .bytes_per_pixel = { 1, 1, 1 }
+};
+
+static const struct planar_layout biplanar_yuv_p010_layout = {
+ .num_planes = 2,
+ .horizontal_subsampling = { 1, 2 },
+ .vertical_subsampling = { 1, 2 },
+ .bytes_per_pixel = { 2, 4 }
+};
+
+// clang-format on
+
+static const struct planar_layout *layout_from_format(uint32_t format)
+{
+ switch (format) {
+ case DRM_FORMAT_BGR233:
+ case DRM_FORMAT_C8:
+ case DRM_FORMAT_R8:
+ case DRM_FORMAT_RGB332:
+ return &packed_1bpp_layout;
+
+ case DRM_FORMAT_R16:
+ return &packed_2bpp_layout;
+
+ case DRM_FORMAT_YVU420:
+ case DRM_FORMAT_YVU420_ANDROID:
+ return &triplanar_yuv_420_layout;
+
+ case DRM_FORMAT_NV12:
+ case DRM_FORMAT_NV21:
+ return &biplanar_yuv_420_layout;
+
+ case DRM_FORMAT_P010:
+ return &biplanar_yuv_p010_layout;
+
+ case DRM_FORMAT_ABGR1555:
+ case DRM_FORMAT_ABGR4444:
+ case DRM_FORMAT_ARGB1555:
+ case DRM_FORMAT_ARGB4444:
+ case DRM_FORMAT_BGR565:
+ case DRM_FORMAT_BGRA4444:
+ case DRM_FORMAT_BGRA5551:
+ case DRM_FORMAT_BGRX4444:
+ case DRM_FORMAT_BGRX5551:
+ case DRM_FORMAT_GR88:
+ case DRM_FORMAT_RG88:
+ case DRM_FORMAT_RGB565:
+ case DRM_FORMAT_RGBA4444:
+ case DRM_FORMAT_RGBA5551:
+ case DRM_FORMAT_RGBX4444:
+ case DRM_FORMAT_RGBX5551:
+ case DRM_FORMAT_UYVY:
+ case DRM_FORMAT_VYUY:
+ case DRM_FORMAT_XBGR1555:
+ case DRM_FORMAT_XBGR4444:
+ case DRM_FORMAT_XRGB1555:
+ case DRM_FORMAT_XRGB4444:
+ case DRM_FORMAT_YUYV:
+ case DRM_FORMAT_YVYU:
+ case DRM_FORMAT_MTISP_SXYZW10:
+ return &packed_2bpp_layout;
+
+ case DRM_FORMAT_BGR888:
+ case DRM_FORMAT_RGB888:
+ return &packed_3bpp_layout;
+
+ case DRM_FORMAT_ABGR2101010:
+ case DRM_FORMAT_ABGR8888:
+ case DRM_FORMAT_ARGB2101010:
+ case DRM_FORMAT_ARGB8888:
+ case DRM_FORMAT_AYUV:
+ case DRM_FORMAT_BGRA1010102:
+ case DRM_FORMAT_BGRA8888:
+ case DRM_FORMAT_BGRX1010102:
+ case DRM_FORMAT_BGRX8888:
+ case DRM_FORMAT_RGBA1010102:
+ case DRM_FORMAT_RGBA8888:
+ case DRM_FORMAT_RGBX1010102:
+ case DRM_FORMAT_RGBX8888:
+ case DRM_FORMAT_XBGR2101010:
+ case DRM_FORMAT_XBGR8888:
+ case DRM_FORMAT_XRGB2101010:
+ case DRM_FORMAT_XRGB8888:
+ return &packed_4bpp_layout;
+
+ case DRM_FORMAT_ABGR16161616F:
+ return &packed_8bpp_layout;
+
+ default:
+ drv_log("UNKNOWN FORMAT %d\n", format);
+ return NULL;