Hello Dylan,

I remember coming across FuryGpu last year and reading the texture unit blog post. It's great seeing you've progressed further with this.


At the time of writing, I believe there is no Mesa3D Vulkan driver working on Windows, apart perhaps virtualization, WSL, or translation layer between two APIs. Please correct me if I'm wrong here.

In XDC 2024 Faith Ekstrand did demonstrate running RADV on Windows: https://indico.freedesktop.org/event/6/contributions/296/ . From the slides it seems like for the windowing side of things WSL was used since it "exposes a Wayland compositor with wl_shm" - "I didn’t have rewrite the Vulkan WSI before I can see something".

The starting point for WDDM2 in Mesa is: https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29945 .


To try answer some of your questions with how things work on Linux (an hopefully transfer to Windows through WDDM2):

1.

Mesa3D implements the userspace drivers, which then work with the kernel driver through the kernel's Direct Rendering Manager (DRM) subsystem. DRM provides a common interface but some things have to be implemented per GPU architecture. See https://gitlab.freedesktop.org/mesa/mesa/-/tree/main/include/drm-uapi?ref_type=heads where the Linux DRM Userspace API (UAPI) headers are included, to see what this interface looks like. On Windows, I'd assume this interface to be through WDDM2 and what Faith mentioned being the `pPrivateData`.

On a high level, the userspace driver compiles the shaders (In Mesa we have NIR and then each driver's own backend to finally produce the GPU assembly), constructs the command/control stream, and submits it to the kernel. And the kernel is then in charge of scheduling jobs on the GPU, although in some cases the GPU firmware might be doing the scheduling. Job synchronization is handled through Linux'es syncobj, the userspace driver creates the chain of how jobs should be synchronized with each other, but the lower level details and how this transfer to the hw is handled by the kernel driver.


2.

Not sure on this. v3dv might be good as a stating point, I think it should be approachable. For best practices, I think nvk was one of the more recent drivers so perhaps it has the best structure. Maybe someone else can chime on this. If you want to look at a tiler GPU driver, like I think FuryGpu is, maybe turnip or panvk.


3.

For Vulkan this is through the Vulkan Window System Integration (WSI). See https://docs.vulkan.org/guide/latest/wsi.html . Mesa support VK_KHR_win32_surface in Dozen (Vulkan to D3D 12 driver) and Zink (OpenGL to Vulkan driver), but this I think it's just for dealing with windows within Windows itself, so I guess Windows'es compositor, rather than taking control of the full display like direct-to-display (https://docs.vulkan.org/spec/latest/chapters/VK_KHR_surface/wsi.html#display) would do. I think we don't have support for direct-to-display for Windows in Mesa, so if you want to take full control of the display, that would likely need to be implemented.

In Linux, on a high level simplified view, how things work are that in the kernel you'd have a display driver controlling the hardware, Linux has DRM/KMS (Kernel Mode Setting), and generally you'd have your Wayland compositor (or X server) in userspace working with DRM/KMS. When a new window is opened, WSI works with the compositor and I think generally we'd have a shared buffer (dmabuf) which we use to render content from the GPU. The compositor is then in charge of compositing/showing the final window to the screen. With direct-to-display you don't have a compositor running, instead WSI works directly with DRM/KMS to display the rendered content (this is the part that we're missing for Windows I think, maybe it works through WDDM2 or maybe Windows has a different API for this, not sure).


I hope this helps.


Sorry if you receive it twice. I seem to have had some issue with the mailing list.


Regards,

Karmjit

On 29/05/2026 07:33, Dylan Barrie wrote:
Hi all!

I've spent the last couple years developing a fully-custom, FPGA-based GPU (www.furygpu.com <http://www.furygpu.com>) that I've recently gotten to the point where it should be mostly compatible with the requirements of Vulkan (shaders, for one!), to the degree that running simple programs would likely be possible. I've been driving the hardware with a custom API that is basically an API-copy of Vulkan, but given that the Mesa 3D project has already done a lot of the heavy lifting in terms of all of the infrastructure, I'm thinking it would probably be worthwhile to make use of it. It gets a bit tiring having to re-write every program I want to run!

Before I get started on this, I had a few questions that I hope those here can answer:

 1. I'm currently using a kernel-mode driver (on Windows) to
    communicate with the actual hardware. Is there existing
    infrastructure to deal with that kind of separation in Mesa 3D
    already? I've made efforts to slim down the user-mode <->
    kernel-mode interface as much as possible, and it basically comes
    down to just setting up DMA ops and telling the GPU to start
    executing from a given address.
 2. Is there an existing driver that would be a good starting point in
    terms of best practices for working within the Mesa 3D ecosystem?
 3. How does Mesa 3D interact with the OS's windowing system? My
    current setup is a kernel-mode display-only driver (like would be
    used for a USB->HDMI converter or something), which allows Windows
    to treat my GPU as a display output. When it comes time for an
    application to actually use the GPU hardware, the driver switches
    to outputting the rendered image to the display and the OS
    continues believing it's driving the display, none the wiser.
 4. Is there anything else I should be aware of or understand before
    starting?

Thanks for any insight you all may have for me!

 - Dylan

Reply via email to