Discussion of the implementations of VIRTIO specification
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: David Hoppenbrouwers <virtio-oasis@demindiro.com>
Cc: virtio-dev@lists.oasis-open.org, Gerd Hoffmann <kraxel@redhat.com>
Subject: Re: [virtio-dev] virtio-gpu: Clarification regarding VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D
Date: Sun, 26 Jun 2022 02:43:27 -0400	[thread overview]
Message-ID: <20220626022121-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <d6a014d1-e56e-6631-e0cd-cf51c1865a67@demindiro.com>

On Sat, Jun 25, 2022 at 03:45:46PM +0200, David Hoppenbrouwers wrote:
> Hello,
> 
> I believe there is a bug in QEMU's implementation of
> VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D. However it is not clear to me what
> the correct behaviour should be.
> 
> The specification says the driver must "allocate a framebuffer from
> guest ram, and attach it as backing storage to the resource just
> created". To me this implies that the size of the backing storage must
> match the size of the resource.
> 
> Consequently I intuitively expect that to update a rectangle R in the
> resource the same rectangle must be updated in the backing store, i.e:
> 
>      +--------------------+    +--------------------+
>      |                    |    |                    |
>      |        Host        |    |       Backing      |
>      |      Resource      |    |       Storage      |
>      |   +-----+          |    |   +-----+          |
>      |   |     |          |    |   |     |          |
>      |   |  R  |          |    |   |  R  |          |
>      |   |     |          |    |   |     |          |
>      |   +-----+          |    |   +-----+          |
>      +--------------------+    +--------------------+
> 
> However, QEMU actually starts drawing from the upper-left corner of the
> backing storage:
> 
>      +--------------------+    +-----+--------------+
>      |                    |    |     |              |
>      |        Host        |    |  R  | Backing      |
>      |      Resource      |    |     | Storage      |
>      |   +-----+          |    +-----+              |
>      |   |     |          |    |                    |
>      |   |  R  |          |    |                    |
>      |   |     |          |    |                    |
>      |   +-----+          |    |                    |
>      +--------------------+    +--------------------+
> 
> Reading the specification again I realized it does not explicitly
> mandate that the size of the backing storage must match the size of the
> resource. But if that were the case I would expect QEMU to behave like this:
> 
>      +--------------------+    +--------------------+
>      |                    |    |      R     +-------+
>      |        Host        |    +------------+       |
>      |      Resource      |    |                    |
>      |   +-----+          |    |       Backing      |
>      |   |     |          |    |       Storage      |
>      |   |  R  |          |    |                    |
>      |   |     |          |    |                    |
>      |   +-----+          |    |                    |
>      +--------------------+    +--------------------+
> 
> The relevant code in QEMU is in virtio_gpu_transfer_to_host_2d:
> 
>      format = pixman_image_get_format(res->image);
>      bpp = DIV_ROUND_UP(PIXMAN_FORMAT_BPP(format), 8);
>      stride = pixman_image_get_stride(res->image);
> 
>      if (t2d.offset || t2d.r.x || t2d.r.y ||
>          t2d.r.width != pixman_image_get_width(res->image)) {
>          void *img_data = pixman_image_get_data(res->image);
>          for (h = 0; h < t2d.r.height; h++) {
>              src_offset = t2d.offset + stride * h;
>              dst_offset = (t2d.r.y + h) * stride + (t2d.r.x * bpp);
> 
>              iov_to_buf(res->iov, res->iov_cnt, src_offset,
>                         (uint8_t *)img_data
>                         + dst_offset, t2d.r.width * bpp);
> 
> I would expect src_offset to either be
> 
>      src_offset = dst_offset;
> 
> if the backing storage's size is supposed to match the resource's size.
> If not, I'd expect src_offset to be
> 
>      src_offset = t2d.offset + t2d.r.width * h;
> 
> 
> My question boils down to:
> 
> - Is QEMU's implementation correct?
>    - If yes, what is the motivation behind it? Especially, what is the
> purpose of the explicit offset?
>    - If not, what is the expected behaviour?
> 
> 
> With kind regards,
> David Hoppenbrouwers

+cc Gerd.

> ---------------------------------------------------------------------
> To unsubscribe, e-mail: virtio-dev-unsubscribe@lists.oasis-open.org
> For additional commands, e-mail: virtio-dev-help@lists.oasis-open.org


---------------------------------------------------------------------
To unsubscribe, e-mail: virtio-dev-unsubscribe@lists.oasis-open.org
For additional commands, e-mail: virtio-dev-help@lists.oasis-open.org


      reply	other threads:[~2022-06-26  6:43 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <bcfa29cc-72bc-a2ef-0f7b-a882cada66b0@demindiro.com>
2022-06-25 13:45 ` [virtio-dev] virtio-gpu: Clarification regarding VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D David Hoppenbrouwers
2022-06-26  6:43   ` Michael S. Tsirkin [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220626022121-mutt-send-email-mst@kernel.org \
    --to=mst@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=virtio-dev@lists.oasis-open.org \
    --cc=virtio-oasis@demindiro.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox