On Fri, Jun 23, 2023 at 8:27 AM Vivek Kasireddy <vivek.kasire...@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 <kra...@redhat.com>
> Cc: Marc-André Lureau <marcandre.lur...@redhat.com>
> Cc: Dongwon Kim <dongwon....@intel.com>
> Signed-off-by: Vivek Kasireddy <vivek.kasire...@intel.com>
>

Reviewed-by: Marc-André Lureau <marcandre.lur...@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

Reply via email to