- ret = drmIoctl(bo->gbm->fd, DRM_IOCTL_EXYNOS_GEM_CREATE, &gem_create);
- if (ret) {
- fprintf(stderr, "minigbm: DRM_IOCTL_EXYNOS_GEM_CREATE failed "
- "(size=%zu)\n", size);
- return ret;
+ if (format == DRM_FORMAT_NV12) {
+ uint32_t chroma_height;
+ /* V4L2 s5p-mfc requires width to be 16 byte aligned and height 32. */
+ width = ALIGN(width, 16);
+ height = ALIGN(height, 32);
+ chroma_height = ALIGN(height / 2, 32);
+ bo->meta.strides[0] = bo->meta.strides[1] = width;
+ /* MFC v8+ requires 64 byte padding in the end of luma and chroma buffers. */
+ bo->meta.sizes[0] = bo->meta.strides[0] * height + 64;
+ bo->meta.sizes[1] = bo->meta.strides[1] * chroma_height + 64;
+ bo->meta.offsets[0] = bo->meta.offsets[1] = 0;
+ bo->meta.total_size = bo->meta.sizes[0] + bo->meta.sizes[1];
+ } else if (format == DRM_FORMAT_XRGB8888 || format == DRM_FORMAT_ARGB8888) {
+ bo->meta.strides[0] = drv_stride_from_format(format, width, 0);
+ bo->meta.total_size = bo->meta.sizes[0] = height * bo->meta.strides[0];
+ bo->meta.offsets[0] = 0;
+ } else {
+ drv_log("unsupported format %X\n", format);
+ assert(0);
+ return -EINVAL;