[virglrenderer-devel] multiprocess model and GL

Chia-I Wu olvaffe at gmail.com
Wed Jan 22 20:19:39 UTC 2020


On Wed, Jan 22, 2020 at 6:51 AM Gerd Hoffmann <kraxel at redhat.com> wrote:
>
>   Hi,
>
> > So we need to handle vk and gl resources in different ways, or figure
> > something which works for both.
>
> Saw your update @ freedesktop gitlab meanwhile.
>
> So, yes, allocating an resource id first should work.  Started new
> branch, with just the blob API patch for now:
>   https://gitlab.freedesktop.org/virgl/drm-misc-next/commits/kraxel/memory-v3
>
> New DRM_IOCTL_VIRTGPU_RESOURCE_INIT_BLOB ioctl:  Basically allocates
> IDs (resource id, bo handle).  Also passes size.
Will this generate a virtio command?

A per-context process will send (resid, fd) to the main renderer
process in response to a future execbuffer.  The main renderer process
needs to know that resid is valid and the per-context process has the
permission.  Some form of VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE seems
needed.

> Actually creating the resource should happen via execbuffer (gl/vk) or
> via DRM_IOCTL_VIRTGPU_RESOURCE_ALLOC_BLOB (dumb buffer).

As noted in another mail, the use of execbuffer to allcoate, export,
and import is a contract between the guest vk driver and the host vk
per-context processes.  I think gl should adopt a similar practice,
but it is not a hard requirement.  For example, gl can keep using the
classic resource create ioctl for allocation and rely on lazy
export/import.  It can then use resid directly.  Or perhaps gl can use
execbuffer to allocate, but export/import implicitly.

I am fine if DRM_IOCTL_VIRTGPU_RESOURCE_ALLOC_BLOB becomes a flag of
DRM_IOCTL_VIRTGPU_RESOURCE_INIT_BLOB.  Resources can have many kinds
of backing storage

 - vk resources: INIT_BLOB and then execbuffer
 - gl resources: likely INIT_BLOB and then execbuffer, but also
classic resource create or other ways?
 - dumb resources: INIT_BLOB and then ALLOC_BLOB
 - gbm resources: could be a renderer detail, but could also use an
"easy" resource create ioctl?
 - iovec-only resources: INIT_BLOB w/ flag to create shmem and attach?
 - iovec+udmabuf resources: INIT_BLOB w/ yet another flag to create a
udmabuf from iovec?
 - memfd+udmabuf resources: INIT_BLOB and then ALLOC_BLOB?
   (memfd here is a host-owned heap that appear as vram rather than
system ram to the guests)

v2 family of resource ioctls and commands should take these into
consideration.  I honestly don't know which way we want to go yet.

> Right now the ioctls and structs have the bare minimum, I suspect we'll
> need some more fields added.  So the question is:  What info can get
> passed to the host via execbuffer?  I guess pretty much anything needed
> for object creation?  How should the kernel get that metadata (the ones
> it needs for mapping etc)?  Expect guest userspace pass that to the
> kernel?  Or better ask the host?
I believe everything the host driver API needs can be passed via execbuffer.

As for metadata the kernel needs for mapping, I think it is better to
ask the host.  The kernel needs (offset-in-pci-bar, memory-type) from
the host at minimum.


>
> cheers,
>   Gerd
>


More information about the virglrenderer-devel mailing list