[virglrenderer-devel] coherent memory access for virgl
Tomeu Vizoso
tomeu.vizoso at collabora.com
Wed Oct 3 14:46:55 UTC 2018
On 9/28/18 5:48 AM, Gurchetan Singh wrote:
> On Thu, Sep 27, 2018 at 12:04 AM Gerd Hoffmann <kraxel at redhat.com> wrote:
>>
>>>>> Right now, for most
>>>>> textures, virglrenderer copies iovecs into a temporary buffer (see
>>>>> read_transfer_data), and then calls glTexSubImage2D*.
>>>>
>>>> Is virglrenderer clever enough to skip the temporary buffer copy in case
>>>> it finds niov == 1 ?
>>>
>>> There is a fast-path in read_transfer_data / write_transfer_data
>>> depending on the send_size and various other parameters, but in my gdb
>>> experience it's not used most of the time.
>>
>> Looking at the code vrend_renderer_transfer_write_iov() seems to not
>> call read_transfer_data() in the first place in case num_iovs == 1.
>>
>> So, qemu could just pass in a iov with one element, and things would
>> improve with current virglrenderer versions.
>
> If that's possible, that'd be great.
>
>> Newer virglrenderer
>> versions could consume dmabuf handle and mapping pointer instead (and
>> import the dmabuf if possible).
>>
>>> However, such cases are prominent in the Android / ChromeOS display
>>> stacks (and often mapped in the guest), so that's why I'm interested
>>> in making them backed by host memory and display/GPU optimized. We'll
>>> need a way of expressing modifiers to the guest, so this delves into
>>> the earlier discussion of wayland host proxying. Who should allocate
>>> -- the host compositor, the VMM, virglrenderer? The host compositor
>>> seems like the most natural choice.
>>
>> Why the host compositor? Normal wayland clients don't ask the host
>> compositor for buffers either, right? They do egl rendering using
>> render nodes, export the front buffer as dmabuf and pass them to the
>> compositor for rendering ...
>>
>> I think virglrenderer should allocate the buffers.
>
> virglrenderer allocating the buffers should work for now. There was
> some discussion on using modifiers for v4l2, but that didn't go very
> far:
>
> https://lists.freedesktop.org/archives/dri-devel/2017-August/150850.html
>
> Modifiers are designed to have multiple consumer apis, but I've only
> seen EGL + KMS implementations.
>
> If virglrenderer will do the allocation, what about
> virtio_gpu_resource_create_2d -- who calls that in guest userspace?
> Should it ever be host-optimized (since we're essentially talking
> about single-level 2D textures/render targets/scan-out buffers)?
>
>>
>>> Are there any plans of the guest using host-optimized buffers
>>> (communicated via modifiers) in a purely Linux guest?
>>
>> I think that would imply the virgl mesa driver must be able to handle
>> pretty much any vendors compressed/tiled buffer format. Hmm, no idea
>> how difficuilt that would be.
>
> It could actually be pretty easy, due the Gallium abstraction. We
> need give Gallium a linear view into the texture -- which we can
> always fallback to GL to do. Other items include:
>
> 1) Fix the resource info ioctl to actually return the stride + format modifiers
> 2) Expose the modifiers the host supports (via
> eglQueryDmaBufModifiersEXT) in the guest. The applicability of this
> depends on the userspace (Android won't use this).
>
>>>>> But making host memory guest visible will bring the worst-case buffer
>>>>> copies from 3 to 1. For textures, if we start counting when the GPU
>>>>> buffer gets detiled, there will be 5 copies currently, 3 with udmabuf,
>>>>> and 1 with host exposed memory.
>>>>
>>>> 5 copies? verbose please. I can see three:
>>>
>>> It depends on when you start counting. I started counting from
>>> vrend_renderer_transfer_send_iov, which includes fetching the data
>>> from the host and packing that data into the iovecs. Probably a worst
>>> case scenario.
>>
>> Ah, you talk about the host -> guest path, not guest -> host (or both?).
>>
>> Is host -> guest transfer used that much? I'd expect the guest just
>> asks the host to display the rendered result instead of reading it back.
>
> Both. Not sure how common it is in Linux, but Android maps/unmaps YUV
> buffers quite a bit, which are later used by GL.
>
>>
>>>>> ii) virtio_gpu_resource_create_3d -- may or may not be host backed
>>>>> (depends on the PCI bar size, platform-specific information -- guest
>>>>> doesn't need to know)
>>>>
>>>> Hmm? How can this work in a way which is transparent for the guest?
>>>
>>> We already need to extend the DRM_VIRTGPU_RESOURCE_INFO ioctl, since
>>> it doesn't return the stride and doesn't work for YUV buffers (see
>>> crrev.com/c/1208591). Maybe we can also add a bitmask, which we can
>>> populate with memory info (i.e, HOST_BIT | COHERENT_BIT)?
>>
>> Well, for userspace it can be transparent. Userspace will just call
>> mmap() and the kernel will sort things transparently depending on the
>> buffer allocation (userspace knowing how buffers are allocated is
>> probably useful nevertheless).
>>
>> I was thinking about the kernel / vmm interface. The virtio-gpu kms
>> driver certainly needs to know about the buffer allocation ...
>
> The KMS part will be more difficult than the EGL part.
>
> For example, on some ARM devices, AFBC can be only used on the (host)
> primary KMS plane. If a video running in QEMU is full screen, it's
> advantageous to allocate an AFBC buffer and then scan-it out. But if
> the QEMU window becomes smaller, the best option is to use a linear
> strided buffer and schedule that as an overlay. But the guest always
> thinks it's fullscreen ...
>
> How is the guest currently notified about size changes of it's drawing
> target? Do buffers get re-allocated?
>
> Previously (see slide 25 of
> https://www.x.org/wiki/Events/XDC2017/widawsky_fb_modifiers.pdf),
> there was discussion about the compositor sending supported modifiers
> to the client (QEMU) through some sort of protocol. Does the
> compositor notify the client of modifier changes if window size
> changes? Perhaps wayland experts (Tomeu?) know.
My understanding is that with wl_dmabuf, the buffers are allocated by the
client. So it can decide whether to use a modifier or not, and on surface
size changes it can allocate a different one. But TBH, I haven't checked.
Cheers,
Tomeu
More information about the virglrenderer-devel
mailing list