mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-12 10:17:22 +01:00
Share PeSigScanner and use in RenderTargetHdrEnabler because of ReShade.
This commit is contained in:
parent
7f52777fd4
commit
6ea38eac0a
5 changed files with 28 additions and 25 deletions
|
|
@ -7,6 +7,7 @@ using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel;
|
|||
using FFXIVClientStructs.FFXIV.Client.Graphics.Render;
|
||||
using OtterGui.Services;
|
||||
using Penumbra.GameData;
|
||||
using Penumbra.Interop.Hooks.ResourceLoading;
|
||||
using Penumbra.Services;
|
||||
|
||||
namespace Penumbra.Interop.Hooks.PostProcessing;
|
||||
|
|
@ -31,19 +32,23 @@ public unsafe class RenderTargetHdrEnabler : IService, IDisposable
|
|||
|
||||
public TextureReportRecord[]? TextureReport { get; private set; }
|
||||
|
||||
[Signature(Sigs.RenderTargetManagerInitialize, DetourName = nameof(RenderTargetManagerInitializeDetour))]
|
||||
private readonly Hook<RenderTargetManagerInitializeFunc> _renderTargetManagerInitialize = null!;
|
||||
|
||||
[Signature(Sigs.DeviceCreateTexture2D, DetourName = nameof(CreateTexture2DDetour))]
|
||||
private readonly Hook<CreateTexture2DFunc> _createTexture2D = null!;
|
||||
private readonly Hook<RenderTargetManagerInitializeFunc>? _renderTargetManagerInitialize;
|
||||
private readonly Hook<CreateTexture2DFunc>? _createTexture2D;
|
||||
|
||||
public RenderTargetHdrEnabler(IGameInteropProvider interop, Configuration config, IDalamudPluginInterface pi,
|
||||
DalamudConfigService dalamudConfig)
|
||||
DalamudConfigService dalamudConfig, PeSigScanner peScanner)
|
||||
{
|
||||
_config = config;
|
||||
interop.InitializeFromAttributes(this);
|
||||
if (config.HdrRenderTargets && !HookOverrides.Instance.PostProcessing.RenderTargetManagerInitialize)
|
||||
_renderTargetManagerInitialize.Enable();
|
||||
if (peScanner.TryScanText(Sigs.RenderTargetManagerInitialize, out var initializeAddress)
|
||||
&& peScanner.TryScanText(Sigs.DeviceCreateTexture2D, out var createAddress))
|
||||
{
|
||||
_renderTargetManagerInitialize =
|
||||
interop.HookFromAddress<RenderTargetManagerInitializeFunc>(initializeAddress, RenderTargetManagerInitializeDetour);
|
||||
_createTexture2D = interop.HookFromAddress<CreateTexture2DFunc>(createAddress, CreateTexture2DDetour);
|
||||
|
||||
if (config.HdrRenderTargets && !HookOverrides.Instance.PostProcessing.RenderTargetManagerInitialize)
|
||||
_renderTargetManagerInitialize.Enable();
|
||||
}
|
||||
|
||||
_share = pi.GetOrCreateData("Penumbra.RenderTargetHDR.V1", () =>
|
||||
{
|
||||
|
|
@ -87,19 +92,19 @@ public unsafe class RenderTargetHdrEnabler : IService, IDisposable
|
|||
|
||||
private void Dispose(bool _)
|
||||
{
|
||||
_createTexture2D.Dispose();
|
||||
_renderTargetManagerInitialize.Dispose();
|
||||
_createTexture2D?.Dispose();
|
||||
_renderTargetManagerInitialize?.Dispose();
|
||||
}
|
||||
|
||||
private nint RenderTargetManagerInitializeDetour(RenderTargetManager* @this)
|
||||
{
|
||||
_createTexture2D.Enable();
|
||||
_createTexture2D!.Enable();
|
||||
_share.Item5[0] = true;
|
||||
_textureIndices.Value = new TextureIndices(0, 0);
|
||||
_textures.Value = _config.DebugMode ? [] : null;
|
||||
try
|
||||
{
|
||||
return _renderTargetManagerInitialize.Original(@this);
|
||||
return _renderTargetManagerInitialize!.Original(@this);
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
|
@ -133,7 +138,7 @@ public unsafe class RenderTargetHdrEnabler : IService, IDisposable
|
|||
_textureIndices.Value = indices;
|
||||
}
|
||||
|
||||
var texture = _createTexture2D.Original(@this, size, mipLevel, textureFormat, flags, unk);
|
||||
var texture = _createTexture2D!.Original(@this, size, mipLevel, textureFormat, flags, unk);
|
||||
if (_textures.IsValueCreated)
|
||||
_textures.Value?.Add((nint)texture, (indices.CreationOrder - 1, originalTextureFormat));
|
||||
return texture;
|
||||
|
|
|
|||
|
|
@ -2,9 +2,9 @@
|
|||
|
||||
namespace Penumbra.Interop.Hooks.ResourceLoading;
|
||||
|
||||
public sealed class PapHandler(PapRewriter.PapResourceHandlerPrototype papResourceHandler) : IDisposable
|
||||
public sealed class PapHandler(PeSigScanner sigScanner, PapRewriter.PapResourceHandlerPrototype papResourceHandler) : IDisposable
|
||||
{
|
||||
private readonly PapRewriter _papRewriter = new(papResourceHandler);
|
||||
private readonly PapRewriter _papRewriter = new(sigScanner, papResourceHandler);
|
||||
|
||||
public void Enable()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -7,21 +7,20 @@ using Swan;
|
|||
|
||||
namespace Penumbra.Interop.Hooks.ResourceLoading;
|
||||
|
||||
public sealed class PapRewriter(PapRewriter.PapResourceHandlerPrototype papResourceHandler) : IDisposable
|
||||
public sealed class PapRewriter(PeSigScanner sigScanner, PapRewriter.PapResourceHandlerPrototype papResourceHandler) : IDisposable
|
||||
{
|
||||
public unsafe delegate int PapResourceHandlerPrototype(void* self, byte* path, int length);
|
||||
|
||||
private readonly PeSigScanner _scanner = new();
|
||||
private readonly Dictionary<nint, AsmHook> _hooks = [];
|
||||
private readonly Dictionary<(nint, Register, ulong), nint> _nativeAllocPaths = [];
|
||||
private readonly List<nint> _nativeAllocCaves = [];
|
||||
|
||||
public void Rewrite(string sig, string name)
|
||||
{
|
||||
if (!_scanner.TryScanText(sig, out var address))
|
||||
if (!sigScanner.TryScanText(sig, out var address))
|
||||
throw new Exception($"Signature for {name} [{sig}] could not be found.");
|
||||
|
||||
var funcInstructions = _scanner.GetFunctionInstructions(address).ToArray();
|
||||
var funcInstructions = sigScanner.GetFunctionInstructions(address).ToArray();
|
||||
var hookPoints = ScanPapHookPoints(funcInstructions).ToList();
|
||||
|
||||
foreach (var hookPoint in hookPoints)
|
||||
|
|
@ -165,8 +164,6 @@ public sealed class PapRewriter(PapRewriter.PapResourceHandlerPrototype papResou
|
|||
|
||||
public void Dispose()
|
||||
{
|
||||
_scanner.Dispose();
|
||||
|
||||
foreach (var hook in _hooks.Values)
|
||||
{
|
||||
hook.Disable();
|
||||
|
|
|
|||
|
|
@ -1,12 +1,13 @@
|
|||
using System.IO.MemoryMappedFiles;
|
||||
using Iced.Intel;
|
||||
using OtterGui.Services;
|
||||
using PeNet;
|
||||
using Decoder = Iced.Intel.Decoder;
|
||||
|
||||
namespace Penumbra.Interop.Hooks.ResourceLoading;
|
||||
|
||||
// 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
|
||||
public unsafe class PeSigScanner : IDisposable
|
||||
public unsafe class PeSigScanner : IDisposable, IService
|
||||
{
|
||||
private readonly MemoryMappedFile _file;
|
||||
private readonly MemoryMappedViewAccessor _textSection;
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ public unsafe class ResourceLoader : IDisposable, IService
|
|||
private ResolveData _resolvedData = ResolveData.Invalid;
|
||||
public event Action<Utf8GamePath, FullPath?, ResolveData>? PapRequested;
|
||||
|
||||
public ResourceLoader(ResourceService resources, FileReadService fileReadService, RsfService rsfService, Configuration config)
|
||||
public ResourceLoader(ResourceService resources, FileReadService fileReadService, RsfService rsfService, Configuration config, PeSigScanner sigScanner)
|
||||
{
|
||||
_resources = resources;
|
||||
_fileReadService = fileReadService;
|
||||
|
|
@ -35,7 +35,7 @@ public unsafe class ResourceLoader : IDisposable, IService
|
|||
_resources.ResourceHandleDecRef += DecRefProtection;
|
||||
_fileReadService.ReadSqPack += ReadSqPackDetour;
|
||||
|
||||
_papHandler = new PapHandler(PapResourceHandler);
|
||||
_papHandler = new PapHandler(sigScanner, PapResourceHandler);
|
||||
_papHandler.Enable();
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue