On my arrival at the lab, I started a little project: working on a display only driver for Windows. A good way to start learning what was hidden under the hood of an OpenGL application. Google Summer of Code 2017 arrived, and subject were published. Among these, QEMU’s ‘Windows Virgl driver’. Great ! Let’s apply !

Applications closed early April. I took a look at the already existing DOD driver (non official repo)

and also decided to learn a bit more about Vulkan. Results came, and I was selected, excellent !

Mission

The idea is to bring 3d acceleration on Windows guests running with QEMU. Using VirtIO devices and Virgl3d.

Context

windows stack

On this stack, we can work on three parts: opengl32.dll, ICD and Miniport driver.

  • OpenGL32.dll is just a dynamic library used to communicate with out runtime driver.
  • ICD: this is the OpenGL implementation. This part is the equivalent of Mesa on Linux.
  • Miniport-driver: this is the kernel driver. Hardware specific, we are going to do our hypercalls here.

Problems

  • Windows is not open source. We have some basic ideas about D3DKrnl subsystem behaviour, but nothing is certain.
  • To develop a complete OpenGL state tracker is a lot of work.
  • Virgl3D takes some calls, and bytecode for shaders, re-translate it to GLSL, and call OpenGL again. Which means we will do the same work twice. Once on the host, once on the guest.