Skip to content

Commit 6ea38ea

Browse files
committed
Share PeSigScanner and use in RenderTargetHdrEnabler because of ReShade.
1 parent 7f52777 commit 6ea38ea

File tree

5 files changed

+28
-25
lines changed

5 files changed

+28
-25
lines changed

Penumbra/Interop/Hooks/PostProcessing/RenderTargetHdrEnabler.cs

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using FFXIVClientStructs.FFXIV.Client.Graphics.Render;
88
using OtterGui.Services;
99
using Penumbra.GameData;
10+
using Penumbra.Interop.Hooks.ResourceLoading;
1011
using Penumbra.Services;
1112

1213
namespace Penumbra.Interop.Hooks.PostProcessing;
@@ -31,19 +32,23 @@ private static readonly IComparer<ForcedTextureConfig> ForcedTextureConfigCompar
3132

3233
public TextureReportRecord[]? TextureReport { get; private set; }
3334

34-
[Signature(Sigs.RenderTargetManagerInitialize, DetourName = nameof(RenderTargetManagerInitializeDetour))]
35-
private readonly Hook<RenderTargetManagerInitializeFunc> _renderTargetManagerInitialize = null!;
36-
37-
[Signature(Sigs.DeviceCreateTexture2D, DetourName = nameof(CreateTexture2DDetour))]
38-
private readonly Hook<CreateTexture2DFunc> _createTexture2D = null!;
35+
private readonly Hook<RenderTargetManagerInitializeFunc>? _renderTargetManagerInitialize;
36+
private readonly Hook<CreateTexture2DFunc>? _createTexture2D;
3937

