[PATCH v1] virtio-gpu: Make non-gl display updates work again when blob=true

Vivek Kasireddy posted 1 patch 11 months ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20230623060454.3749910-1-vivek.kasireddy@intel.com
Maintainers: "Michael S. Tsirkin" <mst@redhat.com>, Gerd Hoffmann <kraxel@redhat.com>
hw/display/virtio-gpu.c | 27 ++++++++++++++++++++++-----
1 file changed, 22 insertions(+), 5 deletions(-)
[PATCH v1] virtio-gpu: Make non-gl display updates work again when blob=true
Posted by Vivek Kasireddy 11 months ago
In the case where the console does not have gl capability, and
if blob is set to true, make sure that the display updates still
work. Commit e86a93f55463 accidentally broke this by misplacing
the return statement (in resource_flush) causing the updates to
be silently ignored.

Fixes: e86a93f55463 ("virtio-gpu: splitting one extended mode guest fb into n-scanouts")
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
Cc: Dongwon Kim <dongwon.kim@intel.com>
Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com>
---
 hw/display/virtio-gpu.c | 27 ++++++++++++++++++++++-----
 1 file changed, 22 insertions(+), 5 deletions(-)

diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index 66cddd94d9..97cd987cf3 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -498,6 +498,8 @@ static void virtio_gpu_resource_flush(VirtIOGPU *g,
     struct virtio_gpu_resource_flush rf;
     struct virtio_gpu_scanout *scanout;
     pixman_region16_t flush_region;
+    bool within_bounds = false;
+    bool update_submitted = false;
     int i;
 
     VIRTIO_GPU_FILL_CMD(rf);
@@ -518,13 +520,28 @@ static void virtio_gpu_resource_flush(VirtIOGPU *g,
                 rf.r.x < scanout->x + scanout->width &&
                 rf.r.x + rf.r.width >= scanout->x &&
                 rf.r.y < scanout->y + scanout->height &&
-                rf.r.y + rf.r.height >= scanout->y &&
-                console_has_gl(scanout->con)) {
-                dpy_gl_update(scanout->con, 0, 0, scanout->width,
-                              scanout->height);
+                rf.r.y + rf.r.height >= scanout->y) {
+                within_bounds = true;
+
+                if (console_has_gl(scanout->con)) {
+                    dpy_gl_update(scanout->con, 0, 0, scanout->width,
+                                  scanout->height);
+                    update_submitted = true;
+                }
             }
         }
-        return;
+
+        if (update_submitted) {
+            return;
+        }
+        if (!within_bounds) {
+            qemu_log_mask(LOG_GUEST_ERROR, "%s: flush bounds outside scanouts"
+                          " bounds for flush %d: %d %d %d %d\n",
+                          __func__, rf.resource_id, rf.r.x, rf.r.y,
+                          rf.r.width, rf.r.height);
+            cmd->error = VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER;
+            return;
+        }
     }
 
     if (!res->blob &&
-- 
2.39.2


Re: [PATCH v1] virtio-gpu: Make non-gl display updates work again when blob=true
Posted by Marc-André Lureau 10 months, 3 weeks ago
On Fri, Jun 23, 2023 at 8:27 AM Vivek Kasireddy <vivek.kasireddy@intel.com>
wrote:

> In the case where the console does not have gl capability, and
> if blob is set to true, make sure that the display updates still
> work. Commit e86a93f55463 accidentally broke this by misplacing
> the return statement (in resource_flush) causing the updates to
> be silently ignored.
>
> Fixes: e86a93f55463 ("virtio-gpu: splitting one extended mode guest fb
> into n-scanouts")
> Cc: Gerd Hoffmann <kraxel@redhat.com>
> Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
> Cc: Dongwon Kim <dongwon.kim@intel.com>
> Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com>
>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


> ---
>  hw/display/virtio-gpu.c | 27 ++++++++++++++++++++++-----
>  1 file changed, 22 insertions(+), 5 deletions(-)
>
> diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
> index 66cddd94d9..97cd987cf3 100644
> --- a/hw/display/virtio-gpu.c
> +++ b/hw/display/virtio-gpu.c
> @@ -498,6 +498,8 @@ static void virtio_gpu_resource_flush(VirtIOGPU *g,
>      struct virtio_gpu_resource_flush rf;
>      struct virtio_gpu_scanout *scanout;
>      pixman_region16_t flush_region;
> +    bool within_bounds = false;
> +    bool update_submitted = false;
>      int i;
>
>      VIRTIO_GPU_FILL_CMD(rf);
> @@ -518,13 +520,28 @@ static void virtio_gpu_resource_flush(VirtIOGPU *g,
>                  rf.r.x < scanout->x + scanout->width &&
>                  rf.r.x + rf.r.width >= scanout->x &&
>                  rf.r.y < scanout->y + scanout->height &&
> -                rf.r.y + rf.r.height >= scanout->y &&
> -                console_has_gl(scanout->con)) {
> -                dpy_gl_update(scanout->con, 0, 0, scanout->width,
> -                              scanout->height);
> +                rf.r.y + rf.r.height >= scanout->y) {
> +                within_bounds = true;
> +
> +                if (console_has_gl(scanout->con)) {
> +                    dpy_gl_update(scanout->con, 0, 0, scanout->width,
> +                                  scanout->height);
> +                    update_submitted = true;
> +                }
>              }
>          }
> -        return;
> +
> +        if (update_submitted) {
> +            return;
> +        }
> +        if (!within_bounds) {
> +            qemu_log_mask(LOG_GUEST_ERROR, "%s: flush bounds outside
> scanouts"
> +                          " bounds for flush %d: %d %d %d %d\n",
> +                          __func__, rf.resource_id, rf.r.x, rf.r.y,
> +                          rf.r.width, rf.r.height);
> +            cmd->error = VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER;
> +            return;
> +        }
>      }
>
>      if (!res->blob &&
> --
> 2.39.2
>
>
>

-- 
Marc-André Lureau