[virglrenderer-devel] multiprocess model and GL
Gurchetan Singh
gurchetansingh at chromium.org
Sat Jan 18 01:20:27 UTC 2020
On Fri, Jan 17, 2020 at 3:41 PM Chia-I Wu <olvaffe at gmail.com> wrote:
>
> On Thu, Jan 16, 2020 at 11:29 PM Gerd Hoffmann <kraxel at redhat.com> wrote:
> >
> > On Thu, Jan 16, 2020 at 12:33:25PM -0800, Chia-I Wu wrote:
> > > On Thu, Jan 16, 2020 at 4:58 AM Gerd Hoffmann <kraxel at redhat.com> wrote:
> > > >
> > > > On Mon, Jan 13, 2020 at 01:03:22PM -0800, Chia-I Wu wrote:
> > > > > Sorry I missed this email.
> > > > >
> > > > > On Thu, Jan 9, 2020 at 12:54 PM Dave Airlie <airlied at gmail.com> wrote:
> > > > > >
> > > > > > This is just an aside to the issue discussion, but I was wondering
> > > > > > before we heavily consider a vulkan multi-process model, could
> > > > > > we/should we prove a GL multi-process model first?
> > > > >
> > > > > I think there will just be the qemu process at first, with many GL
> > > > > contexts and one VkInstance for each guest VkInstance. Then there
> > > > > will be a switch to run different VkInstance in different processes
> > > > > (unlikely, but I wonder if this can be a vk layer). I did not plan
> > > > > for a multi-process GL model. Do you have anything you want to prove
> > > > > from it?
> > > >
> > > > Right now we have two models:
> > > > - Everything in qemu.
> > > > - Separate virgl process (see contrib/vhost-user-gpu/ in qemu),
> > > > but still all gl contexts in a single process.
> > > >
> > > > We could try to switch vhost-user-gpu to a one-process-per-context
> > > > model. I think it makes sense to at least think about the resource
> > > > management implications this would have (it would make virgl work
> > > > simliar to vulkan):
> > > >
> > > > - We would need a master process. It runs the virtqueues and manages
> > > > the resources.
> > >
> > > In the distant feature where we will be Vulkan-only, we will not want
> > > GL-specific paths. If we are to do multi-process GL now,
> >
> > [ Note; I don't think it buys us much to actually do that now, we have
> > enough to do even without that. But we should keep that in mind
> > when designing things ... ]
> >
> > > I think we should follow the multi-process Vulkan model, in the sense
> > > that GL resources should also be created in the per-context processes
> >
> > Yep, that would be good, we would not need a dma-buf for each and every
> > resource then. Problem here is backward compatibility. We simply can't
> > do that without changing the virtio protocol.
> >
> > So, I guess the options we have are:
> > (1) keep virgl mostly as-is and live with the downsides (which should
> > not be that much of a problem as long as one process manages all
> > GL contexts), or
> > (2) create virgl_v2, where resource management works very simliar to
> > the vulkan way of doing things, require the guest using that to
> > run gl+vk side-by-side. Old guests without vk support could
> > continue to use virgl_v1
>
> (1) still requires defining interop with vk. (2) seems like a
> reasonable requirement given that both drivers will be built from
> mesa. But there are also APIs who like a simple interface like
> virgl_v1 to allocate resources yet requires interop with vk. I guess
> both sound fine to me.
>
> The three resource models currently on the table are
>
> (A) A resource in the guest is a global driver object in the host.
> The global driver object is usable by all contexts and qemu.
> (B) A resource in the guest is a local driver object in the main
> renderer process in the host. VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE
> creates attachments and each attachment is a local object in a
> per-context process. VIRTIO_GPU_CMD_SET_SCANOUT creates a local
> object in qemu process.
> (C) A resource in the guest is an fd in the main renderer process in
> the host. The fd may be created locally by the main renderer process
> (e.g., udmabuf) or received from a per-context process.
> sends the fd to another per-context
> process. VIRTIO_GPU_CMD_SET_SCANOUT works similar to in (B).
>
> (A) is the current model and does not support VK/GL interop. (B) is
> designed to be compatible with (A) and the current virtio protocol.
> It allows multi-process GL as well as VK/GL interop, but it requires a
> dma-buf for each resource even when not really shared.
>
> (C) is the Vulkan model, but it is unclear how
> VIRTIO_GPU_CMD_RESOURCE_CREATE_3D works. I think we can think of the
> main process as a simple allocator as well.
> VIRTIO_GPU_CMD_RESOURCE_CREATE_3D makes the main process allocate
> (from GBM or GL) and create an fd , just like how the main process can
> allocate a udmabuf. This way this model can work with option (1).
I think we should go to some variation of (C).
GL (and even VK without certain extensions) resources are not
exportable -- the main process should only keep exportable resources
in this fd table. That's why I'm thinking of adding the
VIRTGPU_RESOURCE_EXPORTABLE_BIT and modifying guest Mesa accordingly
to set it properly (essentially looking for
PIPE_BIND_SHARED/PIPE_BIND_SCANOUT is sufficient for OpenGL).
If we get a VIRTIO_GPU_CMD_RESOURCE_CREATE_3D and QEMU advertises
RESOURCE_V2, we'll assume it's not exportable.
>
>
>
> > > > - We would need a per-context process.
> > > > - VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE would make master dma-buf export a
> > > > resource and the per-context process import it. Sharing resources
> > > > works by calling VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE multipe times for
> > > > different contexts, and therefore master passing the dma-buf to
> > > > multiple per-context processes.
> > >
> > > I would like to see the export and import parts to be separated out
> > > and executed by other commands, but all three commands can be sent
> > > together by the guest kernel when it makes senses. Especially the
> > > import part, the guest vulkan wants to pass some metadata and specify
> > > an object id for the imported driver object.
> >
> > I don't want call this import/export, that term is overloaded too much
> > already. Also the "export" is needed for more than just export. It is
> > needed for everything the guest needs a gem bo for (mmap, scanout, ...).
> >
> > I guess something along the lines of OBJECT_TO_RESOURCE (add virtio
> > resource for vulkan object, aka "export") and RESOURCE_TO_OBJECT
> > ("import") would be better.
> >
> > Does GL have object IDs too?
> No. A resource in the guest is already a global GL object in the
> host. VIRTIO_GPU_CMD_SUBMIT_3D can use the resource ids directly.
>
> Vulkan wants object ids because there might be no resource ids when
> resources are not needed. When there are resource ids, they might
> point to fds and importing them as objects are not trivial. Also the
> same resource id might be imported multiple times to create multiple
> objects.
>
> >
> > cheers,
> > Gerd
> >
More information about the virglrenderer-devel
mailing list