示例#1
0
static void vigs_device_reset(DeviceState *d)
{
    VIGSState *s = container_of(d, VIGSState, dev.pci_dev.qdev);

    vigs_server_reset(s->server);

    vigs_fenceman_reset(s->fenceman);

    pci_set_irq(&s->dev.pci_dev, 0);

    s->reg_con = 0;
    s->reg_int = 0;

    VIGS_LOG_INFO("VIGS reset");
}
示例#2
0
static void vigs_device_exit(PCIDevice *dev)
{
    VIGSState *s = DO_UPCAST(VIGSState, dev.pci_dev, dev);

    vigs_server_destroy(s->server);

    qemu_bh_delete(s->fence_ack_bh);

    vigs_fenceman_destroy(s->fenceman);

    memory_region_destroy(&s->io_bar);
    memory_region_destroy(&s->ram_bar);
    memory_region_destroy(&s->vram_bar);

    VIGS_LOG_INFO("VIGS deinitialized");

    vigs_log_cleanup();
}
示例#3
0
static int vigs_device_init(PCIDevice *dev)
{
    VIGSState *s = DO_UPCAST(VIGSState, dev.pci_dev, dev);
    struct vigs_backend *backend = NULL;

    XSetErrorHandler(x_error_handler);
    XInitThreads();

    vigs_display = XOpenDisplay(0);

    if (!vigs_display) {
        fprintf(stderr, "Cannot open X display\n");
        exit(1);
    }

    vigs_render_queue = work_queue_create("render_queue");

    vigs_log_init();

    if (s->vram_size < 16 * 1024 * 1024) {
        VIGS_LOG_WARN("\"vram_size\" is too small, defaulting to 16mb");
        s->vram_size = 16 * 1024 * 1024;
    }

    if (s->ram_size < 1 * 1024 * 1024) {
        VIGS_LOG_WARN("\"ram_size\" is too small, defaulting to 1mb");
        s->ram_size = 1 * 1024 * 1024;
    }

    pci_config_set_interrupt_pin(dev->config, 1);

    memory_region_init_ram(&s->vram_bar, OBJECT(s),
                           TYPE_VIGS_DEVICE ".vram",
                           s->vram_size);

    memory_region_init_ram(&s->ram_bar, OBJECT(s),
                           TYPE_VIGS_DEVICE ".ram",
                           s->ram_size);

    memory_region_init_io(&s->io_bar, OBJECT(s),
                          &vigs_io_ops,
                          s,
                          TYPE_VIGS_DEVICE ".io",
                          VIGS_IO_SIZE);

    pci_register_bar(&s->dev.pci_dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->vram_bar);
    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);

    backend = vigs_gl_backend_create(vigs_display);

    if (!backend) {
        goto fail;
    }

    s->fenceman = vigs_fenceman_create();

    s->fence_ack_bh = qemu_bh_new(vigs_fence_ack_bh, s);

    s->con = graphic_console_init(DEVICE(dev), 0, &vigs_hw_ops, s);

    if (!s->con) {
        goto fail;
    }

    s->server = vigs_server_create(memory_region_get_ram_ptr(&s->vram_bar),
                                   memory_region_get_ram_ptr(&s->ram_bar),
                                   &vigs_dpy_ops,
                                   s,
                                   backend,
                                   vigs_render_queue);

    if (!s->server) {
        goto fail;
    }

    vigs_wsi = s->dev.wsi = &s->server->wsi;

    VIGS_LOG_INFO("VIGS initialized");

    VIGS_LOG_DEBUG("vram_size = %u", s->vram_size);
    VIGS_LOG_DEBUG("ram_size = %u", s->ram_size);

    return 0;

fail:
    if (backend) {
        backend->destroy(backend);
    }

    if (s->fence_ack_bh) {
        qemu_bh_delete(s->fence_ack_bh);
    }

    if (s->fenceman) {
        vigs_fenceman_destroy(s->fenceman);
    }

    memory_region_destroy(&s->io_bar);
    memory_region_destroy(&s->ram_bar);
    memory_region_destroy(&s->vram_bar);

    vigs_log_cleanup();

    return -1;
}
static bool vigs_gl_backend_wgl_check_gl_version(struct vigs_gl_backend_wgl *gl_backend_wgl,
                                                 bool *is_gl_2)
{
    int config_attribs[] = {
        WGL_SUPPORT_OPENGL_ARB, TRUE,
        WGL_DOUBLE_BUFFER_ARB, TRUE,
        WGL_DRAW_TO_PBUFFER_ARB, TRUE,
        WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB,
        WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,
        WGL_RED_BITS_ARB, 8,
        WGL_GREEN_BITS_ARB, 8,
        WGL_BLUE_BITS_ARB, 8,
        WGL_ALPHA_BITS_ARB, 8,
        WGL_COLOR_BITS_ARB, 32,
        WGL_DEPTH_BITS_ARB, 24,
        WGL_STENCIL_BITS_ARB, 8,
        0,
    };
    int ctx_attribs[] =
    {
        WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
        WGL_CONTEXT_MINOR_VERSION_ARB, 1,
        WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB,
        0
    };
    bool res = false;
    const char *tmp;
    HWND win;
    HDC dc;
    int config_id = 0;
    UINT n = 0;
    PIXELFORMATDESCRIPTOR pix_fmt;
    HGLRC ctx;

    tmp = getenv("GL_VERSION");

    if (tmp) {
        if (strcmp(tmp, "2") == 0) {
            VIGS_LOG_INFO("GL_VERSION forces OpenGL version to 2.1");
            *is_gl_2 = true;
            res = true;
        } else if (strcmp(tmp, "3_1") == 0) {
            VIGS_LOG_INFO("GL_VERSION forces OpenGL version to 3.1");
            *is_gl_2 = false;
            res = true;
        } else if (strcmp(tmp, "3_1_es3") == 0) {
            VIGS_LOG_INFO("GL_VERSION forces OpenGL version to 3.1 ES3");
            *is_gl_2 = false;
            res = true;
        } else if (strcmp(tmp, "3_2") == 0) {
            VIGS_LOG_INFO("GL_VERSION forces OpenGL version to 3.2");
            *is_gl_2 = false;
            res = true;
        } else {
            VIGS_LOG_CRITICAL("Bad GL_VERSION value = %s", tmp);
        }

        goto out1;
    }

    win = CreateWindow(VIGS_WGL_WIN_CLASS, "VIGSWin",
                       WS_DISABLED | WS_POPUP,
                       0, 0, 1, 1, NULL, NULL, 0, 0);

    if (!win) {
        VIGS_LOG_ERROR("CreateWindow failed");
        goto out1;
    }

    dc = GetDC(win);
    if (!dc) {
        VIGS_LOG_ERROR("GetDC failed");
        goto out2;
    }

    if (!gl_backend_wgl->wglChoosePixelFormatARB(dc,
                                                 config_attribs,
                                                 NULL,
                                                 1,
                                                 &config_id,
                                                 &n) || (n == 0)) {
        VIGS_LOG_ERROR("wglChoosePixelFormatARB failed");
        goto out3;
    }

    if (!DescribePixelFormat(dc,
                             config_id,
                             sizeof(PIXELFORMATDESCRIPTOR),
                             &pix_fmt)) {
        VIGS_LOG_ERROR("DescribePixelFormat failed");
        goto out3;
    }

    if (!SetPixelFormat(dc,
                        config_id,
                        &pix_fmt)) {
        VIGS_LOG_ERROR("SetPixelFormat failed");
        goto out3;
    }

    ctx = gl_backend_wgl->wglCreateContextAttribsARB(dc,
                                                     NULL,
                                                     ctx_attribs);

    *is_gl_2 = (ctx == NULL);
    res = true;

    if (ctx) {
        VIGS_LOG_INFO("Using OpenGL 3.1+ core");
    } else {
        VIGS_LOG_INFO("wglCreateContextAttribsARB failed, using OpenGL 2.1");
    }

    gl_backend_wgl->wglDeleteContext(ctx);

out3:
    ReleaseDC(win, dc);
out2:
    DestroyWindow(win);
out1:

    return res;
}