feat(render): unify physical residency accounting

This commit is contained in:
Erik 2026-07-24 16:20:48 +02:00
parent 1866ea0c6d
commit 3e18fc2730
25 changed files with 642 additions and 48 deletions

View file

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using AcDream.Content;
using AcDream.App.Rendering.Residency;
using AcDream.Core.Rendering;
using DatReaderWriter;
using Microsoft.Extensions.Logging;
@ -108,7 +109,8 @@ public sealed class WbMeshAdapter : IDisposable, IWbMeshAdapter
preparedAssets: null,
logger,
AcDream.App.Rendering.ImmediateGpuResourceRetirementQueue.Instance,
ownsPreparedAssets: true)
ownsPreparedAssets: true,
ResidencyBudgetOptions.Default)
{
}
@ -123,21 +125,24 @@ public sealed class WbMeshAdapter : IDisposable, IWbMeshAdapter
preparedAssets: null,
logger,
resourceRetirement,
ownsPreparedAssets: true);
ownsPreparedAssets: true,
ResidencyBudgetOptions.Default);
internal WbMeshAdapter(
GL gl,
IDatReaderWriter dats,
IPreparedAssetSource preparedAssets,
ILogger<WbMeshAdapter> logger,
AcDream.App.Rendering.IGpuResourceRetirementQueue resourceRetirement)
AcDream.App.Rendering.IGpuResourceRetirementQueue resourceRetirement,
ResidencyBudgetOptions? budgets = null)
: this(
gl,
dats,
preparedAssets,
logger,
resourceRetirement,
ownsPreparedAssets: false)
ownsPreparedAssets: false,
budgets ?? ResidencyBudgetOptions.Default)
{
}
@ -147,11 +152,13 @@ public sealed class WbMeshAdapter : IDisposable, IWbMeshAdapter
IPreparedAssetSource? preparedAssets,
ILogger<WbMeshAdapter> logger,
AcDream.App.Rendering.IGpuResourceRetirementQueue resourceRetirement,
bool ownsPreparedAssets)
bool ownsPreparedAssets,
ResidencyBudgetOptions budgets)
{
ArgumentNullException.ThrowIfNull(gl);
ArgumentNullException.ThrowIfNull(dats);
ArgumentNullException.ThrowIfNull(logger);
ArgumentNullException.ThrowIfNull(budgets);
_resourceRetirement = resourceRetirement;
var resources = new AcDream.App.Rendering.ResourceCleanupGroup();
@ -192,7 +199,8 @@ public sealed class WbMeshAdapter : IDisposable, IWbMeshAdapter
meshManager = new ObjectMeshManager(
graphicsDevice,
resolvedPreparedAssets,
new ConsoleErrorLogger<ObjectMeshManager>());
new ConsoleErrorLogger<ObjectMeshManager>(),
budgets);
resources.Add("WB object mesh manager", meshManager.Dispose);
resources.TransferAll();
}
@ -210,6 +218,26 @@ public sealed class WbMeshAdapter : IDisposable, IWbMeshAdapter
: null;
}
internal void RegisterResidencySources(ResidencyManager manager)
{
ArgumentNullException.ThrowIfNull(manager);
ObjectMeshManager meshManager = _meshManager
?? throw new InvalidOperationException(
"An initialized mesh adapter is required for residency diagnostics.");
manager.RegisterDomainSource(new DelegateResidencyDomainSource(
ResidencyDomain.ObjectMeshes,
meshManager.CaptureObjectMeshResidency));
manager.RegisterDomainSource(new DelegateResidencyDomainSource(
ResidencyDomain.PreparedMeshCpu,
meshManager.CapturePreparedMeshResidency));
manager.RegisterDomainSource(new DelegateResidencyDomainSource(
ResidencyDomain.MeshStaging,
meshManager.CaptureStagingResidency));
manager.RegisterDomainSource(new DelegateResidencyDomainSource(
ResidencyDomain.GlobalMeshArena,
meshManager.CaptureGlobalArenaResidency));
}
/// <summary>
/// Minimal Console-backed logger that fires only on
/// <see cref="LogLevel.Error"/> and above. Format: