yagl/vigs: quick fixes for upstream 23/23223/3
authorStanislav Vorobiov <s.vorobiov@samsung.com>
Thu, 5 Jun 2014 14:33:25 +0000 (18:33 +0400)
committerSeokYeon Hwang <syeon.hwang@samsung.com>
Fri, 20 Jun 2014 07:12:43 +0000 (16:12 +0900)
New options for YaGL, VIGS is introduced.
    -device vigs,backend=[backend]
    -device yagl

Old options are still available.

Change-Id: I8c19bde6fb66dbb75f9aaee434a8bc98160048fd
Signed-off-by: Stanislav Vorobiov <s.vorobiov@samsung.com>
Signed-off-by: SeokYeon Hwang <syeon.hwang@samsung.com>
hw/vigs/vigs_device.c
hw/yagl/yagl_device.c
tizen/src/hw/maru_board.c
vl.c

index 3769bade7aa9e8ca50bff53337d316b79ad53d17..442768add75842a0c1614a3f2c5d471238deb492 100644 (file)
 #include "vigs_backend.h"
 #include "vigs_regs.h"
 #include "vigs_fenceman.h"
+#include "work_queue.h"
 #include "hw/hw.h"
 #include "ui/console.h"
 #include "qemu/main-loop.h"
 
+#ifdef __linux__
+#include <X11/Xlib.h>
+#endif
+
 #define PCI_VENDOR_ID_VIGS 0x19B2
 #define PCI_DEVICE_ID_VIGS 0x1011
 
 #define VIGS_EXTRA_INVALIDATION (0)
 #endif
 
-struct work_queue;
+#ifdef __linux__
+Display *vigs_display = NULL;
+#else
+void *vigs_display = NULL;
+#endif
+
+struct work_queue *vigs_render_queue = NULL;
+struct winsys_interface *vigs_wsi = NULL;
 
 typedef struct VIGSState
 {
     VIGSDevice dev;
 
-    void *display;
-
-    struct work_queue *render_queue;
-
     MemoryRegion vram_bar;
     uint32_t vram_size;
 
@@ -72,6 +80,8 @@ typedef struct VIGSState
 
     struct vigs_server *server;
 
+    char *backend;
+
     /*
      * Our console.
      */
@@ -289,11 +299,37 @@ static struct vigs_display_ops vigs_dpy_ops =
     .fence_ack = vigs_fence_ack,
 };
 
