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>
#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;
struct vigs_server *server;
+ char *backend;
+
/*
* Our console.
*/
.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) {
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) {
&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");
}
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(),
};
#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
{
{
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];
}
}
+#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,
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;
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);
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.
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);
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";
}
#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
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);
// 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
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);