What happens these days is that GPU buffers are mapped into user space, where they are filled with textures and drawing commands. Then, they are submitted to the kernel GPU scheduler for execution. See e.g.https://lwn.net/Articles/283798.
These days you don't even submit them via a kernel call these days; you've got your own GPU MMU context so you can kind of just go to town within your own process.
That's sort of the whole point behind Mantle/Vulkan/Metal/DX12.