+#ifdef __linux__
+static int x_error_handler(Display *dpy, XErrorEvent *e)
+{
+    return 0;
+}
+
+static Display *get_display(void)
+{
+    XSetErrorHandler(x_error_handler);
+    XInitThreads();
+
+    Display *display = XOpenDisplay(0);
+
+    if (!display) {
+        fprintf(stderr, "Cannot open X display\n");
+        exit(1);
+    }
+
+    return display;
+}
+#endif
+
 static int vigs_device_init(PCIDevice *dev)
 {
     VIGSState *s = DO_UPCAST(VIGSState, dev.pci_dev, dev);
     struct vigs_backend *backend = NULL;
 
+    if (!vigs_render_queue) {
+        vigs_render_queue = work_queue_create("render_queue");
+    }
+
     vigs_log_init();
 
     if (s->vram_size < 16 * 1024 * 1024) {
@@ -326,10 +362,23 @@ static int vigs_device_init(PCIDevice *dev)
     pci_register_bar(&s->dev.pci_dev, 1, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->ram_bar);
     pci_register_bar(&s->dev.pci_dev, 2, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->io_bar);
 
-    if (!strcmp(vigs_backend, "gl")) {
-        backend = vigs_gl_backend_create(s->display);
-    } else if (!strcmp(vigs_backend, "sw")) {
+    if (!s->backend) {
+        VIGS_LOG_INFO("No backend is specified, defaulting to \"sw\"");
+        // choose "sw" backend as default.
+        backend = vigs_sw_backend_create();
+    } else if (!strcmp(s->backend, "gl")) {
+        VIGS_LOG_INFO("vigs uses \"gl\" backend");
+#ifdef __linux__
+        if (!vigs_display) {
+            vigs_display = get_display();
+        }
+#endif
+        backend = vigs_gl_backend_create(vigs_display);
+    } else if (!strcmp(s->backend, "sw")) {
+        VIGS_LOG_INFO("vigs uses \"sw\" backend");
         backend = vigs_sw_backend_create();
+    } else {
+        VIGS_LOG_CRITICAL("Unknown backend=\"%s\" is specified", s->backend);
     }
 
     if (!backend) {
@@ -351,13 +400,13 @@ static int vigs_device_init(PCIDevice *dev)
                                    &vigs_dpy_ops,
                                    s,
                                    backend,
-                                   s->render_queue);
+                                   vigs_render_queue);
 
     if (!s->server) {
         goto fail;
     }
 
-    s->dev.wsi = &s->server->wsi;
+    vigs_wsi = s->dev.wsi = &s->server->wsi;
 
     VIGS_LOG_INFO("VIGS initialized");
 
@@ -424,20 +473,11 @@ static void vigs_device_exit(PCIDevice *dev)
 }
 
 static Property vigs_properties[] = {
-    {
-        .name   = "display",
-        .info   = &qdev_prop_ptr,
-        .offset = offsetof(VIGSState, display),
-    },
-    {
-        .name   = "render_queue",
-        .info   = &qdev_prop_ptr,
-        .offset = offsetof(VIGSState, render_queue),
-    },
     DEFINE_PROP_UINT32("vram_size", VIGSState, vram_size,
                        32 * 1024 * 1024),
     DEFINE_PROP_UINT32("ram_size", VIGSState, ram_size,
                        1 * 1024 * 1024),
+    DEFINE_PROP_STRING("backend", VIGSState, backend),
     DEFINE_PROP_END_OF_LIST(),
 };
 
index dccb5c0a353c7ea9096f97cabc3d3aaade8c8026..383f0d53bdc44c54deffe884f3d41514c0df3538 100644 (file)
 
 #define YAGL_MAX_USERS (YAGL_MEM_SIZE / YAGL_REGS_SIZE)
 
-struct work_queue;
+#ifdef __linux__
+extern Display *vigs_display;
+#else
+extern void *vigs_display;
+#endif
+
+extern struct work_queue *vigs_render_queue;
+extern struct winsys_interface *vigs_wsi;
 
 struct yagl_user
 {
@@ -69,12 +76,6 @@ typedef struct YaGLState
 {
     PCIDevice dev;
 
-    void *display;
-
-    struct work_queue *render_queue;
-
-    struct winsys_interface *wsi;
-
     MemoryRegion iomem;
     struct yagl_server_state *ss;
     struct yagl_user users[YAGL_MAX_USERS];
@@ -213,6 +214,28 @@ static void yagl_device_write(void *opaque, hwaddr offset,
     }
 }
 
+#ifdef __linux__
+static int x_error_handler(Display *dpy, XErrorEvent *e)
+{
+    return 0;
+}
+
+static Display *get_display(void)
+{
+    XSetErrorHandler(x_error_handler);
+    XInitThreads();
+
+    Display *display = XOpenDisplay(0);
+
+    if (!display) {
+        fprintf(stderr, "Cannot open X display\n");
+        exit(1);
+    }
+
+    return display;
+}
+#endif
+
 static const MemoryRegionOps yagl_device_ops =
 {
     .read = yagl_device_read,
@@ -239,7 +262,17 @@ static int yagl_device_init(PCIDevice *dev)
 
     yagl_handle_gen_init();
 
-    egl_driver = yagl_egl_driver_create(s->display);
+    if (!vigs_render_queue) {
+        vigs_render_queue = work_queue_create("render_queue");
+    }
+
+#ifdef __linux__
+    if (!vigs_display) {
+        vigs_display = get_display();
+    }
+#endif
+
+    egl_driver = yagl_egl_driver_create(vigs_display);
 
     if (!egl_driver) {
         goto fail;
@@ -252,8 +285,9 @@ static int yagl_device_init(PCIDevice *dev)
         goto fail;
     }
 
-    if (s->wsi) {
-        egl_backend = yagl_egl_onscreen_create(s->wsi,
+    // FIXME: How can we gurantee that vigs is initialized before ?
+    if (vigs_wsi) {
+        egl_backend = yagl_egl_onscreen_create(vigs_wsi,
                                                egl_driver,
                                                gles_driver);
         gles_driver = yagl_gles_onscreen_create(gles_driver);
@@ -271,7 +305,7 @@ static int yagl_device_init(PCIDevice *dev)
     egl_driver = NULL;
 
     s->ss = yagl_server_state_create(egl_backend, gles_driver,
-                                     s->render_queue, s->wsi);
+                                     vigs_render_queue, vigs_wsi);
 
     /*
      * Owned/destroyed by server state.
@@ -342,25 +376,6 @@ static void yagl_device_exit(PCIDevice *dev)
     yagl_log_cleanup();
 }
 
-static Property yagl_properties[] = {
-    {
-        .name   = "display",
-        .info   = &qdev_prop_ptr,
-        .offset = offsetof(YaGLState, display),
-    },
-    {
-        .name   = "render_queue",
-        .info   = &qdev_prop_ptr,
-        .offset = offsetof(YaGLState, render_queue),
-    },
-    {
-        .name   = "winsys_gl_interface",
-        .info   = &qdev_prop_ptr,
-        .offset = offsetof(YaGLState, wsi),
-    },
-    DEFINE_PROP_END_OF_LIST(),
-};
-
 static void yagl_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
@@ -372,7 +387,6 @@ static void yagl_class_init(ObjectClass *klass, void *data)
     k->device_id = PCI_DEVICE_ID_YAGL;
     k->class_id = PCI_CLASS_OTHERS;
     dc->reset = yagl_device_reset;
-    dc->props = yagl_properties;
     dc->desc = "YaGL device";
 }
 
index 7a33d803568f1b011d220b3860281aee42378179..59d5422fbb669d33a23fe970b07ba65b9cfce7cb 100644 (file)
 #include "maru_common.h"
 #include "guest_debug.h"
 #include "maru_pm.h"
-#if defined(__linux__)
-#include <X11/Xlib.h>
-#endif
-#include "vigs/vigs_device.h"
-#include "vigs/work_queue.h"
-extern int enable_yagl;
-extern const char *yagl_backend;
-extern int enable_vigs;
-extern const char *vigs_backend;
-extern int enable_spice;
 
 #define MAX_IDE_BUS 2
 
@@ -95,55 +85,10 @@ MemoryRegion *get_ram_memory(void)
     return global_ram_memory;
 }
 
-#if defined(CONFIG_LINUX)
-static int x_error_handler(Display *dpy, XErrorEvent *e)
-{
-    return 0;
-}
-#endif
-
 /* maru specialized device init */
 static void maru_device_init(void)
 {
-    PCIBus *pci_bus = (PCIBus *) object_resolve_path_type("", TYPE_PCI_BUS, NULL);
-
-#if defined(CONFIG_LINUX)
-    XSetErrorHandler(x_error_handler);
-    XInitThreads();
-    Display *display = XOpenDisplay(0);
-    if (!display && !enable_spice) {
-        fprintf(stderr, "Cannot open X display\n");
-        exit(1);
-    }
-#else
-    void *display = NULL;
-#endif
-    struct work_queue *render_queue = NULL;
-    struct winsys_interface *vigs_wsi = NULL;
-
-    if (enable_vigs || enable_yagl) {
-        render_queue = work_queue_create("render_queue");
-    }
-
-    if (enable_vigs) {
-        PCIDevice *pci_dev = pci_create(pci_bus, -1, "vigs");
-        qdev_prop_set_ptr(&pci_dev->qdev, "display", display);
-        qdev_prop_set_ptr(&pci_dev->qdev, "render_queue", render_queue);
-        qdev_init_nofail(&pci_dev->qdev);
-        vigs_wsi = DO_UPCAST(VIGSDevice, pci_dev, pci_dev)->wsi;
-    }
-
-    if (enable_yagl) {
-        PCIDevice *pci_dev = pci_create(pci_bus, -1, "yagl");
-        qdev_prop_set_ptr(&pci_dev->qdev, "display", display);
-        qdev_prop_set_ptr(&pci_dev->qdev, "render_queue", render_queue);
-        if (vigs_wsi &&
-            (strcmp(yagl_backend, "vigs") == 0) &&
-            (strcmp(vigs_backend, "gl") == 0)) {
-            qdev_prop_set_ptr(&pci_dev->qdev, "winsys_gl_interface", vigs_wsi);
-        }
-        qdev_init_nofail(&pci_dev->qdev);
-    }
+    // do nothing for now...
 }
 
 extern void pc_init_pci(QEMUMachineInitArgs *args);
diff --git a/vl.c b/vl.c
index 0c0b337ad4a99d808fc5f3610484999d07a84f1c..5c1f583e47396df53ec7c7dc75a4126b327e7920 100644 (file)
--- a/vl.c
+++ b/vl.c
@@ -4091,41 +4091,8 @@ int main(int argc, char **argv, char **envp)
     // Returned variable points different address from input variable.
     kernel_cmdline = prepare_maru(kernel_cmdline);
     qemu_opt_set(qemu_get_machine_opts(), "append", kernel_cmdline);
-
-    // for VIGS/YaGL
-    if (enable_vigs) {
-        if (!vigs_backend) {
-            vigs_backend = g_strdup("gl");
-        }
-
-        if (g_strcmp0(vigs_backend, "gl") != 0 && g_strcmp0(vigs_backend, "sw") != 0) {
-            fprintf (stderr, "Error: Bad VIGS backend - %s!\n", vigs_backend);
-            exit(1);
-        }
-    }
-
-    if (enable_yagl) {
-        if (!yagl_backend) {
-            yagl_backend = "offscreen";
-        }
-
-        if (g_strcmp0(yagl_backend, "offscreen") != 0) {
-            if (g_strcmp0(yagl_backend, "vigs") == 0) {
-                if (!enable_vigs) {
-                    fprintf (stderr, "Error: Bad YaGL backend - %s, VIGS not enabled!\n", yagl_backend);
-                    exit(1);
-                }
-                if (g_strcmp0(vigs_backend, "gl") != 0) {
-                    fprintf (stderr, "Error: Bad YaGL backend - %s, VIGS is not configured with gl backend!\n", yagl_backend);
-                    exit(1);
-                }
-            } else {
-                fprintf (stderr, "Error: Bad YaGL backend - %s!\n", yagl_backend);
-                exit(1);
-            }
-        }
-    }
 #endif
+
     /* Open the logfile at this point, if necessary. We can't open the logfile
      * when encountering either of the logging options (-d or -D) because the
      * other one may be encountered later on the command line, changing the
@@ -4644,6 +4611,25 @@ int main(int argc, char **argv, char **envp)
         qemu_spice_display_init();
     }
 #endif
+#ifdef CONFIG_VIGS
+    // To support legacy VIGS options
+    if (enable_vigs) {
+        PCIBus *pci_bus = (PCIBus *) object_resolve_path_type("", TYPE_PCI_BUS, NULL);
+        PCIDevice *pci_dev = pci_create(pci_bus, -1, "vigs");
+        if (vigs_backend) {
+            qdev_prop_set_string(&pci_dev->qdev, "backend", vigs_backend);
+        }
+        qdev_init_nofail(&pci_dev->qdev);
+    }
+#endif
+#ifdef CONFIG_YAGL
+    // To support legacy YaGL options
+    if (enable_yagl) {
+        PCIBus *pci_bus = (PCIBus *) object_resolve_path_type("", TYPE_PCI_BUS, NULL);
+        PCIDevice *pci_dev = pci_create(pci_bus, -1, "yagl");
+        qdev_init_nofail(&pci_dev->qdev);
+    }
+#endif
 
     if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) {
         exit(1);