OSDN Git Service

minigbm: add vgem backend
authorGurchetan Singh <gurchetansingh@chromium.org>
Fri, 30 Sep 2016 21:53:32 +0000 (14:53 -0700)
committerchrome-bot <chrome-bot@chromium.org>
Tue, 18 Oct 2016 20:40:15 +0000 (13:40 -0700)
When running x86 ARC++ images on a virtual machine, we use
the vgem driver.  We should support it here too.

BUG=chromium:616275
TEST=container boots when running QEMU with cros_gralloc.  Note
videos (i.e, YUV formats) don't work on QEMU, but they never did
with gralloc_drm either.

CQ-DEPEND=CL:392548

Change-Id: If9f6b8035f2a88068980bede5121ef4599b37272
Reviewed-on: https://chromium-review.googlesource.com/392549
Commit-Ready: Gurchetan Singh <gurchetansingh@chromium.org>
Tested-by: Gurchetan Singh <gurchetansingh@chromium.org>
Reviewed-by: Stéphane Marchesin <marcheu@chromium.org>
cros_gralloc/cros_gralloc_helpers.cc
drv.c
vgem.c [new file with mode: 0644]

index 51e09bf..a6fd3ea 100644 (file)
@@ -85,11 +85,13 @@ drv_format_t cros_gralloc_convert_format(int format)
        return DRV_FORMAT_NONE;
 }
 
-int32_t cros_gralloc_rendernode_open(struct driver **drv)
+static int32_t cros_gralloc_query_rendernode(struct driver **drv,
+                                            const char *name)
 {
        /* TODO(gsingh): Enable render nodes on udl/evdi. */
        int fd;
-       char const *name = "%s/renderD%d";
+       drmVersionPtr version;
+       char const *str = "%s/renderD%d";
        int32_t num_nodes = 63;
        int32_t min_node = 128;
        int32_t max_node = (min_node + num_nodes);
@@ -97,7 +99,7 @@ int32_t cros_gralloc_rendernode_open(struct driver **drv)
        for (int i = min_node; i < max_node; i++) {
                char *node;
 
-               if (asprintf(&node, name, DRM_DIR_NAME, i) < 0)
+               if (asprintf(&node, str, DRM_DIR_NAME, i) < 0)
                        continue;
 
                fd = open(node, O_RDWR, 0);
@@ -106,6 +108,14 @@ int32_t cros_gralloc_rendernode_open(struct driver **drv)
                if (fd < 0)
                        continue;
 
+               version = drmGetVersion(fd);
+
+               if (version && name && !strcmp(version->name, name)) {
+                       drmFreeVersion(version);
+                       continue;
+               }
+
+               drmFreeVersion(version);
                *drv = drv_create(fd);
 
                if (*drv)
@@ -115,6 +125,18 @@ int32_t cros_gralloc_rendernode_open(struct driver **drv)
        return CROS_GRALLOC_ERROR_NO_RESOURCES;
 }
 
+int32_t cros_gralloc_rendernode_open(struct driver **drv)
+{
+       int32_t ret;
+       ret = cros_gralloc_query_rendernode(drv, NULL);
+
+       /* Look for vgem driver if no hardware is found. */
+       if (ret)
+               ret = cros_gralloc_query_rendernode(drv, "vgem");
+
+       return ret;
+}
+
 int32_t cros_gralloc_validate_handle(struct cros_gralloc_handle *hnd)
 {
        if (!hnd || hnd->magic != cros_gralloc_magic())
diff --git a/drv.c b/drv.c
index 168c38a..e2eb7a1 100644 (file)
--- a/drv.c
+++ b/drv.c
@@ -42,6 +42,7 @@ extern struct backend backend_rockchip;
 extern struct backend backend_tegra;
 #endif
 extern struct backend backend_udl;
+extern struct backend backend_vgem;
 extern struct backend backend_virtio_gpu;
 
 static struct backend *drv_get_backend(int fd)
@@ -80,6 +81,7 @@ static struct backend *drv_get_backend(int fd)
                &backend_tegra,
 #endif
                &backend_udl,
+               &backend_vgem,
                &backend_virtio_gpu,
        };
 
diff --git a/vgem.c b/vgem.c
new file mode 100644 (file)
index 0000000..71efcc7
--- /dev/null
+++ b/vgem.c
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2016 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "drv_priv.h"
+#include "helpers.h"
+
+static drv_format_t vgem_resolve_format(drv_format_t format)
+{
+       switch (format) {
+       case DRV_FORMAT_FLEX_IMPLEMENTATION_DEFINED:
+               /*HACK: See b/28671744 */
+               return DRV_FORMAT_XBGR8888;
+       case DRV_FORMAT_FLEX_YCbCr_420_888:
+               return DRV_FORMAT_YVU420;
+       default:
+               return format;
+       }
+}
+
+const struct backend backend_vgem =
+{
+       .name = "vgem",
+       .bo_create = drv_dumb_bo_create,
+       .bo_destroy = drv_dumb_bo_destroy,
+       .bo_map = drv_dumb_bo_map,
+       .resolve_format = vgem_resolve_format,
+       .format_list = {
+               {DRV_FORMAT_ABGR8888, DRV_BO_USE_SCANOUT | DRV_BO_USE_RENDERING | DRV_BO_USE_CURSOR
+                                     | DRV_BO_USE_SW_READ_OFTEN | DRV_BO_USE_SW_WRITE_OFTEN},
+               {DRV_FORMAT_YVU420,   DRV_BO_USE_SCANOUT | DRV_BO_USE_RENDERING |
+                                     DRV_BO_USE_SW_READ_RARELY | DRV_BO_USE_SW_WRITE_RARELY},
+       }
+};
+