modetest: util: Add support for P01[026] and S01[026] formats

Adds support for buffer allocation in the P010, P012, and P016
2-plane YUV420 10, 12, and 16 bit formats, and the S010, S012, and
S016 3-plane YUV420 formats of the same bit depths.

As all the pattern generation uses 8bit values, store a shift
value for each format to denote how the 8 bit value needs to
be altered to store in a 16bit word.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
This commit is contained in:
Dave Stevenson 2025-07-14 15:56:11 +01:00
parent dd49ca7602
commit aab9e6ae73
3 changed files with 28 additions and 1 deletions

View file

@ -186,6 +186,12 @@ bo_create(int fd, unsigned int format,
case DRM_FORMAT_VYUY:
case DRM_FORMAT_YUYV:
case DRM_FORMAT_YVYU:
case DRM_FORMAT_P010:
case DRM_FORMAT_P012:
case DRM_FORMAT_P016:
case DRM_FORMAT_S010:
case DRM_FORMAT_S012:
case DRM_FORMAT_S016:
bpp = 16;
break;
@ -231,6 +237,9 @@ bo_create(int fd, unsigned int format,
case DRM_FORMAT_NV15:
case DRM_FORMAT_YUV420:
case DRM_FORMAT_YVU420:
case DRM_FORMAT_S010:
case DRM_FORMAT_S012:
case DRM_FORMAT_S016:
is_planar = true;
xsub = 2;
ysub = 2;
@ -241,6 +250,9 @@ bo_create(int fd, unsigned int format,
case DRM_FORMAT_NV20:
case DRM_FORMAT_YUV422:
case DRM_FORMAT_YVU422:
case DRM_FORMAT_P010:
case DRM_FORMAT_P012:
case DRM_FORMAT_P016:
is_planar = true;
xsub = 2;
ysub = 1;
@ -303,6 +315,9 @@ bo_create(int fd, unsigned int format,
case DRM_FORMAT_NV42:
case DRM_FORMAT_NV20:
case DRM_FORMAT_NV30:
case DRM_FORMAT_P010:
case DRM_FORMAT_P012:
case DRM_FORMAT_P016:
offsets[0] = 0;
handles[0] = bo->handle;
pitches[0] = bo->pitch;
@ -320,6 +335,9 @@ bo_create(int fd, unsigned int format,
case DRM_FORMAT_YVU422:
case DRM_FORMAT_YUV444:
case DRM_FORMAT_YVU444:
case DRM_FORMAT_S010:
case DRM_FORMAT_S012:
case DRM_FORMAT_S016:
offsets[0] = 0;
handles[0] = bo->handle;
pitches[0] = bo->pitch;

View file

@ -36,7 +36,9 @@
.rgb = { { (rl), (ro) }, { (gl), (go) }, { (bl), (bo) }, { (al), (ao) } }
#define MAKE_YUV_INFO(order, xsub, ysub, chroma_stride) \
.yuv = { (order), (xsub), (ysub), (chroma_stride) }
.yuv = { (order), (xsub), (ysub), (chroma_stride), 0 }
#define MAKE_YUV_INFO_SHIFT(order, xsub, ysub, chroma_stride, shift) \
.yuv = { (order), (xsub), (ysub), (chroma_stride), (shift) }
static const struct util_format_info format_info[] = {
/* Indexed */
@ -59,6 +61,9 @@ static const struct util_format_info format_info[] = {
{ DRM_FORMAT_NV15, "NV15", MAKE_YUV_INFO(YUV_YCbCr, 2, 2, 2) },
{ DRM_FORMAT_NV20, "NV20", MAKE_YUV_INFO(YUV_YCbCr, 2, 1, 2) },
{ DRM_FORMAT_NV30, "NV30", MAKE_YUV_INFO(YUV_YCbCr, 1, 1, 2) },
{ DRM_FORMAT_P010, "P010", MAKE_YUV_INFO_SHIFT(YUV_YCbCr, 2, 2, 2, 8) },
{ DRM_FORMAT_P012, "P012", MAKE_YUV_INFO_SHIFT(YUV_YCbCr, 2, 2, 2, 8) },
{ DRM_FORMAT_P016, "P016", MAKE_YUV_INFO_SHIFT(YUV_YCbCr, 2, 2, 2, 8) },
/* YUV planar */
{ DRM_FORMAT_YUV420, "YU12", MAKE_YUV_INFO(YUV_YCbCr, 2, 2, 1) },
{ DRM_FORMAT_YVU420, "YV12", MAKE_YUV_INFO(YUV_YCrCb, 2, 2, 1) },
@ -66,6 +71,9 @@ static const struct util_format_info format_info[] = {
{ DRM_FORMAT_YVU422, "YV16", MAKE_YUV_INFO(YUV_YCrCb, 2, 1, 1) },
{ DRM_FORMAT_YUV444, "YU24", MAKE_YUV_INFO(YUV_YCbCr, 1, 1, 1) },
{ DRM_FORMAT_YVU444, "YV24", MAKE_YUV_INFO(YUV_YCrCb, 1, 1, 1) },
{ DRM_FORMAT_S010, "S010", MAKE_YUV_INFO_SHIFT(YUV_YCbCr, 2, 2, 1, 2) },
{ DRM_FORMAT_S012, "S012", MAKE_YUV_INFO_SHIFT(YUV_YCbCr, 2, 2, 1, 4) },
{ DRM_FORMAT_S016, "S016", MAKE_YUV_INFO_SHIFT(YUV_YCbCr, 2, 2, 1, 8) },
/* RGB8 */
{ DRM_FORMAT_RGB332, "RGB8", MAKE_RGB_INFO(3, 5, 3, 2, 2, 0, 0, 0) },
{ DRM_FORMAT_BGR233, "BGR8", MAKE_RGB_INFO(3, 0, 3, 3, 2, 6, 0, 0) },

View file

@ -50,6 +50,7 @@ struct util_yuv_info {
unsigned int xsub;
unsigned int ysub;
unsigned int chroma_stride;
unsigned int shift;
};
struct util_format_info {