From patchwork Thu Jan 23 19:15:31 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= X-Patchwork-Id: 13948567 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7C4E1C0218C for ; Thu, 23 Jan 2025 19:17:12 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tb2gE-0007xN-Sc; Thu, 23 Jan 2025 14:15:54 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tb2gC-0007wY-1S for qemu-devel@nongnu.org; Thu, 23 Jan 2025 14:15:53 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tb2g9-000364-HF for qemu-devel@nongnu.org; Thu, 23 Jan 2025 14:15:51 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1737659746; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PLqQjC8lqdo0tOZ9lOt2v8qVNDxXWx9F20tIURmXr/M=; b=dhWfnMdLhTifp5WpEFiEOKPzTtRG60K06jq8WNF532ApbOhDU0isZFMD1VoDKJOo5ii4rv 61kJ7m/qrVYLluDLcIjHvvTwgwc3GRY39OgaLYQ4tXQOLmIo6/q3yhfqT3qkvELI2s8rAI 2k5zEyspNZEkXwXxZr1bqxczsaaibas= Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-108-IdTTRylQP-uGq2J7AsEAIQ-1; Thu, 23 Jan 2025 14:15:44 -0500 X-MC-Unique: IdTTRylQP-uGq2J7AsEAIQ-1 X-Mimecast-MFC-AGG-ID: IdTTRylQP-uGq2J7AsEAIQ Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 1EC2E1953942 for ; Thu, 23 Jan 2025 19:15:43 +0000 (UTC) Received: from toolbx.redhat.com (unknown [10.42.28.222]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 71EB03003E7F; Thu, 23 Jan 2025 19:15:41 +0000 (UTC) From: =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , "Michael S. Tsirkin" , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= Subject: [RFC 1/6] ui: add more cursor helper methods Date: Thu, 23 Jan 2025 19:15:31 +0000 Message-ID: <20250123191536.142753-2-berrange@redhat.com> In-Reply-To: <20250123191536.142753-1-berrange@redhat.com> References: <20250123191536.142753-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 Received-SPF: pass client-ip=170.10.133.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -50 X-Spam_score: -5.1 X-Spam_bar: ----- X-Spam_report: (-5.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-2.996, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.043, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org This adds helper methods to the QEMUCursor APIs for multiplying / unmultiplying the alpha channel into the RGB components; for swapping the RGB component order; for copying cursor objects; auto-freeing cursor objects. Signed-off-by: Daniel P. Berrangé --- include/ui/console.h | 6 ++++++ ui/cursor.c | 49 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/include/ui/console.h b/include/ui/console.h index 46b3128185..e5eb903feb 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -175,6 +175,12 @@ void cursor_set_mono(QEMUCursor *c, int transparent, uint8_t *mask); void cursor_get_mono_mask(QEMUCursor *c, int transparent, uint8_t *mask); +void cursor_multiply_alpha(QEMUCursor *c); +void cursor_unmultiply_alpha(QEMUCursor *c); +void cursor_swap_rgb(QEMUCursor *c); +QEMUCursor *cursor_copy(QEMUCursor *c); +G_DEFINE_AUTOPTR_CLEANUP_FUNC(QEMUCursor, cursor_unref); + typedef void *QEMUGLContext; typedef struct QEMUGLParams QEMUGLParams; diff --git a/ui/cursor.c b/ui/cursor.c index 6e23244fbe..536e022548 100644 --- a/ui/cursor.c +++ b/ui/cursor.c @@ -225,3 +225,52 @@ void cursor_get_mono_mask(QEMUCursor *c, int transparent, uint8_t *mask) mask += bpl; } } + +void cursor_multiply_alpha(QEMUCursor *c) +{ + int i; + + for (i = 0 ; i < (c->width * c->height); i++) { + guint8 *pixels = (guint8 *)c->data + (i * 4); + pixels[0] = (unsigned)pixels[0] * pixels[3] / 255; + pixels[1] = (unsigned)pixels[1] * pixels[3] / 255; + pixels[2] = (unsigned)pixels[2] * pixels[3] / 255; + } +} + +void cursor_unmultiply_alpha(QEMUCursor *c) +{ + int i; + + for (i = 0 ; i < (c->width * c->height); i++) { + guint8 *pixels = (guint8 *)c->data + (i * 4); + guint8 alpha = pixels[3] ? pixels[3] : 1; + pixels[0] = (unsigned)pixels[0] * 255 / alpha; + pixels[1] = (unsigned)pixels[1] * 255 / alpha; + pixels[2] = (unsigned)pixels[2] * 255 / alpha; + } +} + +void cursor_swap_rgb(QEMUCursor *c) +{ + int i; + + for (i = 0 ; i < (c->width * c->height); i++) { + guint8 *pixels = (guint8 *)c->data + (i * 4); + pixels[0] ^= pixels[2]; + pixels[2] ^= pixels[0]; + pixels[0] ^= pixels[2]; + } +} + +QEMUCursor *cursor_copy(QEMUCursor *c) +{ + QEMUCursor *ret = cursor_alloc(c->width, c->height); + + ret->hot_x = c->hot_x; + ret->hot_y = c->hot_y; + + memcpy(ret->data, c->data, c->width * c->height * 4); + + return ret; +} From patchwork Thu Jan 23 19:15:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= X-Patchwork-Id: 13948564 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id D8D02C0218C for ; Thu, 23 Jan 2025 19:16:54 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tb2gN-0007yE-QQ; Thu, 23 Jan 2025 14:16:03 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tb2gD-0007wz-FQ for qemu-devel@nongnu.org; Thu, 23 Jan 2025 14:15:53 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tb2gB-00038H-S4 for qemu-devel@nongnu.org; Thu, 23 Jan 2025 14:15:53 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1737659751; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=N6Q3/ZvwGnKPIed0NISz5czL39rUai5WaDH4OEu3vcU=; b=e7YIjpbKubMLVXcJYjk8sfUfQF9un5rcyhJL2x88Nhqj8As6veriZfwDW2SVKA0G867uqo 2iOOey3UqDpLgcQpP3b/I+wSe6nI/o+a3DzSMBqqf7bKUSC2Aa+xhb1Ys3EcCL0SRD0vYp wj2uCca2l93gK5HrWKD8Z1KfUxHTMPE= Received: from mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-546-r9iPV7fWOsO8V0pR0Q-ytA-1; Thu, 23 Jan 2025 14:15:47 -0500 X-MC-Unique: r9iPV7fWOsO8V0pR0Q-ytA-1 X-Mimecast-MFC-AGG-ID: r9iPV7fWOsO8V0pR0Q-ytA Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id E16501955DE2 for ; Thu, 23 Jan 2025 19:15:46 +0000 (UTC) Received: from toolbx.redhat.com (unknown [10.42.28.222]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 8906130001BE; Thu, 23 Jan 2025 19:15:43 +0000 (UTC) From: =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , "Michael S. Tsirkin" , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= Subject: [RFC 2/6] hw/display/virtio-gpu.c: reverse alpha pre-multiplication Date: Thu, 23 Jan 2025 19:15:32 +0000 Message-ID: <20250123191536.142753-3-berrange@redhat.com> In-Reply-To: <20250123191536.142753-1-berrange@redhat.com> References: <20250123191536.142753-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 Received-SPF: pass client-ip=170.10.133.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -50 X-Spam_score: -5.1 X-Spam_bar: ----- X-Spam_report: (-5.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-2.996, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.043, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org The cursor data we receive from the guest has had the alpha channel pre-multiplied into the RGB components. Reverse this before passing the cursor onto the backends. Without doing this, areas of the cursor with alpha are much less saturated than they are intended to be. This effect is visible with the SDL and GTK backends, but was masked with the VNC backend since that forget to apply pre-multiplication with its alpha cursor encoding thus cancelling out the virtio-gpu problem. Signed-off-by: Daniel P. Berrangé --- hw/display/virtio-gpu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c index 11a7a85750..156d4e0b9b 100644 --- a/hw/display/virtio-gpu.c +++ b/hw/display/virtio-gpu.c @@ -102,6 +102,7 @@ static void update_cursor(VirtIOGPU *g, struct virtio_gpu_update_cursor *cursor) if (cursor->resource_id > 0) { vgc->update_cursor_data(g, s, cursor->resource_id); + cursor_unmultiply_alpha(s->current_cursor); } dpy_cursor_define(s->con, s->current_cursor); From patchwork Thu Jan 23 19:15:33 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= X-Patchwork-Id: 13948569 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id D7C1AC0218C for ; Thu, 23 Jan 2025 19:17:16 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tb2gn-0007z3-KF; Thu, 23 Jan 2025 14:16:31 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tb2gK-0007xw-VQ for qemu-devel@nongnu.org; Thu, 23 Jan 2025 14:16:02 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tb2gJ-0003D6-4H for qemu-devel@nongnu.org; Thu, 23 Jan 2025 14:16:00 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1737659758; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+mNH993fdWICNMOHzJhcl16ztwX76WpactV8qF/6ojw=; b=VDDHMrkcS2a/IGylmg+S8Z4krtbcXJxNVSCpIGm77DwxyrEuTUNSBpAnP21P83XEOd5FcN WZfqEAWHOPgF8/MafXOLSMiPNfXsvxHINDTf0U4AUmilZl1WZKQ/yFrCk1GPTre81KP3gJ LWKc8fmExRwbIHERfQFI5iaJ4xZXemQ= Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-635-bIiyXE0NMj6GzB-voBbI4g-1; Thu, 23 Jan 2025 14:15:56 -0500 X-MC-Unique: bIiyXE0NMj6GzB-voBbI4g-1 X-Mimecast-MFC-AGG-ID: bIiyXE0NMj6GzB-voBbI4g Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 73FBD1955E88 for ; Thu, 23 Jan 2025 19:15:50 +0000 (UTC) Received: from toolbx.redhat.com (unknown [10.42.28.222]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 7DA8530001BE; Thu, 23 Jan 2025 19:15:47 +0000 (UTC) From: =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , "Michael S. Tsirkin" , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= Subject: [RFC 3/6] hw/display/virtio-gpu: fix pixel ordering from BGRA8888 to RGBA8888 Date: Thu, 23 Jan 2025 19:15:33 +0000 Message-ID: <20250123191536.142753-4-berrange@redhat.com> In-Reply-To: <20250123191536.142753-1-berrange@redhat.com> References: <20250123191536.142753-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -50 X-Spam_score: -5.1 X-Spam_bar: ----- X-Spam_report: (-5.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-2.996, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Currently both the VNC and GTK displays are rendering coloured cursors with RGB components reversed. This originates with the data received from the guest, so virtio-gpu must reverse this again to get it back to the natural RGBA8888 order expected by backends. Signed-off-by: Daniel P. Berrangé --- hw/display/virtio-gpu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c index 156d4e0b9b..9952658df2 100644 --- a/hw/display/virtio-gpu.c +++ b/hw/display/virtio-gpu.c @@ -103,6 +103,7 @@ static void update_cursor(VirtIOGPU *g, struct virtio_gpu_update_cursor *cursor) if (cursor->resource_id > 0) { vgc->update_cursor_data(g, s, cursor->resource_id); cursor_unmultiply_alpha(s->current_cursor); + cursor_swap_rgb(s->current_cursor); } dpy_cursor_define(s->con, s->current_cursor); From patchwork Thu Jan 23 19:15:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= X-Patchwork-Id: 13948568 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 3A761C0218D for ; Thu, 23 Jan 2025 19:17:15 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tb2gq-00080h-3s; Thu, 23 Jan 2025 14:16:32 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tb2gJ-0007xu-P7 for qemu-devel@nongnu.org; Thu, 23 Jan 2025 14:16:01 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tb2gI-0003Cr-8e for qemu-devel@nongnu.org; Thu, 23 Jan 2025 14:15:59 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1737659756; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Z4idOmdaT2Lwr+HmD5ha5reAkr+A38GhsY764Z9KdUw=; b=hVnoCmibeVcCZdKQCj5EmqVIssg4RKBBD6yMpuEwbI/caTPTpCkAFD33RIeXxkJP3f+hy6 GcUkKGg4K5ANql++tyKvlQyxzSY6jRdd6uV/FwGalZFkcelGDzbOF/SGyotH9ZT/Q6Tjjd p5thsb7mTYmLUEa0dkLWWPrqW+cm9ro= Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-114-5_8EwfKSNxyP7Zr-CiQHrQ-1; Thu, 23 Jan 2025 14:15:54 -0500 X-MC-Unique: 5_8EwfKSNxyP7Zr-CiQHrQ-1 X-Mimecast-MFC-AGG-ID: 5_8EwfKSNxyP7Zr-CiQHrQ Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 2FE46195608B for ; Thu, 23 Jan 2025 19:15:53 +0000 (UTC) Received: from toolbx.redhat.com (unknown [10.42.28.222]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id D8B163003FD3; Thu, 23 Jan 2025 19:15:50 +0000 (UTC) From: =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , "Michael S. Tsirkin" , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= Subject: [RFC 4/6] ui/vnc: pre-multiply alpha with alpha cursor Date: Thu, 23 Jan 2025 19:15:34 +0000 Message-ID: <20250123191536.142753-5-berrange@redhat.com> In-Reply-To: <20250123191536.142753-1-berrange@redhat.com> References: <20250123191536.142753-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 Received-SPF: pass client-ip=170.10.133.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -50 X-Spam_score: -5.1 X-Spam_bar: ----- X-Spam_report: (-5.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-2.996, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.043, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org The RFB specification for the alpha cursor encoding requires that the alpha channel is pre-multiplied into the RGB components. This worked by luck previously since the virtio-gpu device was not reversing the pre-multiplication on data received from the guest. Now virtio-gpu is fixed, the VNC server must apply pre-multiplication itself. Signed-off-by: Daniel P. Berrangé --- ui/vnc.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ui/vnc.c b/ui/vnc.c index 9241caaad9..5ffb50109d 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -996,6 +996,7 @@ static int vnc_cursor_define(VncState *vs) } if (vnc_has_feature(vs, VNC_FEATURE_ALPHA_CURSOR)) { + g_autoptr(QEMUCursor) tmpc = cursor_copy(c); vnc_lock_output(vs); vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE); vnc_write_u8(vs, 0); /* padding */ @@ -1003,7 +1004,11 @@ static int vnc_cursor_define(VncState *vs) vnc_framebuffer_update(vs, c->hot_x, c->hot_y, c->width, c->height, VNC_ENCODING_ALPHA_CURSOR); vnc_write_s32(vs, VNC_ENCODING_RAW); - vnc_write(vs, c->data, c->width * c->height * 4); + + // Alpha is required to be pre-multiplied into RGB components + cursor_multiply_alpha(tmpc); + + vnc_write(vs, tmpc->data, c->width * c->height * 4); vnc_unlock_output(vs); return 0; } From patchwork Thu Jan 23 19:15:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= X-Patchwork-Id: 13948566 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id E0A56C02182 for ; Thu, 23 Jan 2025 19:17:11 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tb2gp-0007z7-C2; Thu, 23 Jan 2025 14:16:31 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tb2gK-0007xv-C7 for qemu-devel@nongnu.org; Thu, 23 Jan 2025 14:16:01 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tb2gI-0003D4-Rh for qemu-devel@nongnu.org; Thu, 23 Jan 2025 14:16:00 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1737659757; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=GSMHnQ0UwvJD5TIVkw1wFllAM/T0myUxbmcejTHwe3Y=; b=YhYCCiCvNpunBnXfPKhwcm6Qwj/BMj8DULHCADkklCM3mFx/nAsGtEKvPeWR6Jah4xY+a8 liNijzr12EnQl3O7F7mXxecYppcL2Czga21DyvSRUoUWBP1x0Z/Hm6i/KH9KcH7H8uyL36 RZT600J64LXaSVHlht2Hl2eKY+8HwLs= Received: from mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-509-K1ky4SWjOLKkztVSPMrQpw-1; Thu, 23 Jan 2025 14:15:56 -0500 X-MC-Unique: K1ky4SWjOLKkztVSPMrQpw-1 X-Mimecast-MFC-AGG-ID: K1ky4SWjOLKkztVSPMrQpw Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id B27031955DDE for ; Thu, 23 Jan 2025 19:15:55 +0000 (UTC) Received: from toolbx.redhat.com (unknown [10.42.28.222]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 86BC03003E7F; Thu, 23 Jan 2025 19:15:53 +0000 (UTC) From: =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , "Michael S. Tsirkin" , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= Subject: [RFC 5/6] ui/sdl: load cursor in RGBA8888 format not BGRA8888 Date: Thu, 23 Jan 2025 19:15:35 +0000 Message-ID: <20250123191536.142753-6-berrange@redhat.com> In-Reply-To: <20250123191536.142753-1-berrange@redhat.com> References: <20250123191536.142753-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -50 X-Spam_score: -5.1 X-Spam_bar: ----- X-Spam_report: (-5.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-2.996, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org The SDL code was loading cursor data in BGRA8888 format which masked the problem with virtio-gpu not supplying data in RGBA8888 format. Now that virtio-gpu is fixed, the SDL code needs to be fixed to match. Signed-off-by: Daniel P. Berrangé --- ui/sdl2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/sdl2.c b/ui/sdl2.c index 445eb1dd9f..2d56b4d174 100644 --- a/ui/sdl2.c +++ b/ui/sdl2.c @@ -772,7 +772,7 @@ static void sdl_mouse_define(DisplayChangeListener *dcl, guest_sprite_surface = SDL_CreateRGBSurfaceFrom(c->data, c->width, c->height, 32, c->width * 4, - 0xff0000, 0x00ff00, 0xff, 0xff000000); + 0xff, 0x00ff00, 0xff0000, 0xff000000); if (!guest_sprite_surface) { fprintf(stderr, "Failed to make rgb surface from %p\n", c); From patchwork Thu Jan 23 19:15:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= X-Patchwork-Id: 13948565 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B6904C02182 for ; Thu, 23 Jan 2025 19:16:54 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tb2gr-00080z-Hk; Thu, 23 Jan 2025 14:16:33 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tb2gQ-0007yg-CO for qemu-devel@nongnu.org; Thu, 23 Jan 2025 14:16:08 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tb2gN-0003EG-N9 for qemu-devel@nongnu.org; Thu, 23 Jan 2025 14:16:05 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1737659762; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fUzh2DOHWU3dRkxF9LEi+/CI5yJwg3mvs9zUxaVcn44=; b=GYZjZ2SO5JYoLkMwROgRJnvRfEC03ga+X6fCkUkzIPMbwI3BX04AKF933fuiOj2iziBJuc xmF7PNeEOym4PQuE3FuLHdl4IpC2bOD52XiYFX8YBe1hElFjVXt4tWUBvcTglaiUoSq3/V AbR01eEdqM+yC8ziG4IzegdSy5P/XUk= Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-627-HA8aCHAwOUWswy7uC-_jsA-1; Thu, 23 Jan 2025 14:15:59 -0500 X-MC-Unique: HA8aCHAwOUWswy7uC-_jsA-1 X-Mimecast-MFC-AGG-ID: HA8aCHAwOUWswy7uC-_jsA Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id D8B591955E88 for ; Thu, 23 Jan 2025 19:15:58 +0000 (UTC) Received: from toolbx.redhat.com (unknown [10.42.28.222]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 35F4B30001BE; Thu, 23 Jan 2025 19:15:56 +0000 (UTC) From: =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , "Michael S. Tsirkin" , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= Subject: [RFC 6/6] ui: add ability to dump the raw cursor bytes Date: Thu, 23 Jan 2025 19:15:36 +0000 Message-ID: <20250123191536.142753-7-berrange@redhat.com> In-Reply-To: <20250123191536.142753-1-berrange@redhat.com> References: <20250123191536.142753-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -50 X-Spam_score: -5.1 X-Spam_bar: ----- X-Spam_report: (-5.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-2.996, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Signed-off-by: Daniel P. Berrangé --- hw/display/virtio-gpu.c | 1 + include/ui/console.h | 1 + ui/cursor.c | 21 +++++++++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c index 9952658df2..84836f52c4 100644 --- a/hw/display/virtio-gpu.c +++ b/hw/display/virtio-gpu.c @@ -102,6 +102,7 @@ static void update_cursor(VirtIOGPU *g, struct virtio_gpu_update_cursor *cursor) if (cursor->resource_id > 0) { vgc->update_cursor_data(g, s, cursor->resource_id); + cursor_dump_hex(s->current_cursor, "", 24, 24); cursor_unmultiply_alpha(s->current_cursor); cursor_swap_rgb(s->current_cursor); } diff --git a/include/ui/console.h b/include/ui/console.h index e5eb903feb..95b57b0e45 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -169,6 +169,7 @@ void cursor_unref(QEMUCursor *c); QEMUCursor *cursor_builtin_hidden(void); QEMUCursor *cursor_builtin_left_ptr(void); void cursor_print_ascii_art(QEMUCursor *c, const char *prefix); +void cursor_dump_hex(QEMUCursor *c, const char *prefix, int maxw, int maxh); int cursor_get_mono_bpl(QEMUCursor *c); void cursor_set_mono(QEMUCursor *c, uint32_t foreground, uint32_t background, uint8_t *image, diff --git a/ui/cursor.c b/ui/cursor.c index 536e022548..bc96307f3f 100644 --- a/ui/cursor.c +++ b/ui/cursor.c @@ -80,6 +80,27 @@ void cursor_print_ascii_art(QEMUCursor *c, const char *prefix) } } +void cursor_dump_hex(QEMUCursor *c, const char *prefix, int maxw, int maxh) +{ + uint8_t *data = (uint8_t *) c->data; + int x,y,v; + + maxw = MIN(maxw, c->width); + maxh = MIN(maxh, c->height); + + for (y = 0; y < maxh; y++) { + fprintf(stderr, "%s: %2d: |", prefix, y); + for (x = 0; x < maxw; x++) { + for (v = 0; v < 4 ; v++, data++) { + fprintf(stderr, "%02x", *data); + } + fprintf(stderr, " "); + } + data += (c->width - maxw) * 4; + fprintf(stderr, "|\n"); + } +} + QEMUCursor *cursor_builtin_hidden(void) { return cursor_parse_xpm(cursor_hidden_xpm);