From patchwork Sun Sep 4 22:20:25 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= X-Patchwork-Id: 665568 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3sS6mn0Ctdz9sCg for ; Mon, 5 Sep 2016 08:22:33 +1000 (AEST) Received: from localhost ([::1]:51218 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bgfo5-0003hc-W6 for incoming@patchwork.ozlabs.org; Sun, 04 Sep 2016 18:22:30 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43216) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bgfmc-0002VU-Kw for qemu-devel@nongnu.org; Sun, 04 Sep 2016 18:20:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bgfmb-0006Ns-Bm for qemu-devel@nongnu.org; Sun, 04 Sep 2016 18:20:58 -0400 Received: from mx1.redhat.com ([209.132.183.28]:43354) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bgfmb-0006Nm-3C for qemu-devel@nongnu.org; Sun, 04 Sep 2016 18:20:57 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BD842C049D5C for ; Sun, 4 Sep 2016 22:20:56 +0000 (UTC) Received: from localhost (ovpn-116-72.phx2.redhat.com [10.3.116.72]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u84MKs50023022; Sun, 4 Sep 2016 18:20:55 -0400 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Mon, 5 Sep 2016 02:20:25 +0400 Message-Id: <20160904222039.11460-5-marcandre.lureau@redhat.com> In-Reply-To: <20160904222039.11460-1-marcandre.lureau@redhat.com> References: <20160904222039.11460-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Sun, 04 Sep 2016 22:20:56 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 04/18] virtio-gpu: start splitting scanout/resource flushing X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: airlied@redhat.com, kraxel@redhat.com, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Dave Airlie This is preparatory work for introducing a thread. Signed-off-by: Marc-André Lureau --- hw/display/virtio-gpu-3d.c | 68 +++++++++++++++++++++++++++++++----------- include/hw/virtio/virtio-gpu.h | 20 +++++++++++++ 2 files changed, 71 insertions(+), 17 deletions(-) diff --git a/hw/display/virtio-gpu-3d.c b/hw/display/virtio-gpu-3d.c index 758d33a..036d943 100644 --- a/hw/display/virtio-gpu-3d.c +++ b/hw/display/virtio-gpu-3d.c @@ -118,22 +118,59 @@ static void virtio_gpu_rect_update(VirtIOGPU *g, int idx, int x, int y, dpy_gl_update(g->scanout[idx].con, x, y, width, height); } +static void virtio_gpu_do_resource_flush(VirtIOGPU *g, + struct virtio_gpu_thread_flush *fl) +{ + int i; + + for (i = 0; i < fl->num_flushes; i++) { + virtio_gpu_rect_update(g, fl->idx[i], + fl->r.x, fl->r.y, + fl->r.width, fl->r.height); + } +} + static void virgl_cmd_resource_flush(VirtIOGPU *g, struct virtio_gpu_ctrl_command *cmd) { struct virtio_gpu_resource_flush rf; + struct virtio_gpu_thread_msg msg; int i; VIRTIO_GPU_FILL_CMD(rf); trace_virtio_gpu_cmd_res_flush(rf.resource_id, rf.r.width, rf.r.height, rf.r.x, rf.r.y); + msg.u.fl.r = rf.r; + msg.u.fl.num_flushes = 0; for (i = 0; i < g->conf.max_outputs; i++) { if (g->scanout[i].resource_id != rf.resource_id) { continue; } - virtio_gpu_rect_update(g, i, rf.r.x, rf.r.y, rf.r.width, rf.r.height); + msg.u.fl.idx[msg.u.fl.num_flushes++] = i; + } + virtio_gpu_do_resource_flush(g, &msg.u.fl); +} + +static void virtio_gpu_do_set_scanout(VirtIOGPU *g, + struct virtio_gpu_set_scanout_info *info) + +{ + if (info->tex_id) { + qemu_console_resize(g->scanout[info->idx].con, + info->r.width, info->r.height); + + dpy_gl_scanout(g->scanout[info->idx].con, info->tex_id, + info->flags & 1 /* FIXME: Y_0_TOP */, + info->width, info->height, + info->r.x, info->r.y, info->r.width, info->r.height); + } else { + if (info->idx != 0) + dpy_gfx_replace_surface(g->scanout[info->idx].con, NULL); + dpy_gl_scanout(g->scanout[info->idx].con, 0, false, + 0, 0, 0, 0, 0, 0); } + g->scanout[info->idx].resource_id = info->resource_id; } static void virgl_cmd_set_scanout(VirtIOGPU *g, @@ -141,7 +178,7 @@ static void virgl_cmd_set_scanout(VirtIOGPU *g, { struct virtio_gpu_set_scanout ss; struct virgl_renderer_resource_info info; - int ret; + struct virtio_gpu_thread_msg msg; VIRTIO_GPU_FILL_CMD(ss); trace_virtio_gpu_cmd_set_scanout(ss.scanout_id, ss.resource_id, @@ -156,9 +193,13 @@ static void virgl_cmd_set_scanout(VirtIOGPU *g, g->enable = 1; memset(&info, 0, sizeof(info)); + memset(&msg, 0, sizeof(msg)); + msg.u.ss.r = ss.r; + msg.u.ss.idx = ss.scanout_id; + msg.u.ss.resource_id = ss.resource_id; if (ss.resource_id && ss.r.width && ss.r.height) { - ret = virgl_renderer_resource_get_info(ss.resource_id, &info); + int ret = virgl_renderer_resource_get_info(ss.resource_id, &info); if (ret == -1) { qemu_log_mask(LOG_GUEST_ERROR, "%s: illegal resource specified %d\n", @@ -166,21 +207,14 @@ static void virgl_cmd_set_scanout(VirtIOGPU *g, cmd->error = VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID; return; } - qemu_console_resize(g->scanout[ss.scanout_id].con, - ss.r.width, ss.r.height); - virgl_renderer_force_ctx_0(); - dpy_gl_scanout(g->scanout[ss.scanout_id].con, info.tex_id, - info.flags & 1 /* FIXME: Y_0_TOP */, - info.width, info.height, - ss.r.x, ss.r.y, ss.r.width, ss.r.height); - } else { - if (ss.scanout_id != 0) { - dpy_gfx_replace_surface(g->scanout[ss.scanout_id].con, NULL); - } - dpy_gl_scanout(g->scanout[ss.scanout_id].con, 0, false, - 0, 0, 0, 0, 0, 0); + + msg.u.ss.tex_id = info.tex_id; + msg.u.ss.width = info.width; + msg.u.ss.height = info.height; + msg.u.ss.flags = info.flags; + msg.u.ss.resource_id = ss.resource_id; } - g->scanout[ss.scanout_id].resource_id = ss.resource_id; + virtio_gpu_do_set_scanout(g, &msg.u.ss); } static void virgl_cmd_submit_3d(VirtIOGPU *g, diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h index 270aaf5..85d554d 100644 --- a/include/hw/virtio/virtio-gpu.h +++ b/include/hw/virtio/virtio-gpu.h @@ -83,6 +83,26 @@ struct virtio_gpu_ctrl_command { QTAILQ_ENTRY(virtio_gpu_ctrl_command) next; }; +struct virtio_gpu_thread_msg { + uint32_t id; + union { + struct virtio_gpu_set_scanout_info { + struct virtio_gpu_rect r; + uint32_t idx; + uint32_t tex_id; + uint32_t flags; + uint32_t resource_id; + uint32_t width; + uint32_t height; + } ss; + struct virtio_gpu_thread_flush { + struct virtio_gpu_rect r; + int num_flushes; + uint32_t idx[VIRTIO_GPU_MAX_SCANOUTS]; + } fl; + } u; +}; + typedef struct VirtIOGPU { VirtIODevice parent_obj;