diff mbox series

[PULL,04/33] virtio-gpu: Optimize 2D resource data transfer

Message ID 20230627130231.1614896-5-marcandre.lureau@redhat.com
State New
Headers show
Series [PULL,01/33] ui: return NULL when getting cursor without a console | expand

Commit Message

Marc-André Lureau June 27, 2023, 1:02 p.m. UTC
From: Keqian Zhu via <qemu-devel@nongnu.org>

The following points sometimes can reduce much data
to copy:
1. When width matches, we can transfer data with one
call of iov_to_buf().
2. Only the required height need to transfer, not
whole image.

Signed-off-by: Keqian Zhu <zhukeqian1@huawei.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20230612021358.25068-1-zhukeqian1@huawei.com>
---
 hw/display/virtio-gpu.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

Comments

Richard Henderson June 27, 2023, 3:04 p.m. UTC | #1
On 6/27/23 15:02, marcandre.lureau@redhat.com wrote:
> From: Keqian Zhu via <qemu-devel@nongnu.org>

You need to fix the author for this patch.


r~
Marc-André Lureau June 27, 2023, 3:10 p.m. UTC | #2
Hi

On Tue, Jun 27, 2023 at 5:04 PM Richard Henderson <
richard.henderson@linaro.org> wrote:

> On 6/27/23 15:02, marcandre.lureau@redhat.com wrote:
> > From: Keqian Zhu via <qemu-devel@nongnu.org>
>
> You need to fix the author for this patch.
>
>
>
ok done, do you want me to re-send the whole PR or is that enough?

The following changes since commit 4329d049d5b8d4af71c6b399d64a6d1b98856318:

  Merge tag 'pull-tcg-20230626' of https://gitlab.com/rth7680/qemu into
staging (2023-06-26 17:40:38 +0200)

are available in the Git repository at:

  https://gitlab.com/marcandre.lureau/qemu.git tags/ui-pull-request

for you to fetch changes up to de1f8ce0abb8c43d1e6a00c31c6d24dfe0505b92:

  ui/dbus: use shared D3D11 Texture2D when possible (2023-06-27 17:08:56
+0200)



> r~
>
>
Richard Henderson June 28, 2023, 9:22 a.m. UTC | #3
On 6/27/23 17:10, Marc-André Lureau wrote:
> Hi
> 
> On Tue, Jun 27, 2023 at 5:04 PM Richard Henderson <richard.henderson@linaro.org 
> <mailto:richard.henderson@linaro.org>> wrote:
> 
>     On 6/27/23 15:02, marcandre.lureau@redhat.com <mailto:marcandre.lureau@redhat.com> wrote:
>      > From: Keqian Zhu via <qemu-devel@nongnu.org <mailto:qemu-devel@nongnu.org>>
> 
>     You need to fix the author for this patch.
> 
> 
> 
> ok done, do you want me to re-send the whole PR or is that enough?
> 
> The following changes since commit 4329d049d5b8d4af71c6b399d64a6d1b98856318:
> 
>    Merge tag 'pull-tcg-20230626' of https://gitlab.com/rth7680/qemu 
> <https://gitlab.com/rth7680/qemu> into staging (2023-06-26 17:40:38 +0200)
> 
> are available in the Git repository at:
> 
> https://gitlab.com/marcandre.lureau/qemu.git 
> <https://gitlab.com/marcandre.lureau/qemu.git> tags/ui-pull-request
> 
> for you to fetch changes up to de1f8ce0abb8c43d1e6a00c31c6d24dfe0505b92:

That was enough, thanks.

Applied.  Please update https://wiki.qemu.org/ChangeLog/8.1 as appropriate.


r~
diff mbox series

Patch

diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index 66cddd94d9..af31018ab0 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -438,11 +438,11 @@  static void virtio_gpu_transfer_to_host_2d(VirtIOGPU *g,
                                            struct virtio_gpu_ctrl_command *cmd)
 {
     struct virtio_gpu_simple_resource *res;
-    int h;
+    int h, bpp;
     uint32_t src_offset, dst_offset, stride;
-    int bpp;
     pixman_format_code_t format;
     struct virtio_gpu_transfer_to_host_2d t2d;
+    void *img_data;
 
     VIRTIO_GPU_FILL_CMD(t2d);
     virtio_gpu_t2d_bswap(&t2d);
@@ -471,23 +471,23 @@  static void virtio_gpu_transfer_to_host_2d(VirtIOGPU *g,
     format = pixman_image_get_format(res->image);
     bpp = DIV_ROUND_UP(PIXMAN_FORMAT_BPP(format), 8);
     stride = pixman_image_get_stride(res->image);
+    img_data = pixman_image_get_data(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);
+    if (t2d.r.x || t2d.r.width != pixman_image_get_width(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);
+                       (uint8_t *)img_data + dst_offset,
+                       t2d.r.width * bpp);
         }
     } else {
-        iov_to_buf(res->iov, res->iov_cnt, 0,
-                   pixman_image_get_data(res->image),
-                   pixman_image_get_stride(res->image)
-                   * pixman_image_get_height(res->image));
+        src_offset = t2d.offset;
+        dst_offset = t2d.r.y * stride + t2d.r.x * bpp;
+        iov_to_buf(res->iov, res->iov_cnt, src_offset,
+                   (uint8_t *)img_data + dst_offset,
+                   stride * t2d.r.height);
     }
 }