From: Phil Dennis-Jordan <phil@philjordan.eu>
To: qemu-devel@nongnu.org, agraf@csgraf.de, pbonzini@redhat.com,
phil@philjordan.eu, marcandre.lureau@redhat.com,
berrange@redhat.com, thuth@redhat.com, philmd@linaro.org,
akihiko.odaki@daynix.com, peter.maydell@linaro.org
Subject: [PATCH v2 4/8] hw/display/apple-gfx: Implements texture syncing for non-UMA GPUs
Date: Wed, 17 Jul 2024 13:03:22 +0200 [thread overview]
Message-ID: <20240717110326.45230-5-phil@philjordan.eu> (raw)
In-Reply-To: <20240717110326.45230-1-phil@philjordan.eu>
Renderable Metal textures are handled differently depending on
whether the GPU uses a unified memory architecture (no physical
distinction between VRAM and system RAM, CPU and GPU share the
memory bus) or not. (Traditional discrete GPU with its own VRAM)
In the discrete GPU case, textures must be explicitly
synchronised to the CPU or the GPU before use after being
modified by the other. In this case, we sync after the PV
graphics framework has rendered the next frame into the
texture using the GPU so that we can read out its contents using
the CPU. This fixes the issue where the guest screen stayed
black on AMD Radeon GPUs.
Signed-off-by: Phil Dennis-Jordan <phil@philjordan.eu>
---
hw/display/apple-gfx.h | 1 +
hw/display/apple-gfx.m | 10 +++++++++-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/hw/display/apple-gfx.h b/hw/display/apple-gfx.h
index 9d6d40795e..995ecf7f4a 100644
--- a/hw/display/apple-gfx.h
+++ b/hw/display/apple-gfx.h
@@ -43,6 +43,7 @@ struct AppleGFXState {
/* The following fields should only be accessed from render_queue: */
bool gfx_update_requested;
bool new_frame_ready;
+ bool using_managed_texture_storage;
int32_t pending_frames;
void *vram;
DisplaySurface *surface;
diff --git a/hw/display/apple-gfx.m b/hw/display/apple-gfx.m
index b1a8a9f649..3756a9e3ff 100644
--- a/hw/display/apple-gfx.m
+++ b/hw/display/apple-gfx.m
@@ -129,7 +129,12 @@ static void apple_gfx_render_new_frame(AppleGFXState *s)
return;
}
[texture retain];
-
+ if (s->using_managed_texture_storage) {
+ /* "Managed" textures exist in both VRAM and RAM and must be synced. */
+ id<MTLBlitCommandEncoder> blit = [command_buffer blitCommandEncoder];
+ [blit synchronizeResource:texture];
+ [blit endEncoding];
+ }
[command_buffer retain];
[command_buffer addCompletedHandler:
^(id<MTLCommandBuffer> cb)
@@ -248,6 +253,9 @@ static void set_mode(AppleGFXState *s, uint32_t width, uint32_t height)
texture = [s->mtl newTextureWithDescriptor:textureDescriptor];
}
+ s->using_managed_texture_storage =
+ (texture.storageMode == MTLStorageModeManaged);
+
dispatch_sync(s->render_queue,
^{
id<MTLTexture> old_texture = nil;
--
2.39.3 (Apple Git-146)
next prev parent reply other threads:[~2024-07-17 11:06 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-17 11:03 [PATCH v2 0/8] hw/display/apple-gfx: New macOS PV Graphics device Phil Dennis-Jordan
2024-07-17 11:03 ` [PATCH v2 1/8] hw/display/apple-gfx: Introduce ParavirtualizedGraphics.Framework support Phil Dennis-Jordan
2024-07-17 11:03 ` [PATCH v2 2/8] hw/display/apple-gfx: Adds PCI implementation Phil Dennis-Jordan
2024-07-17 11:03 ` [PATCH v2 3/8] ui/cocoa: Adds non-app runloop on main thread mode Phil Dennis-Jordan
2024-07-17 11:03 ` Phil Dennis-Jordan [this message]
2024-07-17 11:03 ` [PATCH v2 5/8] hw/display/apple-gfx: Replaces magic number with queried MMIO length Phil Dennis-Jordan
2024-07-17 11:03 ` [PATCH v2 6/8] hw/display/apple-gfx: Host GPU picking improvements Phil Dennis-Jordan
2024-07-17 11:03 ` [PATCH v2 7/8] hw/display/apple-gfx: Adds configurable mode list Phil Dennis-Jordan
2024-07-17 11:03 ` [PATCH v2 8/8] MAINTAINERS: Add myself as maintainer for apple-gfx, reviewer for HVF Phil Dennis-Jordan
2024-07-20 14:42 ` [PATCH v2 0/8] hw/display/apple-gfx: New macOS PV Graphics device Akihiko Odaki
2024-07-20 15:16 ` Phil Dennis-Jordan
2024-07-20 16:06 ` Akihiko Odaki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240717110326.45230-5-phil@philjordan.eu \
--to=phil@philjordan.eu \
--cc=agraf@csgraf.de \
--cc=akihiko.odaki@daynix.com \
--cc=berrange@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).