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"); }
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(); }
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; }