Reland "minigbm: define GBM_BO_IMPORT_FD_MODIFIER"

It seems like the problem was that the
GBM_BO_IMPORT_FD_PLANAR was redifened to 0x5505
from 0x5504. And GBM_BO_IMPORT_FD_MODIFIER
was added as 0x5504, which lead to crashes.

In order to minimize risks, do it other way round -
leave GBM_BO_IMPORT_FD_PLANAR as 0x5504 and
add GBM_BO_IMPORT_FD_MODIFIER as 0x5505.

Once all the call sites are changed to use
GBM_BO_IMPORT_FD_MODIFIER, remove GBM_BO_IMPORT_FD_PLANAR
and make GBM_BO_IMPORT_FD_MODIFIER to be 0x5505.

Original change's description:
> minigbm: define GBM_BO_IMPORT_FD_MODIFIER
>
> This CL aligns the minigbm more with the upstream GBM
> by defining GBM_BO_IMPORT_FD_MODIFIER and using
> gbm_import_fd_modifier_data instead.
>
> That is, the main difference between the old
> gbm_import_fd_planar_data one and the new one is
> the format_modifiers variable. In the upstream
> GBM, it's a single variable. In the minigbm, it is
> an array.
>
> As we know there are no cases when modifiers would
> be different for each plane. Thus, it's safe to eliminate
> that and adapt more to the upstream.
>
> Change-Id: Iaae062ef1fe9fc9ab0ead09c5f4bfa91d2db67c3
> Reviewed-on: https://chromium-review.googlesource.com/1360771
> Commit-Ready: Maksim Sisov <msisov@igalia.com>
> Tested-by: Maksim Sisov <msisov@igalia.com>
> Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>

Change-Id: I1617de54914734c903cb05e1694cc782a7bb171a
Reviewed-on: https://chromium-review.googlesource.com/1454658
Commit-Ready: Maksim Sisov <msisov@igalia.com>
Tested-by: Maksim Sisov <msisov@igalia.com>
Tested-by: Gurchetan Singh <gurchetansingh@chromium.org>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
diff --git a/gbm.c b/gbm.c
index dd6013c..4e41daa 100644
--- a/gbm.c
+++ b/gbm.c
@@ -167,8 +167,9 @@
 	struct drv_import_fd_data drv_data;
 	struct gbm_import_fd_data *fd_data = buffer;
 	struct gbm_import_fd_planar_data *fd_planar_data = buffer;
+	struct gbm_import_fd_modifier_data *fd_modifier_data = buffer;
 	uint32_t gbm_format;
-	size_t num_planes, i;
+	size_t num_planes, i, num_fds;
 
 	memset(&drv_data, 0, sizeof(drv_data));
 	drv_data.use_flags = gbm_convert_usage(usage);
@@ -181,6 +182,29 @@
 		drv_data.fds[0] = fd_data->fd;
 		drv_data.strides[0] = fd_data->stride;
 		break;
+	case GBM_BO_IMPORT_FD_MODIFIER:
+		gbm_format = fd_modifier_data->format;
+		drv_data.width = fd_modifier_data->width;
+		drv_data.height = fd_modifier_data->height;
+		drv_data.format = fd_modifier_data->format;
+		num_planes = drv_num_planes_from_format(drv_data.format);
+		num_fds = fd_modifier_data->num_fds;
+
+		assert(num_fds > 0 && num_fds <= num_planes);
+		for (i = 0; i < num_planes; i++) {
+			if (num_fds != num_planes)
+				drv_data.fds[i] = fd_modifier_data->fds[0];
+			else
+				drv_data.fds[i] = fd_modifier_data->fds[i];
+			drv_data.offsets[i] = fd_modifier_data->offsets[i];
+			drv_data.strides[i] = fd_modifier_data->strides[i];
+			drv_data.format_modifiers[i] = fd_modifier_data->modifier;
+		}
+
+		for (i = num_planes; i < GBM_MAX_PLANES; i++)
+			drv_data.fds[i] = -1;
+
+		break;
 	case GBM_BO_IMPORT_FD_PLANAR:
 		gbm_format = fd_planar_data->format;
 		drv_data.width = fd_planar_data->width;
diff --git a/gbm.h b/gbm.h
index 68a34c5..6150530 100644
--- a/gbm.h
+++ b/gbm.h
@@ -305,7 +305,9 @@
 #define GBM_BO_IMPORT_WL_BUFFER         0x5501
 #define GBM_BO_IMPORT_EGL_IMAGE         0x5502
 #define GBM_BO_IMPORT_FD                0x5503
+// Deprecated. Use GBM_BO_IMPORT_FD_MODIFIER instead.
 #define GBM_BO_IMPORT_FD_PLANAR         0x5504
+#define GBM_BO_IMPORT_FD_MODIFIER       0x5505
 
 struct gbm_import_fd_data {
    int fd;
@@ -315,6 +317,18 @@
    uint32_t format;
 };
 
+struct gbm_import_fd_modifier_data {
+   uint32_t width;
+   uint32_t height;
+   uint32_t format;
+   uint32_t num_fds;
+   int fds[GBM_MAX_PLANES];
+   int strides[GBM_MAX_PLANES];
+   int offsets[GBM_MAX_PLANES];
+   uint64_t modifier;
+};
+
+// Deprecated. Use gbm_import_fd_modifier_data instead.
 struct gbm_import_fd_planar_data {
    int fds[GBM_MAX_PLANES];
    uint32_t width;