diff --git a/Penumbra/Interop/Hooks/PostProcessing/RenderTargetHdrEnabler.cs b/Penumbra/Interop/Hooks/PostProcessing/RenderTargetHdrEnabler.cs
index 80106fc9..b7ae771b 100644
--- a/Penumbra/Interop/Hooks/PostProcessing/RenderTargetHdrEnabler.cs
+++ b/Penumbra/Interop/Hooks/PostProcessing/RenderTargetHdrEnabler.cs
@@ -14,8 +14,8 @@ public unsafe class RenderTargetHdrEnabler : IService, IDisposable
/// This array must be sorted by CreationOrder ascending.
private static readonly ImmutableArray ForcedTextureConfigs =
[
- new(9, TextureFormat.R16G16B16A16_FLOAT, "Opaque Diffuse GBuffer"),
- new(10, TextureFormat.R16G16B16A16_FLOAT, "Semitransparent Diffuse GBuffer"),
+ new ForcedTextureConfig(9, TextureFormat.R16G16B16A16_FLOAT, "Opaque Diffuse GBuffer"),
+ new ForcedTextureConfig(10, TextureFormat.R16G16B16A16_FLOAT, "Semitransparent Diffuse GBuffer"),
];
private static readonly IComparer ForcedTextureConfigComparer
@@ -23,16 +23,17 @@ public unsafe class RenderTargetHdrEnabler : IService, IDisposable
private readonly Configuration _config;
- private readonly ThreadLocal _textureIndices = new(() => new(-1, -1));
+ private readonly ThreadLocal _textureIndices = new(() => new TextureIndices(-1, -1));
+
private readonly ThreadLocal?> _textures = new(() => null);
public TextureReportRecord[]? TextureReport { get; private set; }
[Signature(Sigs.RenderTargetManagerInitialize, DetourName = nameof(RenderTargetManagerInitializeDetour))]
- private Hook _renderTargetManagerInitialize = null!;
+ private readonly Hook _renderTargetManagerInitialize = null!;
[Signature(Sigs.DeviceCreateTexture2D, DetourName = nameof(CreateTexture2DDetour))]
- private Hook _createTexture2D = null!;
+ private readonly Hook _createTexture2D = null!;
public RenderTargetHdrEnabler(IGameInteropProvider interop, Configuration config)
{
@@ -47,7 +48,7 @@ public unsafe class RenderTargetHdrEnabler : IService, IDisposable
public static ForcedTextureConfig? GetForcedTextureConfig(int creationOrder)
{
- var i = ForcedTextureConfigs.BinarySearch(new(creationOrder, 0, string.Empty), ForcedTextureConfigComparer);
+ var i = ForcedTextureConfigs.BinarySearch(new ForcedTextureConfig(creationOrder, 0, string.Empty), ForcedTextureConfigComparer);
return i >= 0 ? ForcedTextureConfigs[i] : null;
}
@@ -59,10 +60,6 @@ public unsafe class RenderTargetHdrEnabler : IService, IDisposable
private void Dispose(bool _)
{
- _renderTargetManagerInitialize.Disable();
- if (_createTexture2D.IsEnabled)
- _createTexture2D.Disable();
-
_createTexture2D.Dispose();
_renderTargetManagerInitialize.Dispose();
}
@@ -70,8 +67,8 @@ public unsafe class RenderTargetHdrEnabler : IService, IDisposable
private nint RenderTargetManagerInitializeDetour(RenderTargetManager* @this)
{
_createTexture2D.Enable();
- _textureIndices.Value = new(0, 0);
- _textures.Value = _config.DebugMode ? [] : null;
+ _textureIndices.Value = new TextureIndices(0, 0);
+ _textures.Value = _config.DebugMode ? [] : null;
try
{
return _renderTargetManagerInitialize.Original(@this);
@@ -80,10 +77,11 @@ public unsafe class RenderTargetHdrEnabler : IService, IDisposable
{
if (_textures.Value != null)
{
- TextureReport = CreateTextureReport(@this, _textures.Value);
+ TextureReport = CreateTextureReport(@this, _textures.Value);
_textures.Value = null;
}
- _textureIndices.Value = new(-1, -1);
+
+ _textureIndices.Value = new TextureIndices(-1, -1);
_createTexture2D.Disable();
}
}
@@ -92,9 +90,10 @@ public unsafe class RenderTargetHdrEnabler : IService, IDisposable
Device* @this, int* size, byte mipLevel, uint textureFormat, uint flags, uint unk)
{
var originalTextureFormat = textureFormat;
- var indices = _textureIndices.IsValueCreated ? _textureIndices.Value : new(-1, -1);
- if (indices.ConfigIndex >= 0 && indices.ConfigIndex < ForcedTextureConfigs.Length &&
- ForcedTextureConfigs[indices.ConfigIndex].CreationOrder == indices.CreationOrder)
+ var indices = _textureIndices.IsValueCreated ? _textureIndices.Value : new TextureIndices(-1, -1);
+ if (indices.ConfigIndex >= 0
+ && indices.ConfigIndex < ForcedTextureConfigs.Length
+ && ForcedTextureConfigs[indices.ConfigIndex].CreationOrder == indices.CreationOrder)
{
var config = ForcedTextureConfigs[indices.ConfigIndex++];
textureFormat = (uint)config.ForcedTextureFormat;
@@ -112,15 +111,17 @@ public unsafe class RenderTargetHdrEnabler : IService, IDisposable
return texture;
}
- private static TextureReportRecord[] CreateTextureReport(RenderTargetManager* renderTargetManager, Dictionary textures)
+ private static TextureReportRecord[] CreateTextureReport(RenderTargetManager* renderTargetManager,
+ Dictionary textures)
{
var rtmTextures = new Span(renderTargetManager, sizeof(RenderTargetManager) / sizeof(nint));
- var report = new List();
+ var report = new List();
for (var i = 0; i < rtmTextures.Length; ++i)
{
if (textures.TryGetValue(rtmTextures[i], out var texture))
- report.Add(new(i * sizeof(nint), texture.TextureIndex, (TextureFormat)texture.TextureFormat));
+ report.Add(new TextureReportRecord(i * sizeof(nint), texture.TextureIndex, (TextureFormat)texture.TextureFormat));
}
+
return report.ToArray();
}
diff --git a/Penumbra/Interop/Hooks/PostProcessing/ShaderReplacementFixer.cs b/Penumbra/Interop/Hooks/PostProcessing/ShaderReplacementFixer.cs
index 3b41e752..f70ea06e 100644
--- a/Penumbra/Interop/Hooks/PostProcessing/ShaderReplacementFixer.cs
+++ b/Penumbra/Interop/Hooks/PostProcessing/ShaderReplacementFixer.cs
@@ -64,8 +64,6 @@ public sealed unsafe class ShaderReplacementFixer : IDisposable, IRequiredServic
private readonly ResourceHandleDestructor _resourceHandleDestructor;
private readonly CommunicatorService _communicator;
- private readonly CharacterUtility _utility;
- private readonly ModelRenderer _modelRenderer;
private readonly HumanSetupScalingHook _humanSetupScalingHook;
private readonly ModdedShaderPackageState _skinState;
@@ -111,31 +109,31 @@ public sealed unsafe class ShaderReplacementFixer : IDisposable, IRequiredServic
CommunicatorService communicator, HookManager hooks, CharacterBaseVTables vTables, HumanSetupScalingHook humanSetupScalingHook)
{
_resourceHandleDestructor = resourceHandleDestructor;
- _utility = utility;
- _modelRenderer = modelRenderer;
- _communicator = communicator;
- _humanSetupScalingHook = humanSetupScalingHook;
+ var utility1 = utility;
+ var modelRenderer1 = modelRenderer;
+ _communicator = communicator;
+ _humanSetupScalingHook = humanSetupScalingHook;
_skinState = new ModdedShaderPackageState(
- () => (ShaderPackageResourceHandle**)&_utility.Address->SkinShpkResource,
- () => (ShaderPackageResourceHandle*)_utility.DefaultSkinShpkResource);
+ () => (ShaderPackageResourceHandle**)&utility1.Address->SkinShpkResource,
+ () => (ShaderPackageResourceHandle*)utility1.DefaultSkinShpkResource);
_characterStockingsState = new ModdedShaderPackageState(
- () => (ShaderPackageResourceHandle**)&_utility.Address->CharacterStockingsShpkResource,
- () => (ShaderPackageResourceHandle*)_utility.DefaultCharacterStockingsShpkResource);
+ () => (ShaderPackageResourceHandle**)&utility1.Address->CharacterStockingsShpkResource,
+ () => (ShaderPackageResourceHandle*)utility1.DefaultCharacterStockingsShpkResource);
_characterLegacyState = new ModdedShaderPackageState(
- () => (ShaderPackageResourceHandle**)&_utility.Address->CharacterLegacyShpkResource,
- () => (ShaderPackageResourceHandle*)_utility.DefaultCharacterLegacyShpkResource);
- _irisState = new ModdedShaderPackageState(() => _modelRenderer.IrisShaderPackage, () => _modelRenderer.DefaultIrisShaderPackage);
- _characterGlassState = new ModdedShaderPackageState(() => _modelRenderer.CharacterGlassShaderPackage,
- () => _modelRenderer.DefaultCharacterGlassShaderPackage);
- _characterTransparencyState = new ModdedShaderPackageState(() => _modelRenderer.CharacterTransparencyShaderPackage,
- () => _modelRenderer.DefaultCharacterTransparencyShaderPackage);
- _characterTattooState = new ModdedShaderPackageState(() => _modelRenderer.CharacterTattooShaderPackage,
- () => _modelRenderer.DefaultCharacterTattooShaderPackage);
- _characterOcclusionState = new ModdedShaderPackageState(() => _modelRenderer.CharacterOcclusionShaderPackage,
- () => _modelRenderer.DefaultCharacterOcclusionShaderPackage);
+ () => (ShaderPackageResourceHandle**)&utility1.Address->CharacterLegacyShpkResource,
+ () => (ShaderPackageResourceHandle*)utility1.DefaultCharacterLegacyShpkResource);
+ _irisState = new ModdedShaderPackageState(() => modelRenderer1.IrisShaderPackage, () => modelRenderer1.DefaultIrisShaderPackage);
+ _characterGlassState = new ModdedShaderPackageState(() => modelRenderer1.CharacterGlassShaderPackage,
+ () => modelRenderer1.DefaultCharacterGlassShaderPackage);
+ _characterTransparencyState = new ModdedShaderPackageState(() => modelRenderer1.CharacterTransparencyShaderPackage,
+ () => modelRenderer1.DefaultCharacterTransparencyShaderPackage);
+ _characterTattooState = new ModdedShaderPackageState(() => modelRenderer1.CharacterTattooShaderPackage,
+ () => modelRenderer1.DefaultCharacterTattooShaderPackage);
+ _characterOcclusionState = new ModdedShaderPackageState(() => modelRenderer1.CharacterOcclusionShaderPackage,
+ () => modelRenderer1.DefaultCharacterOcclusionShaderPackage);
_hairMaskState =
- new ModdedShaderPackageState(() => _modelRenderer.HairMaskShaderPackage, () => _modelRenderer.DefaultHairMaskShaderPackage);
+ new ModdedShaderPackageState(() => modelRenderer1.HairMaskShaderPackage, () => modelRenderer1.DefaultHairMaskShaderPackage);
_humanSetupScalingHook.SetupReplacements += SetupHssReplacements;
_humanOnRenderMaterialHook = hooks.CreateHook("Human.OnRenderMaterial", vTables.HumanVTable[64],
@@ -463,6 +461,7 @@ public sealed unsafe class ShaderReplacementFixer : IDisposable, IRequiredServic
return mtrlResource;
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
private static int GetDataSetExpectedSize(uint dataFlags)
=> (dataFlags & 4) != 0
? ColorTable.Size + ((dataFlags & 8) != 0 ? ColorDyeTable.Size : 0)
@@ -471,7 +470,8 @@ public sealed unsafe class ShaderReplacementFixer : IDisposable, IRequiredServic
private Texture* PrepareColorTableDetour(MaterialResourceHandle* thisPtr, byte stain0Id, byte stain1Id)
{
if (thisPtr->DataSetSize < GetDataSetExpectedSize(thisPtr->DataFlags))
- Penumbra.Log.Warning($"Material at {thisPtr->FileName} has data set of size {thisPtr->DataSetSize} bytes, but should have at least {GetDataSetExpectedSize(thisPtr->DataFlags)} bytes. This may cause crashes due to access violations.");
+ Penumbra.Log.Warning(
+ $"Material at {thisPtr->FileName} has data set of size {thisPtr->DataSetSize} bytes, but should have at least {GetDataSetExpectedSize(thisPtr->DataFlags)} bytes. This may cause crashes due to access violations.");
// If we don't have any on-screen instances of modded characterlegacy.shpk, we don't need the slow path at all.
if (!Enabled || GetTotalMaterialCountForColorTable() == 0)