From c52d31d73be711055a9b445b62ec7809b3bf608d Mon Sep 17 00:00:00 2001 From: kuba Date: Sat, 3 Oct 2026 23:08:41 +0200 Subject: [PATCH] [Gpu] Materialize every fixed DCC clear code on a sampled image A DCC fast clear stays pending until the surface binds as a colour target; when a shader samples the surface first, only the clear-to-zero code was materialized. The other fixed codes (alpha 1, rgb 1, rgba 1) carry their own colour too. Silent Hill fast-clears UE's separate-translucency target to (0,0,0,1) and only samples it, so the post composite read stale zeros and the whole title-menu scene came out black. --- .../VideoOut/VulkanVideoPresenter.Rendering.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/SharpEmu.Libs/VideoOut/VulkanVideoPresenter.Rendering.cs b/src/SharpEmu.Libs/VideoOut/VulkanVideoPresenter.Rendering.cs index cafaa4d..e47f523 100644 --- a/src/SharpEmu.Libs/VideoOut/VulkanVideoPresenter.Rendering.cs +++ b/src/SharpEmu.Libs/VideoOut/VulkanVideoPresenter.Rendering.cs @@ -585,8 +585,13 @@ internal static unsafe partial class VulkanVideoPresenter var view = binding.Request.View; for (var layer = view.BaseLayer; layer < view.BaseLayer + view.LayerCount; layer++) { - var tracked = _imageCache.IsMetadataCleared(metadataAddress, layer, out var metadataValue) && (byte)metadataValue == DccClearToZero; + // Every fixed clear code carries its own colour; only the register code (0x20) needs + // the CB clear word, which is known when the surface binds as a target. Silent Hill + // fast-clears UE's separate-translucency target to (0,0,0,1) and only samples it: + // skipping that clear left stale zeros that blacked out the whole title-menu scene. var clearValue = default(ClearColorValue); + var tracked = _imageCache.IsMetadataCleared(metadataAddress, layer, out var metadataValue) && + TryDecodeDccClear((byte)metadataValue, false, (byte)metadataValue == DccClearToZero || fixedClearSupported, default, out clearValue); ulong guestSlice = 0; if (!tracked && (sliceSize == 0 || !_imageCache.TryReadGuestDccClear(metadataAddress, sliceSize, layer, out guestSlice, out var code) ||