[Profile] Count DCC metadata synchronizations and their outcome

This commit is contained in:
ParantezTech 2026-10-11 06:11:55 +03:00
parent e5c2755789
commit d4276d89f8
2 changed files with 14 additions and 0 deletions

View File

@ -11,6 +11,14 @@ namespace SharpEmu.Libs.Gpu.Images;
// Surface metadata (HTile, DCC, CMask, FMask) keyed by its guest address.
public sealed partial class GuestImageCache
{
private static long _dccSyncs;
private static long _dccSlicesUndecodable;
private static long _dccSlicesMixed;
private static long _dccSlicesCleared;
public static string TakeDccReport() => FormattableString.Invariant(
$"[PERF][DCC_SYNC] gpu_syncs={Interlocked.Exchange(ref _dccSyncs, 0)} cleared={Interlocked.Exchange(ref _dccSlicesCleared, 0)} mixed={Interlocked.Exchange(ref _dccSlicesMixed, 0)} undecodable={Interlocked.Exchange(ref _dccSlicesUndecodable, 0)}");
private unsafe void MaterializeDccClear(
ResourceSlotIdentifier imageIdentifier,
in ImageRequest request,
@ -96,6 +104,7 @@ public sealed partial class GuestImageCache
allowClearToRegister: request.Role == ImageRole.ColorTarget,
out var clear))
{
Interlocked.Increment(ref _dccSlicesUndecodable);
continue;
}
@ -126,9 +135,12 @@ public sealed partial class GuestImageCache
if (!uniform)
{
Interlocked.Increment(ref _dccSlicesMixed);
continue;
}
Interlocked.Increment(ref _dccSlicesCleared);
using (var held = _lock.Hold())
{
if (_slots.TryGet(imageIdentifier) == null)
@ -423,6 +435,7 @@ public sealed partial class GuestImageCache
var size = (ulong)layerCount * sliceSize;
if (IsValidRange(address, size) && _bufferCache.HasGpuDirtyBytes(address, size))
{
Interlocked.Increment(ref _dccSyncs);
_ = _bufferCache.TrySynchronizeCpuRead(address, size);
}
}

View File

@ -472,6 +472,7 @@ internal static class RenderPhaseProfile
Console.Error.WriteLine(SharpEmu.Libs.Gpu.Buffers.GuestBufferCache.TakeAsyncReadbackReport());
Console.Error.WriteLine(SharpEmu.Libs.Gpu.Vulkan.GpuSyncProfile.TakeReport());
Console.Error.WriteLine(SharpEmu.Libs.Gpu.Images.GuestImageCache.TakeLookupReport());
Console.Error.WriteLine(SharpEmu.Libs.Gpu.Images.GuestImageCache.TakeDccReport());
SharpEmu.ShaderCompiler.Resources.ResourceMaterializationProfile.WriteReport();
SharpEmu.Libs.Diagnostics.AgcRegisterPacketProfile.WriteReport();
SharpEmu.HLE.GpuMemory.GpuMemoryAccessProfile.WriteReport();