4038
public RenderTargetHdrEnabler(IGameInteropProvider interop, Configuration config, IDalamudPluginInterface pi,
41-
DalamudConfigService dalamudConfig)
39+
DalamudConfigService dalamudConfig, PeSigScanner peScanner)
4240
{
4341
_config = config;
44-
interop.InitializeFromAttributes(this);
45-
if (config.HdrRenderTargets && !HookOverrides.Instance.PostProcessing.RenderTargetManagerInitialize)
46-
_renderTargetManagerInitialize.Enable();
42+
if (peScanner.TryScanText(Sigs.RenderTargetManagerInitialize, out var initializeAddress)
43+
&& peScanner.TryScanText(Sigs.DeviceCreateTexture2D, out var createAddress))
44+
{
45+
_renderTargetManagerInitialize =
46+
interop.HookFromAddress<RenderTargetManagerInitializeFunc>(initializeAddress, RenderTargetManagerInitializeDetour);
47+
_createTexture2D = interop.HookFromAddress<CreateTexture2DFunc>(createAddress, CreateTexture2DDetour);
48+
49+
if (config.HdrRenderTargets && !HookOverrides.Instance.PostProcessing.RenderTargetManagerInitialize)
50+
_renderTargetManagerInitialize.Enable();
51+
}
4752

4853
_share = pi.GetOrCreateData("Penumbra.RenderTargetHDR.V1", () =>
4954
{
@@ -87,19 +92,19 @@ public void Dispose()
8792

8893
private void Dispose(bool _)
8994
{
90-
_createTexture2D.Dispose();
91-
_renderTargetManagerInitialize.Dispose();
95+
_createTexture2D?.Dispose();
96+
_renderTargetManagerInitialize?.Dispose();
9297
}
9398

9499
private nint RenderTargetManagerInitializeDetour(RenderTargetManager* @this)
95100
{
96-
_createTexture2D.Enable();
101+
_createTexture2D!.Enable();
97102
_share.Item5[0] = true;
98103
_textureIndices.Value = new TextureIndices(0, 0);
99104
_textures.Value = _config.DebugMode ? [] : null;
100105
try
101106
{
102-
return _renderTargetManagerInitialize.Original(@this);
107+
return _renderTargetManagerInitialize!.Original(@this);
103108
}
104109
finally
105110
{
@@ -133,7 +138,7 @@ private nint RenderTargetManagerInitializeDetour(RenderTargetManager* @this)
133138
_textureIndices.Value = indices;
134139
}
135140

136-
var texture = _createTexture2D.Original(@this, size, mipLevel, textureFormat, flags, unk);
141+
var texture = _createTexture2D!.Original(@this, size, mipLevel, textureFormat, flags, unk);
137142
if (_textures.IsValueCreated)
138143
_textures.Value?.Add((nint)texture, (indices.CreationOrder - 1, originalTextureFormat));
139144
return texture;

Penumbra/Interop/Hooks/ResourceLoading/PapHandler.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
namespace Penumbra.Interop.Hooks.ResourceLoading;
44

5-
public sealed class PapHandler(PapRewriter.PapResourceHandlerPrototype papResourceHandler) : IDisposable
5+
public sealed class PapHandler(PeSigScanner sigScanner, PapRewriter.PapResourceHandlerPrototype papResourceHandler) : IDisposable
66
{
7-
private readonly PapRewriter _papRewriter = new(papResourceHandler);
7+
private readonly PapRewriter _papRewriter = new(sigScanner, papResourceHandler);
88

99
public void Enable()
1010
{

Penumbra/Interop/Hooks/ResourceLoading/PapRewriter.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,20 @@
77

88
namespace Penumbra.Interop.Hooks.ResourceLoading;
99

10-
public sealed class PapRewriter(PapRewriter.PapResourceHandlerPrototype papResourceHandler) : IDisposable
10+
public sealed class PapRewriter(PeSigScanner sigScanner, PapRewriter.PapResourceHandlerPrototype papResourceHandler) : IDisposable
1111
{
1212
public unsafe delegate int PapResourceHandlerPrototype(void* self, byte* path, int length);
1313

14-
private readonly PeSigScanner _scanner = new();
1514
private readonly Dictionary<nint, AsmHook> _hooks = [];
1615
private readonly Dictionary<(nint, Register, ulong), nint> _nativeAllocPaths = [];
1716
private readonly List<nint> _nativeAllocCaves = [];
1817

1918
public void Rewrite(string sig, string name)
2019
{
21-
if (!_scanner.TryScanText(sig, out var address))
20+
if (!sigScanner.TryScanText(sig, out var address))
2221
throw new Exception($"Signature for {name} [{sig}] could not be found.");
2322

24-
var funcInstructions = _scanner.GetFunctionInstructions(address).ToArray();
23+
var funcInstructions = sigScanner.GetFunctionInstructions(address).ToArray();
2524
var hookPoints = ScanPapHookPoints(funcInstructions).ToList();
2625

2726
foreach (var hookPoint in hookPoints)
@@ -165,8 +164,6 @@ private static unsafe void NativeFree(nint mem)
165164

166165
public void Dispose()
167166
{
168-
_scanner.Dispose();
169-
170167
foreach (var hook in _hooks.Values)
171168
{
172169
hook.Disable();

Penumbra/Interop/Hooks/ResourceLoading/PeSigScanner.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
using System.IO.MemoryMappedFiles;
22
using Iced.Intel;
3+
using OtterGui.Services;
34
using PeNet;
45
using Decoder = Iced.Intel.Decoder;
56

67
namespace Penumbra.Interop.Hooks.ResourceLoading;
78

89
// A good chunk of this was blatantly stolen from Dalamud's SigScanner 'cause Winter could not be faffed, Winter will definitely not rewrite it later
9-
public unsafe class PeSigScanner : IDisposable
10+
public unsafe class PeSigScanner : IDisposable, IService
1011
{
1112
private readonly MemoryMappedFile _file;
1213
private readonly MemoryMappedViewAccessor _textSection;

Penumbra/Interop/Hooks/ResourceLoading/ResourceLoader.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public unsafe class ResourceLoader : IDisposable, IService
2222
private ResolveData _resolvedData = ResolveData.Invalid;
2323
public event Action<Utf8GamePath, FullPath?, ResolveData>? PapRequested;
2424

25-
public ResourceLoader(ResourceService resources, FileReadService fileReadService, RsfService rsfService, Configuration config)
25+
public ResourceLoader(ResourceService resources, FileReadService fileReadService, RsfService rsfService, Configuration config, PeSigScanner sigScanner)
2626
{
2727
_resources = resources;
2828
_fileReadService = fileReadService;
@@ -35,7 +35,7 @@ public ResourceLoader(ResourceService resources, FileReadService fileReadService
3535
_resources.ResourceHandleDecRef += DecRefProtection;
3636
_fileReadService.ReadSqPack += ReadSqPackDetour;
3737

38-
_papHandler = new PapHandler(PapResourceHandler);
38+
_papHandler = new PapHandler(sigScanner, PapResourceHandler);
3939
_papHandler.Enable();
4040
}
4141

0 commit comments

Comments
 (0)