Reland "minigbm: introduce test allocation"

This reverts commit 08d8dbf094fdc5aa9b92c7257e292edcf28602b2.

The original change returned early from drv_bo_create_with_modifiers,
which broke reference counting. This must have hit some race condition
in the tests, as they no longer flake after fixing reference counting.

Original change's description:
> Revert "minigbm: introduce test allocation"
>
> This reverts commit f0e607c7d436134b53fd45a4ead36d714451be8a.
>
> Reason for revert: caused flaky regressions across the board.
>
> BUG=b:150997559
> Exempt-From-Owner-Approval: revert.
>
> Original change's description:
> > minigbm: introduce test allocation
> >
> > This change introduces a GBM_TEST_ALLOC flag to minigbm, which allows
> > for the creation of fake buffers that can be used to determine buffer
> > metadata without actually allocating a full buffer. The new flag is
> > supported by the i915 backends. This flag also alleviates the need to
> > cache buffers when virtio_gpu queries metadata properties.
> >
> > BUG=b:145994510
> > TEST=play youtube with arcvm demo image plus this and virgl change
> >
> > Change-Id: I9c6819aa3b5b674e4bb33b0656f2a9f155b0884e
> > Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/1980688
> > Tested-by: David Stevens <stevensd@chromium.org>
> > Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
> > Commit-Queue: David Stevens <stevensd@chromium.org>
>
> Bug: b:145994510
> Change-Id: I50079b7f0aabf38e1f373cac0f28c0e057eed760
> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/2093923
> Commit-Queue: Ilja H. Friedel <ihf@chromium.org>
> Tested-by: Ilja H. Friedel <ihf@chromium.org>
> Reviewed-by: Ilja H. Friedel <ihf@chromium.org>

Bug: b:150997559, b:145994510
Change-Id: If0f02a4701bb6960b6413d6b0c00b481146914d9
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/2094068
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Commit-Queue: David Stevens <stevensd@chromium.org>
Tested-by: David Stevens <stevensd@chromium.org>
diff --git a/i915.c b/i915.c
index d0c9db1..05c8272 100644
--- a/i915.c
+++ b/i915.c
@@ -268,13 +268,26 @@
 	return 0;
 }
 
-static int i915_bo_create_for_modifier(struct bo *bo, uint32_t width, uint32_t height,
-				       uint32_t format, uint64_t modifier)
+static int i915_bo_compute_metadata(struct bo *bo, uint32_t width, uint32_t height, uint32_t format,
+				    uint64_t use_flags, const uint64_t *modifiers, uint32_t count)
 {
-	int ret;
-	size_t plane;
-	struct drm_i915_gem_create gem_create;
-	struct drm_i915_gem_set_tiling gem_set_tiling;
+	static const uint64_t modifier_order[] = {
+		I915_FORMAT_MOD_Y_TILED_CCS,
+		I915_FORMAT_MOD_Y_TILED,
+		I915_FORMAT_MOD_X_TILED,
+		DRM_FORMAT_MOD_LINEAR,
+	};
+	uint64_t modifier;
+
+	if (modifiers) {
+		modifier =
+		    drv_pick_modifier(modifiers, count, modifier_order, ARRAY_SIZE(modifier_order));
+	} else {
+		struct combination *combo = drv_get_combination(bo->drv, format, use_flags);
+		if (!combo)
+			return -EINVAL;
+		modifier = combo->metadata.modifier;
+	}
 
 	switch (modifier) {
 	case DRM_FORMAT_MOD_LINEAR:
@@ -346,6 +359,15 @@
 	} else {
 		i915_bo_from_format(bo, width, height, format);
 	}
+	return 0;
+}
+
+static int i915_bo_create_from_metadata(struct bo *bo)
+{
+	int ret;
+	size_t plane;
+	struct drm_i915_gem_create gem_create;
+	struct drm_i915_gem_set_tiling gem_set_tiling;
 
 	memset(&gem_create, 0, sizeof(gem_create));
 	gem_create.size = bo->meta.total_size;
@@ -378,34 +400,6 @@
 	return 0;
 }
 
-static int i915_bo_create(struct bo *bo, uint32_t width, uint32_t height, uint32_t format,
-			  uint64_t use_flags)
-{
-	struct combination *combo;
-
-	combo = drv_get_combination(bo->drv, format, use_flags);
-	if (!combo)
-		return -EINVAL;
-
-	return i915_bo_create_for_modifier(bo, width, height, format, combo->metadata.modifier);
-}
-
-static int i915_bo_create_with_modifiers(struct bo *bo, uint32_t width, uint32_t height,
-					 uint32_t format, const uint64_t *modifiers, uint32_t count)
-{
-	static const uint64_t modifier_order[] = {
-		I915_FORMAT_MOD_Y_TILED_CCS,
-		I915_FORMAT_MOD_Y_TILED,
-		I915_FORMAT_MOD_X_TILED,
-		DRM_FORMAT_MOD_LINEAR,
-	};
-	uint64_t modifier;
-
-	modifier = drv_pick_modifier(modifiers, count, modifier_order, ARRAY_SIZE(modifier_order));
-
-	return i915_bo_create_for_modifier(bo, width, height, format, modifier);
-}
-
 static void i915_close(struct driver *drv)
 {
 	free(drv->priv);
@@ -561,8 +555,8 @@
 	.name = "i915",
 	.init = i915_init,
 	.close = i915_close,
-	.bo_create = i915_bo_create,
-	.bo_create_with_modifiers = i915_bo_create_with_modifiers,
+	.bo_compute_metadata = i915_bo_compute_metadata,
+	.bo_create_from_metadata = i915_bo_create_from_metadata,
 	.bo_destroy = drv_gem_bo_destroy,
 	.bo_import = i915_bo_import,
 	.bo_map = i915_bo_map,