From: Stanislav Vorobiov Date: Thu, 5 Jun 2014 14:33:25 +0000 (+0400) Subject: yagl/vigs: quick fixes for upstream X-Git-Tag: Tizen_Studio_1.3_Release_p2.3.1~228^2^2~129^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0c0816970d111c9ab170435b7d522770c1b94771;p=sdk%2Femulator%2Fqemu.git yagl/vigs: quick fixes for upstream 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 Signed-off-by: SeokYeon Hwang --- diff --git a/hw/vigs/vigs_device.c b/hw/vigs/vigs_device.c index 3769bade7a..442768add7 100644 --- a/hw/vigs/vigs_device.c +++ b/hw/vigs/vigs_device.c @@ -33,10 +33,15 @@ #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 +#endif + #define PCI_VENDOR_ID_VIGS 0x19B2 #define PCI_DEVICE_ID_VIGS 0x1011 @@ -48,16 +53,19 @@ #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(), }; diff --git a/hw/yagl/yagl_device.c b/hw/yagl/yagl_device.c index dccb5c0a35..383f0d53bd 100644 --- a/hw/yagl/yagl_device.c +++ b/hw/yagl/yagl_device.c @@ -56,7 +56,14 @@ #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"; } diff --git a/tizen/src/hw/maru_board.c b/tizen/src/hw/maru_board.c index 7a33d80356..59d5422fbb 100644 --- a/tizen/src/hw/maru_board.c +++ b/tizen/src/hw/maru_board.c @@ -69,16 +69,6 @@ #include "maru_common.h" #include "guest_debug.h" #include "maru_pm.h" -#if defined(__linux__) -#include -#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 0c0b337ad4..5c1f583e47 100644 --- 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);