﻿24.12.29.1
==========
+ Optimized D3D11 stateblock Create/Apply code when deferred D3D11 contexts
    are not in use.
+ Optimized D3D11 state tracker clear operation.
+ Optimized use of mouse cursor image and position APIs.
+ Removed hook on CloseHandle (...) unless a debugger is present.

24.12.29
========
 + Improved input neutralization for games that use Overlapped IO to read
     HID devices (i.e. SDL2) when blocking input to the game.
 + Fixed problems with mouse cursor clipping caused by treading ClipRect
     as thread-local instead of global.

24.12.28.5
==========
 + Updated compiler version; anything broken between 24.12.28.4 and now is
     probably a compiler bug.

24.12.28.4
==========
 + Disable dynamic spinlocks feature accidentally enabled for all games
     in 24.12.28.1.

24.12.28.3
==========
 + Deferred Context Isolation now re-enables the Wrap -AND- Hook codepath
     required for some D3D11 games.
 + Fixed NieR: Replicant setting changes not applying immediately.

24.12.28.2
==========
 + Fixed unintentional creation of empty NVIDIA driver profiles for
     games whose .exe exists in multiple profiles when checking whether
       ReBAR is enabled for a game during initialization.

24.12.28.1
==========
 + Added caching for calls to GetForegroundWindow (...) and
     GetWindowThreadProcessId (...)
 + Removed locking code from XInput, it was already mostly lockless

24.12.28
========
 + Fixed some games inheriting SK's hardware cursor after the cursor
     moves off of SK's UI.

24.12.27.3
==========
 + Load ReShade Early plug-ins as early as possible (after INI parse)
 + Optimized various state block and UI code

24.12.27.2
==========
 + Slight performance tweak for D3D11_**SetShader_Override (...) and 
     D3D11_**SetShaderResources_Override (...).

24.12.27.1
==========
 + Fixed incorrect Reflex eligibility checks introduced in 24.12.27

24.12.27
========
 + Optimized D3D11 state tracker to ignore set shader calls, and draw calls unless
     specific combinations of render mods that actually need them are active.
 + Optimized control panel's end-of-frame input polling and cursor status checks.
 + Optimized shader tracker to avoid clearing active RTV cache at the end-of-frame
     unless render mod tools window is open.
 + Optimized timer queries used by SK's shader profiler and HDR widget to suspend
     while render mod toolkit / HDR widget are not active.
 + Optimized D3D11 Stateblock Restore code to bypass invoking SK's state tracking
     hooks.

24.12.26.3
==========
 + Added missing draw call information to Reflex latency markers in D3D11 games

24.12.26.2
==========
 + Small optimization to text OSD
 + Optimized D3D11 state tracking for SetShaderResources and removed unnecessary
     hooks on SetSamplers.

24.12.26.1
==========
 + Fixed potential deadlock in RenoDX mods, the ones that do not check for
     nullptr before dereferencing ptrs will simply have to crash until fixed.
 + Disabled floating-point exception handling when ResizeTargets is called,
     because it causes all CryTek games to crash.

24.12.26
========
 + Added internal settings to control D3D11 state tracking for map/unmap and
     set shader resources API calls, and disabled them for a few high overhead
       games.
 + Disabled wrapping of D3D11 device contexts for all games except for 
     Tales of Vesperia.

24.12.25.2
==========
 + Improved compatibility with RenoDX mods, even the ones that do not check for
     nullptr :grimacing:
 + Slightly sped-up initialization in some D3D games.

24.12.25.1
==========
 + Create an IDXGIFactory2 rather than IDXGIFactory when initializing hooks to
     avoid complications from ReShade calling QueryInterface to upgrade an
       interface that SK has not yet wrapped.

24.12.25
========
 + Reduced performance overhead of the Steam and battery management sections of
     the control panel (battery overhead applies to framepacing widget too...)
 + Ignore D3D11DeviceContext Set*Resource state tracking unless the render mod
     tools window is open.

24.12.24.2
==========
 + Further reduce performance overhead in D3D11 across the board for CPU-bound
     scenarios in games that make a lot of draw calls.
 + Optimized Get/SetMute to avoid constructing a temporary ISimpleAudioVolume
     COM object every time it is called.

24.12.24.1
==========
 + Lowered CPU overhead in D3D11 games related to third-party overlay color
     correction shader replacement when an HDR display is attached.
    >> State tracking for them will only occur during Present (...) calls now.

24.12.24
========
 + Avoid destroying the SwapChain that Special K creates during initialization
     to setup D3D11 hooks, because poorly written ReShade addons may crash.
 + The option to disable the Steam overlay's rendering now also blocks it from
     installing input hooks, making it finally inert.
 + Automatically apply anti-cheat bypass to all Hoyo games according to their
     digital certificate, so I no longer have to manually do this when they
       release a new game.

24.12.23
========
 + When ReShade is used as dxgi.dll in D3D12 games, SK no longer gives warnings
     about compatibility problems.
 + Avoid using explicitly constructed ReShade effect runtimes as much as
     possible when SK is not running in Hookless ReShade (compatibility) mode,
       to avoid confusing AddOns that think these are normal ReShade runtimes.
 + Added checks to detect ReShade's incorrectly reported D3D11 immediate device
     context reference counts that may cause deadlock during game exit or when
       temporary D3D11 devices are constructed and destroyed (ie. overlay init)

24.12.22
========
 + Fixed absent custom resolutions caused by a typo in the Display menu a few
     years ago...
 + Restored missing audio devices in the list of pairable display/audio output
     mappings, lost about a moth ago.
 + Fixed CPU affinity mask potentially overflowing and not working in 32-bit.
   ( Whether you have one of those mythical 64-core CPUs or not, chances are
       affinity mask settings were not working in 32-bit games ).

24.12.21.4
==========
 + Revert scheduler changes related to Sleep (0) behavior in 24.12.15 that cause
     Silent Hill 2 to crash.

24.12.21.3
==========
 + Fixed recent change that would cause the control panel to crash in Steam games
     if Steam cloud is disabled or SteamAPI integration is turned off.

24.12.21.2
==========
 + Fixed typo that has been preventing SK's D3D11 texture cache from evaluating
     the list of freeable textures when cache capacity exceeds user-defined
       limit for several years... oops?
 + Fixed various other small issues, nothing as serious as the one above.

24.12.21.1
==========
 + Fixed cursor auto-hide changes accidentally introduced in 24.12.21

24.12.21
========
 + Re-aranged the window management and mouse cursor section of the control
     panel slightly.
 + Opted the majority of the codebase into the non-commerical open source
     license of PVS Studio; by placing comments above the license disclaimer
       in most source files.

24.12.20.2
==========
 + HOTFIX for NVIDIA Vulkan/DXGI interop issues introduced in 24.12.20.

24.12.20.1
==========
 + Eliminate unnecessary load of Windows.Gaming.Input.dll in games that do not
     actually use the API.
 + Fixed various minor issues discovered using static analysis with PVS-Studio.

24.12.20
========
 + Fixed EOS crash in games using extremely old versions of EOS SDK lacking
     support for EOS_UI_AddNotifyDisplaySettingsUpdated (i.e. Path of Exile 2).
 + Add mutex to SK_IWrapD3D11DeviceContext::Release (...) to handle recursion
     during deferred destruction of D3D11 Immediate Device Context singleton.

24.12.19.4
==========
 + Fix DualShock 4 Bluetooth analog stick problems caused by typo in 24.12.19.2

24.12.19.3
==========
 + Correctly show PlayStation icon in GameInput games only when PlayStation
     input/output is active, for native GameInput remove the icon.
 + Allow DualSense users (non-Edge version) to access the Impulse Trigger
     strength slider.

24.12.19.2
==========
 + Add logarithmic scaling to deadzone compensation on PlayStation controllers
     and extend the option to native Xbox controllers also.
 + Fixed off-by-one issue when quantizing the x-axis in some PlayStation device
     configurations.

24.12.19.1
==========
 + Added system to ensure XInputGetState{Ex} (...) packet counts are always
     monotonic increasing in mixed-native/translated hot-swap scenarios.

   (i.e. Xbox and PlayStation controller are both connected and SK's
      auto-switch-on-new-input causes the game to start reading the other)

   DOOM Eternal only responds to sequential packet numbers, so exposing the
     _real_ device packet numbers would cause it to stop responding to input.

 + Clear the state of the PlayStation button when all PlayStation controllers
     disconnect, so that SK doesn't block all other buttons because it thinks
       the user is trying to input a PlayStation + <...> button combo.

24.12.19
========
 + Overhauled Windows.Gaming.Input implementation to support hot-plugging
     PlayStation controllers and enabling "Xbox Mode" without requiring a
       complete game restart.
 + Add 7.5 second delay before announcing virtual PlayStation controllers
     to games using Windows.Gaming.Input
 + Added logging for games that try to create IID_IRawGameControllerStatics.

24.12.18
========
 + Correctly implement AVIF screenshot encoder quality; quantizer was set to
     lossless at all quality levels before!

 + When holding Xbox Guide / PlayStation / Nintendo Home button, ImGui menu
     navigation is now temporarily blocked (if chords are enabled).

24.12.17.2
==========
 + Reduce latency on HID output reports (i.e. rumble, lighting changes, etc.)
     for DualShock 4 and DualSense{Edge} controllers.

24.12.17.1
==========
 + Revert ResizeTarget optimization from 24.12.15.4, because it only works as
     intended in D3D11 games.

24.12.17
========
 + Reduced default Impulse Trigger strength in Forza Horizon 5 to 33%
 + Added PlayStation controller latency readings back to the control panel

24.12.16.1
==========
 + Fixed beeping when pressing keyboard input in some games after using chords:
     PlayStation + R2 / PlayStation + L2 to minimize and restore a game.

24.12.16
========
 + Improve HID->XInput timestamp management when threads are updating the state
     concurrently.
 + Fix potential crash while games poll keyboard input from multiple threads
     and SK's primary render context is not active.
 + Speed up render context re-initialization following a window resize.

24.12.15.4
==========
 + Revert recent changes to Sleepless Window Thread that could hurt framerate.
 + Unset most hooked window management trampoline functions during shutdown.
 + Use ShowWindowAsync (...) in all cases where synchronous state change is
     unnecessary, in order to minimize window management wait-chains.
 + Do not show Windows.Gaming.Input warnings to PlayStation controller users
     if theey have deliberately blocked a game from using XInput-derived APIs.
 + Avoid IDXGISwapChain::ResizeTarget (...) when appropriate, in favor of
     the simpler and much more likely to succeed without disrupting MPOs,
       IDXGISwapChain::ResizeBuffers (...).

24.12.15.3
==========
 + Add hacky workaround for Indiana Jones' Vulkan window not properly releasing
     topmost status on alt-tab.

24.12.15.2
==========
 + Removed unnecessary Windows.Gaming.Input warning messages in SDL2 and Nixxes
     games if they initialize input before creating a game window.

24.12.15.1
==========
 + Apply/reset trigger resistance for DualSense controllers every time they
     connect/reconnect, and do not wait for vibration data to be written first.

24.12.15
========
 + Added configurable constant trigger resistance for DualSense controlelrs...

   [Input.Gamepad]
   {Left|Right}TriggerResistance={-1.0,[0.0,1.0]}  Default=-1.0 (not applied)
   {Left|Right}TriggerResistsAt={-1.0,[0.0,1.0]}   Default=-1.0 (not applied)

   TriggerResistsAt defines the ratio of trigger pull (1.0 = full pull)
     before any resistance is applied; set to 1.0 or -1.0 to disable.

   NOTE: 0.0 resistance actually has slight (minimum supported) resistance.

   * This is a per-game setting, not currently exposed in the control panel.

 + Added command console variables to control the settings listed above:

     Input.Gamepad.DualSense.ResistStr{L|R}={-1.0f,[0.0,1.0]}
     Input.Gamepad.DualSense.ResistPos{L|R}={-1.0f,[0.0,1.0]}

 + Added command console variables to control Xbox Impulse Trigger strength:

     Input.Gamepad.DualSense.ImpulseStr{L|R}=[0.0,1.0]

24.12.12
========
 + Disabled anisotropic filtering optimizations in Metaphor: ReFantazio because
     most textures are not mipmap-complete.

24.12.8
=======
 + Uncommented checks for PlayStation controllers when a game uses
     Windows.Gaming.Input warning about potential incompatibility.

24.12.3
=======
 + Various changes to ensure GameInput games do not read from the same memory
     that SK's input I/O threads are actively writing to, lockless of course.

24.12.2.1
=========
 + Fixed internal deadzone on PlayStation controller input used to determine
     which gamepad has the most recent input (i.e. if the same controller is
       attached to USB and Bluetooth simultaneously), being applied to the
         readings sent to games.

    * This was causing stick drift.

24.12.2
=======
 + Added a trigger deadzone applied during trigger force feedback to keep
     games from registering the small force feedback movement as actual user
       input (i.e. pulling and releasing a gun's trigger rapidly).

24.12.1.4
=========
 + Support native GameInput implementations when Xbox Emulation is turned off.

24.12.1.3
=========
 + XInput emulation now bypasses GameInput.dll for systems that do not have
     this DLL.

24.12.1.2
=========
 + Enable Impulse Trigger strength sliders in Windows.Gaming.Input games

24.12.1.1
=========
 + Allow Starfield to read Windows.Gaming.Input and write XInput

24.12.1
=======
 + Fixed issues with games that poll XInput multiple times per-frame from more
     than one thread.
 + Implemented support for reading XInput and writing Windows.Gaming.Input in
     the same game (Forza Horizon 5's Impulse Triggers now work on DualSense).

24.11.30.4
==========
 + Added Xbox Impulse Trigger->PlayStation Adaptive Trigger emulation for games
     using Windows.Gaming.Input (99.99% of games that support the feature).

    * Make sure Xbox Mode is enabled and restart if needed; off by default.

24.11.30.3
==========
 + Properly remove Adaptive Trigger force feedback when impulse vibration stops

24.11.30.2
==========
 + Implement PlayStation Adaptive Trigger support for DualSense controllers
     connected using Bluetooth.

24.11.30.1
==========
 + Bring back original slUpgradeInterface / slGetNativeInterface implementation
     that could handle situations where sl.interposer.dll is loaded late.
 + Increase default impulse trigger strength modifier to 0.75x, and properly
     handle the case where setVibration (...) has zero trigger data.

24.11.30
========
 + For all Unreal Engine games that use GameInput, enable Xbox Emulation by
     default on first launch.
 + Implement Adaptive Trigger response for GameInput Impulse Trigger emulation,
     shooting guns and stabbing stuff in STALKER 2 now has Force Feedback that
       would otherwise be Xbox exclusive!

24.11.29.5
==========
 + Enable XInput emulation by default in STALKER 2

24.11.29.4
==========
 + Ensure that "LowSpecMode" is enabled even for Metaphor: ReFantazio users with
     texture mods installer, and change the auto-disable feature to only apply
       when staging texture cache is enabled.
 + Disable deferred context isolation in Metaphor by default for performance,
     re-enable it if you need live texture modding or hudless screenshots.
 + Improved thread interlocking for XInput rumble

24.11.29.3
==========
 + Make Impulse Trigger Str. (Left/Right) configruable from SK's control panel.
 + Correctly clear rumble when games pass a nullptr to SetRumbleState (...).

24.11.29.2
==========
 + Added preliminary Xbox Impulse Triggers -> DualSense Haptics, in STALKER 2;
     think of it more as supplementary rumble for the time being.

   It does give a sensation you wouldn't get from just the 2 normal high/low
     frequency rumble motors (or emulated motors in DualSense's case), but it
       is not as advanced as actual haptic effects or Force Feedback Triggers.

   I think a combination of the two could possibly create a convincing feeling,
     but haven't had time to implement the various force feedback effect types
       yet.

24.11.29.1
==========
 + Avoid memory move in SK_Exception_HandleThreadName (...) when assigning
     wide character name, explicitly copy the string.

24.11.29
========
 + Stop forcing latency waitable swapchains on in games that do not normally
     use them unless SwapChainWait is set to a non-zero value in INI.
 + Optimize NVIDIA Reflex timing marker code in D3D12 games to avoid a constant
     check for sl.interposer.dll.

24.11.28.7
==========
 + Adjust Unreal Engine thread priorities for reduced stutter.
 + Disable OpenGL and D3D9 hooks in ReShade is loaded as dxgi.dll or d3d12.dll,
     in order to speed initialization up and reduce the chances of hook races.

24.11.28.6
==========
 + Fix potential crash on non-Latency Waitable D3D12 SwapChains when SK
     attempts to query the device latency from the D3D12 Device's DXGI Device.
 + Remove Latency Waitable status from S.T.A.L.K.E.R. 2's SwapChain to help
     reduce stutter slightly.

24.11.28.5
==========
 + Implemented PlayStation->GameInput translation for DualShock 3/4 and
     DualSense controllers over USB and Bluetooth (DS4/DualSense only).
 + Removed warning about needing DS4Windows in GameInput games.

24.11.28.4
==========
 + Implement haptic/rumble blocking support for GameInput; S.T.A.L.K.E.R. 2
     uses impulse triggers, so next step is to translate those to DualSense.

24.11.28.3
==========
 + Remove warning for ReShade loaded as dxgi.dll/d3d12.dll in D3D12 games;
     it's still not a fully compatible combination, but the UI will at least
       work (no SK Add-On releated features will).

24.11.28.2
==========
 + Add 1 frame delay before returning GAMEINPUT_E_READING_NOT_FOUND when
     initiating GameInput device blocking, so that the game will first read
        safe neutralized input values.
        
          (i.e. you don't keep running forward when the control panel opens).

24.11.28.1
==========
 + Improved gamepad input blocking when using GameInput
 + Wrapped IGameInputReading in order to implement PlayStation->GameInput
     translation (not complete).

24.11.28
========
 + Added initial support for GameInput; that means activity indicators in the
     active Input API section of the control panel and blocking device classes
       when SK's control panel is open or devices are enabled/disabled.
 + Currently Special K cannot emulate GameInput for PlayStation controllers,

   >> You must use DS4Windows to play games such as STALKER2 using a DualShock
        or DualSense controller.

    * Emulation support is planned, but the API is new to me and there is only
        one known game that uses the API at the moment :)

24.11.27
========
 + Adjusted Tomb Raider Remastered (OpenGL)'s default settings to use 8-bpc
     instead of 10-bpc, because the game is sRGB.

24.11.25
========
 + Disable the option to clear Flip Model backbuffers on present by default,
     because it prevents OBS Game Capture in some (D3D11) scenarios.

24.11.24.2
==========
 + Allow moving windows to different monitors by dragging without triggering
     SK's monitor-change message (causes games to maximize the game window).

24.11.24.1
==========
 + Fixed accidentally using ImGuiKey_MouseLeft to index the ImGuiIO::MouseDown
     array (which only has 5 buttons; the value of ImGuiKey_MouseLeft is 653!)
   * It should have been ImGuiIO::AddMouseButtonEvent (ImGuiKey_MouseLeft,...).
  >> This relatively new bug only affected games w/ (Low-Level) Mouse Hooks...

 + Ignore mouse button capture when the mouse cursor is over a non-client part
     of a game window (i.e. title bar or resize grips).
 + Disengage the "confine cursor" option temporarily while a game window has
     been grabbed and is inside of the "size/move" modal loop, so that the
       window can actually be resized or repositioned without interference.

24.11.24
========
 + Unload plug-in DLLs at game exit _before_ uninstalling all hooked functions.
 + Add plug-in DLL names to the unload log entires during game shutdown.
 + Run each plug-in unload attempt within its own exception handler and
     continue unloading remaining plug-ins if there is an exception.

24.11.23.2
==========
 + Fixed the issue in 24.11.23.1 the correct way :) The staging copy of the
     backbuffer needs to be enqueued, the reference to the backbuffer released,
       and the command queue flushed immediately and then there are no chances
         for the swapchain backbuffers to have outstanding references.

24.11.23.1
==========
 + Fixed D3D11 screenshots occasionally causing display mode changes to fail if
     a (Blt Model) game requested a mode change within 500-ms of the last screen
       capture.

24.11.23
========
 + Cleaned-up Mouse Cursor section of Input Control Panel and removed the old
     "Low-Level Mouse Settings" section.

 + Auto-Bluetooth Compatibility now only powers off PlayStation controllers
     that have advanced Bluetooth mode active if SK has seen the game attempt
       to poll input using WinMM or DirectInput 7/8 at least one time first.

    # Controllers start in "simple" Bluetooth mode when initially powered on,
        which is a mode compatible with DirectInput and WinMM.

   >> Prior to this change, it could cause an endless loop of the controller
        powering off, Steam Input re-initializing the controller in advanced
          Bluetooth mode when powered back on, and then SK turning it back off!

    * It is a niche feature that is more likely to be accidentally enabled by
        users not completely familiar with its purpose than the chances of
          playing a game that requires it.

24.11.22
========
 + Update ReShade Add-on API headers to include new events in the next release.
 + Reduce unnecessary WM_NCHITTEST messages sent to games when the cursor is not
     even moving.

24.11.21
========
 + Enable Fake Fullscreen mode by default in STALKER 2, because it uses that
     crap (in D3D12) for HDR... yay!

24.11.20
========
 + Fixed only a single monitor being listed in the Display menu.
 + Added measures to prevent various ATLUS ports from moving the game window
     back to the primary monitor whenever HDR is enabled/disabled or resolution
       changes (they handle WM_DISPLAYCHANGE and WM_MOVE weirdly).

24.11.19
========
 + Restored support for using D3D11 Render Mod Tools in games with multiple
     deferred contexts to debug shaders when ReShade is active.

24.11.18
========
 + Disable SteamAPI file hash checks on Fallout 4
 + Handle window activation more explicitly in Metaphor Re:Fantazio so that
     its Keyboard Hook does not capture input events when the window is not
       focused.

24.11.16.3
==========
 + Fixed various problems indicated by static analysis...

24.11.16.2
==========
 + Fixed problems with SK not re-initializing D3D11 when the active SwapChain
     is destroyed and re-created.
 + Fixed potential issues with loading ReShade as a plug-in and config files
     not correctly being passed to create_effect_runtime (...).

24.11.16.1
==========
 + Implement Lossy scRGB->HDR10 Quantization the correct way :)

24.11.16
========
 + Added texture sampling fixes for Metaphor: ReFantazio so that it actually
     can make use of anisotropic filtering, instead of setting MaxAnisotropy
       and then using a texture filter that doesn't support anisotropic...
 + Revert a few ReShade integration changes (synchronous loading of PlugIn)
 + Added Lossy scRGB->HDR10 Quantization mode to reduce filesize on HDR PNG
     screenshots.

24.11.16
========
 + Disable GOG Overlay in Unity Engine games with AMD GPUs, because the GOG
     overlay will cause AMD's shitty interop to kick in when it sets up for
       OpenGL (an API the game does not use, but AMD's driver starts interop)

24.11.15.3
==========
 + Fix various problems with games that use (Low Level) Keyboard hooks thinking
     Alt/Tab are stuck.
 + Allow mouselook in games even if Mouse Input is set to Disable in Background
 + Added fixes for Metaphor: ReFantazio using wrong SRV formats for textures

24.11.15.2
==========
 + Use synchronous init when loading ReShade as a plug-in for maximum compat.

24.11.15.1
==========
 + Fixed ReShade (Add-on version) not being exempt from settings that block
     mouse input to games.
 + Added HUD vtx shader hashes for Metaphor: ReFantazio for hudless screenshots

24.11.15
========
 + Add support for generating mipmaps for BC7 textures that are mip-incomplete,
     they will be decompressed and then the mipmaps will be generated, and no
       attempt to recompress them back to BC7 will be made because that's SLOW!

24.11.14.2
==========
 + Revert recent change to foreground window checks.

24.11.14.1
==========
 + When loading ReShade as a Plug-In, automatically load all AddOns in a Game
     Profile's ReShade\AddOns\ directory and any in Global\ReShade\AddOns\.

24.11.14
========
 + Prevent loading/saving INI files in blacklisted processes, and do not create
     logs if blacklisted.
 + Do not spawn an global injection unload listener in blacklisted processes.
 + Render the first 120 frames in DXGI-based games without fractional VSYNC if
     a game tries to use it, so that SK can detect VRR support correctly.

24.11.13.2
==========
 + Fixed SK's UI not rendering correctly in D3D9Ex games beginning in 24.11.5.1
 + Handle EDID Display Names that do not adhere to specs and do not space-pad
     names shorter than 13 bytes.

24.11.13.1
==========
 + Hide/disable "Overbright Tonemapping" when RenoDX ReShade AddOn is detected.

24.11.13
========
 + Replace attempts by games to set DLSS Presets A-D with E, when DLSS version
     is >= 3.8.10.
   * Needed for Nixxes games, since they explicitly request Preset C instead of
       DLSS default.

24.11.11
========
 + Reinstate background render mode as default policy in Metaphor: ReFantazio.
 + Allow Steam Input to hook and override WinMM Joystick APIs by default;

     Steam Input's hooks can be disabled if needed (perf overhead) by setting:

       [Input.Gamepad]
       AllowSteamWinMM=false

24.11.9
=======
 + Fixed INI parser not returning to the start of the INI to scan for macros
     after looking for plug-ins to load.
       (i.e. macros in SpecialK.ini or dxgi.ini being ignored)

24.11.5.1
=========
 + Detect local ReShade DLLs as ReShade, and allow pressing the default
     ReShade UI toggle keybind to work even if SK is blocking keyboard input
       to the game.

24.11.5
=======
 + Optimized keyboard handling in proxy Windows (Low-Level) Hook procedures
 + Ensure that all keyboard input a game sees through a keyboard hook while
     the window is not actually active are key releases, so that upon upon
       alt-tabbing back, they do not do that stupid thing they usually do
         where they think a key is permanently stuck down.

24.11.4.5
=========
 + Removed the last remaining remnants of SK's original cursor anti-warp system.

24.11.4.4
=========
 + Disable periodic LatentSync resync when G-Sync is active
 + Remove warning about using LatentSync on VRR displays

24.11.4.3
=========
 + Xbox/PlayStation + Right/Left trigger will Minimize/Restore the game.

24.11.4.2
=========
 + The Xbox/PlayStation button on gamepads can now be used to activate a
     chord input without that input counting for screensaver deactivation.
   * In other words, you can use chorded feature like volume control while
       a screensaver is active.
 + Make UI navigation moving the mouse cursor a persistent (global) config
     option, and turn it off by default.

24.11.4.1
=========
 + Correctly restore hardware cursor image when closing the control panel and
     cursor centering is turned off.

24.11.4
=======
 + Ensure confirmation dialogs cannot be dismissed using the overlay toggle
     keyboard / gamepad bindings, and gamepad is always captured while they
       are waiting for a user response.
 + Make cursor centering on SK's control panel into a configurable option.
    * Refer to:  Input Management > Mouse Cursor; this is a global preference.

24.11.3.3
=========
 + Hide mouse cursor when the game is using SetCursorPos (...) to implement
     mouselook and cursor management is enabled.
 + Ensure that upon closing the keybind editor dialog, the keybind configured
     does not immediately trigger.

24.11.3.2
=========
 + Change keyboard/mouse/gamepad blocking state so that it is evaluated
     once per-frame frame and all other tests use the value set at the
       beginning of a game's frame.

24.11.3.1
=========
 + Handle UnhookWindowsHookEx (...) correctly, by setting the HHOOK handle
     during SetWindowsHookEx{A|W} (...).

24.11.3
=======
 + Disable mouse while SK's control panel is open in Dragon Age The Veilguard.

24.11.2.3
=========
 + Workaround CAPCOM DRM catching exceptions it should not be using a
     Vectored Exception handler during CPU test for illegal instructions.

24.11.2.2
=========
 + Fixed missing DLSS and other API functionality caused by 24.10.31.4

24.11.2.1
=========
 + Remove all cursor anti-warp config settings and control panel items.

24.11.2
=======
 + Added INI setting to disable DirectStorage hooks.

   [Render.DStorage]
   EnableHooks={true|false}  Default: true
 + Disable DirectStorage integration in Monster Hunter Wilds.

24.11.1.4
=========
 + Poll -ALL- mouse buttons while game window is inactive, not just the
     left button...

24.11.1.3
=========
 + Activate the game's window if mouse buttons are held while alt-tabbing.

24.11.1.2
=========
 + Prevent accidental misclicks on settings in SK's control panel when
     alt-tabbing from another application while mouse buttons are held down.

24.11.1.1
=========
 + Add 1 extra device context reference in Vulkan interop games to ensure
     they do not trigger SK's cleanup code when changing to fullscreen.

24.11.1
=======
 + Re-enable D3D11 cleanup code so that the Steam overlay does not cause
     D3D12 games to crash.
 + Disable D3D11 cleanup code only in Ys X so that it does not continue
     running forever after it should have shutdown.

24.10.31.4
==========
 + Stop hooking OpenGL32.dll whenever gdi32.dll or gdi32full.dll are
     loaded, but OpenGL32.dll isn't.
 + Ignore OpenGL32.dll if the Epic Overlay's DLL was loaded before
     OpenGL32.dll was.

24.10.31.3
==========
 + Revert late stage re-initialization of D3D11, it was a bad idea.

24.10.31.2
==========
 + Add new fallback for WMAITX support testing on CPUs with CPUIDs that
     claim the instruction is unsupported... just run the instruction and
       see if it generates and Illegal Instruction exception or not, lol.

24.10.31.1
==========
 + Fixed changes to SK_WindowManager::StyleHasBorder (...) in 24.10.24.4
     that were causing added window borders to Baldur's Gate 3 when set to
       Borderless in-game.
 + Allow late stage re-initialization of D3D11 during SwapChain presentation,
     rather than when a new SwapChain is created (Vulkan interop).
 + Disable Windows+Down/Up in Vulkan games.

24.10.31
========
 + Do not invoke SK_SetupDiGetClassDevsExW (...), from
     SK_RBkEnd_UpdateMonitorName (...), because during late injection,
       the SK_SetupDiGetClassDevsExW function pointer may not be setup yet.
 + Properly re-use NVIDIA Vulkan interop D3D11 device singleton, instead
     of permanently losing overlay capabilities when games change resolution.
 + Increase thread priority on SteamAPI delayed it and DLL enumerator threads
 + Revert to 24.10.26 initialization order in core.cpp

24.10.30.2
==========
 + Allow Multitasking-on-Top to be used without Global Injection service,
     but turn off certain functionality that cannot work reliably without.
 + Improved thread-safety of (LowLevel) Keyboard/Mouse Hook Proxy code.
 + Handle window position changes that occur without showing up a game's
     window message queue.
 + Cleanup various RawInput handling code.

24.10.30.1
==========
 + Prevent PH3 games from causing Fullscreen mode changes through use of
     ChangeDisplaySettings (...) API with unchanged parameters, even
       when configured for "Borderless" or "Windowed" modes. (ugh!)
 + Change compiler optimization settings to try and resolve Steam Overlay
     problems (again).

24.10.30
========
 + Improved/made obsolete mouse anti-warp for games that move their cursor
     to the center of the screen to implement mouselook (stupid devs...).
 + Multitasking-on-Top mode now causes Special K's injection service to
     continue running until the game exits, because otherwise the feature
       is unusable and cannot track when focus changes to other apps.

24.10.29.4
==========
 + Add exception code for Non-SEH exceptions caught by the crash handler

24.10.29.3
==========
 + Remove QueryInterface call on D3D11 Device Context during texture upload,
     it angers the D3D11 debug layer if this happens on multiple threads.
 + Remove old compatibility hack for ReShade that was changing Flip Model
     SwapChains to Flip Sequential. ReShade works with Flip Discard now.

24.10.29.2
==========
 + Added option block screensaver activation on controller input (default)
 + Added option to have Special K disable all game handling of screensavers,
     and fully manage it based on its own configurable rules.

    >> Without this option, SK adds additional blocking rules, but respects
         the game's own attempts to block screensaver activation.

    * Many games unconditionally block screensaver, and you may not want
        that behavior if you have alt-tab to work a different application
          and then go AFK while the game continues running.

24.10.29.1
==========
 + Changed screensaver activation prevention to use the Windows-defined timeout
     interval and factor in gamepad input, since Windows only uses KB&M.
  + Added a message when the system screensaver activates explaining how to
     configure screensaver prevention.
 + Default screensaver policy has been changed to "Game Default".
 + Gamepad input will now deactivate screensavers.

24.10.29
========
 + Fixed crash.log being created in the game's working directory when local
     injection is used together with the virtual SpecialK.central file.
 + Fixed multi-threaded race condition in BlacklistLibrary (...)'s init. and
     SK_EstablishRootPath (...).

24.10.28.4
==========
 + Remove unintended cursor deactivation introduced in 24.10.28.3

24.10.28.3
==========
 + Disable SK's Hardware Cursor when game cursor auto-hide is enabled, so that
     mouse warping done by game mouselook does not cause the cursor to become
       visible.
 + Block mouse input while the control panel is open in Metaphor, otherwise
     the camera will just spin endlessly if the cursor moves out of it.

24.10.28.2
==========
 + Always use the fully qualified path when looking up NVIDIA driver profiles
     for the current game in order to avoid creating duplicates.
 + Fix bug in Ys X where it may attempt to create 0x0 textures when its window
     is minimized and then crash.
 + Query D3D11 device context type when wrapping it, and then use that rather
     than calling ID3D11DeviceContext::GetType(...) because the D3D debug layer
       will abort if GetType is called from multiple threads.

24.10.28.1
==========
 + Add explicit overrides for many of the most important SDL input settings

    ( -1 = No Override, 0 = Off, 1 = On )

    * Refer to SDL_hints.h for details on each,

      "FullPlayStationBluetoothSupport" is a combination of
        SDL_JOYSTICK_HIDAPI_PS4_RUMBLE and SDL_JOYSTICK_HIDAPI_PS5_RUMBLE...

      This setting is controversial, it will allow rumble and haptics over
        Bluetooth, but will cause your gamepad to become incompatible with
          games that use DirectInput until powered off and back on...

      ^ If that sounds familiar, it is the entire reason ValvePlug was created.

   *** Unlike the Steam Client, SDL never enables those things without consent,
         and that means rumble may be missing from many games that use SDL.

24.10.28
========
 + Allow SDL to use DirectInput gamepads at sanity level 1
 + Improve Vulkan/DXGI Layer detection for NVIDIA drivers to handle cases
     where vulkan-1.dll is calling DXGI directly instead of nvoglv{32|64}.
 + Turn Multitasking-on-Top off by default again, because at levels aggressive
     enough to work, some windows will not be raised above the game.

24.10.27.4
==========
 + Add cached memory addresses for framerate unlock for Elden Ring 2.6.0.0.
 + Make sure SK always calls the real ShowWindow (...) instead of its hook.
 + Handle undocumented special cases SWP_NOCLIENTMOVE and SWP_NOCLIENTSIZE,
     to fix problems with Sonic Generations (presumably a Windows AppCompat
       hack that ships with Windows).

24.10.27.3
==========
 + Added support for minimizing/restoring borderless games by pressing the
     normal Windows keybinds to do so (Win+Down / Win+Up).

24.10.27.2
==========
 + Avoid unnecessary window position and border style API calls when no actual
     change is required.
 + Allow WS_ICONIC window style to be set if borderless override is not on.
 + Add WS_EX_WINDOWEDGE to list of extended window styles that have borders.

24.10.27.1
==========
 + Fixed rare deadlock when an application deletes the D3D11 Immediate Device
     Context for a device during shutdown.
 + Fixed ReShade Plug-In selection UI not correctly turning Compatibility Mode
     off (necessary for some ReShade Add-Ons to work).

24.10.27
========
 + HDR Remastered tooltip now ONLY counts memory for remastered RenderTargets
     and Unordered Access Views that are -still- in memory, and values decrease
       as a game unloads remastered resources.

    * It now accurately measures extra VRAM used by having remasters enabled.

 + Remastered D3D11 RenderTargets and Unordered Access Views now have names
     describing the type of resource, a unique ID and the original Surface
       format before SK upgraded it to R16[G16[B16A16]]_{FLOAT|UNORM}.

    * Names appear in debug logs and the Render Mod Tools (Live RenderTargets).

24.10.26.2
==========
 + Fixed SKIF not being able to disable GFE notifications due to disabled code
 + Increase delay between first drawing an achievement unlock popup and taking
     screenshot, so that statistics such as unlock time reliably appear.

24.10.26.1
==========
 + Optimize SK_D3D11_SetShader_Impl (...)/SK_D3D11_EnsureMatchingDevices (...)
     to use D3D11 Private Data lookups.

24.10.26
========
 + Add Alt+F4 handler override to workaround Ys X's buggy Alt+F4 code that
     tends to close the game window, but leave the game running.

24.10.25.2
==========
 + Fixed missing mouse input in Forza Horizon 5.

24.10.25.1
==========
 + Change compiler settings to generate code more compatible with the Steam
     overlay on some systems.

24.10.25
========
 + Add checks to prevent confusing SKIF and SKIV when SK needs to send
     signals to SKIF during injection.
 + Prevent turning off "Background Render" mode while Fake Fullscreen is
     enabled.

24.10.24.7
==========
 + Improve SDL detection for games (i.e. Ys X) that use SDL, but have
     overridden the default window class name.
 + Add various default behavior overrides for SDL games to avoid double
     input polling and buggy window management without recompiling SDL.

   * An INI parameter has been added to control this,

    [Compatibility.General]
    SDLSanityLevel={0,1,2}  Default=1

      0=Do Nothing
      1=Set SK Optimized Values if no SDL environment variables are set
      2=Force SK Optimized Values

24.10.24.6
==========
 + Disable ImGui's g.ClipboardHandlerData temporary storage when pasting
     into a text control and use Special K's Thread-Local Stack Allocator
       instead to fix instability in ImGui's clipboard handler.

24.10.24.5
==========
 + Improved mouse input in applications that use multiple windows,
     such as emulators.
 + Allow mouse clicks that activate the game window from background
     state to also activate parts of Special K's control panel.

24.10.24.4
==========
 + Enable Multitasking-on-Top mode by default
 + Make gamepad input activity hide the cursor as default policy
     when enabling cursor auto-hide
 + Consider window extended style WS_EX_CLIENTEDGE as bordered
 + Consider window style WS_CAPTION and WS_SYSMENU as bordered

24.10.24.3
==========
 + Fix endless game restart cycle in DOOM Eternal when Vulkan Bridge needs to
     be enabled.
 + No longer disable Valve's Vulkan "Fossilize" (shader caching) layer when
     Vulkan Bridge is enabled.
 + Improved AMD and NVIDIA Vulkan/DXGI Interop detection.
 + Fixed swapped definitions for NVIDIA driver settings API enum values:
     OGL_DX_LAYERED_PRESENT_AUTO and OGL_DX_LAYERED_PRESENT_NATIVE

24.10.24.2
==========
 + Fix changes to mipmap level selection in D3D11 that may cause glitches during
     certain lighting and shadowing render passes.

24.10.24.1
==========
 + Disable Metaphor ReFantazio thread scheduling fix by default on Intel CPUs
     because they lack the necessary MWAITX instruction to make this beneficial.

24.10.24
========
 + Fix NVIDIA's Vulkan interop not being detected on SDR systems in newest driver
     releases.
 + Add support for 8-bpc Render/Compute HDR remastering in Shadow Generations.
 + Add D3D11/DXGI Debug Layer minimum severity level to message logging UI.
 + Add anti-cheat workaround for Genshin Impact.

24.10.23.2
==========
 + Disable D3D11 texture cache in Sonic X Shadow Generations because it may
     exacerbate VRAM leaks during FMV playback (same as previous Sonic titles).

24.10.23.1
==========
 + Add additional protection from Sonic X Shadow Generations causing premature
     injection service shutdown before Sonic Generations can launch.

24.10.23
========
 + Ensure that WS_SYSMENU style is never added to borderless windows, it is
     technically invalid without WS_CAPTION.
 + Fixed D3D11 Unordered Access Views with format R32_UINT not being considered
     castable from R8G8B8A8_TYPELESS.
 + Make sure that Sonic X Shadow Generations does not stop the injection service
     until either it exits, or it launches the original Sonic Generations.

24.10.22.1
==========
 + Update SK's HDR enabled detection code to account for WCG SDR displays, as
     Windows 11 24H2 finally makes public the API to distinguish WCG from HDR.
  + Switch to statically linking MSVCRT so that compiler version issues do not
     pop up in the future.

24.10.22 (HOTFIX)
=================
 + Downgrade compiler version used so that games that ship with an outdated
     version of msvcp140.dll in their game directory cannot break SK.

24.10.21.2
==========
 + Changed default HDR Perceptual Boost Color from 50% to 33% because gamma no
     longer desaturates the image.

24.10.21.1
==========
 + Added Metaphor ReFantazio thread scheduling fix to SK's control panel so it
     can be enabled/disabled in real-time for testing (always enable it...).

24.10.21
========
 + Fix double keyboard input procesing in Ys X and potentially other games that
     use SDL2 Raw Input.

24.10.20
========
 + Add workaround for D3D12 HDR screenshots using 64 KiB memory alignment and
     sometimes producing black images.

24.10.19.2
==========
 + Removed hook on msvcp140.dll!_Thrd_sleep(...) first introduced for Metaphor,
     because it causes problems with many of ph3's Legend of Heroes ports.
 + Removed internal injection blacklist on ApplicationFrameHost.exe.

24.10.19.1
==========
 + Merge pull request #217 from audaki:fix-gamma-boost-color-changes
     * Added hue-preserving SDR Gamma Boost to HDR tonemapping.
 + Enable D3D11 Deferred Context Isolation in Metaphor ReFantazio for texture
     caching to track redundant UI resource uploads.

24.10.19
========
 + Auto-load MetaphorFix.asi if placed in Metaphor ReFantazio's install dir.
 + Added sanity check to prevent partially (?) implemented Core Audio APIs
     in Wine from leaking memory when enumerating Windows Audio Sessions.

   * Said leak prevents Special K from working in recent releases of Proton.

24.10.18.1
==========
 + Re-enable Metaphor ReFantazio thread scheduling performance fixes by default
 + Enable DirectInput performance fixes for Metaphor
 + Turn on 6x AF by default in Metaphor (force to 16x if you have GPU to spare)

    * Reset INI file for Metaphor to take advantage of this stuff...

24.10.18
========
 + Added LOD Bias and Anisotropic Filtering overrides for D3D11 games

    >> The INI setting re-uses the D3D12 names, this whole thing will
         have its INI names changed in the future.

      * Use the in-game control panel to adjust Texture Filtering in
          D3D11/12 in the meantime to avoid confusion.

    Real-time adjustment for Anisotropic level and LOD Bias is planned
      for D3D11, but not yet implemented (game restart = required).

24.10.5
=======
 + Disabled thread scheduling fix by default in Metaphor;
     it can be re-enabled by setting AllowDxDiagn=true
 + Turn Flip Model off in Final Fantasy XV for non-HDR users.

24.9.28.4
=========
 + Fixed macros and keybinds occasionally activating while a game window
     does not have input focus if the game uses a (Low-Level) Keyboard Hook.
 + Command console blocks keybinds while it has text input focus, as expected
 + Auto-start PresentMon worker thread if AutoVRR is set to re-optimize and
     has triggered once, or set to enabled and has not yet triggered.
   * This allows SK to auto-optimize the framerate limiter without the users
       having to first open the control panel or display the current FPS.

24.9.28.3
=========
 + Added option to disable Metaphor plug-in for testing
     AllowDxDiagn={true|false}   Default=true (enabled)
 + Reworked DXGI factory initialization when async init is disabled.
 + Disabled window style hooks (GetWindowLong[Ptr]{A|W})

24.9.28.2
=========
 + Automatically set Linear EOTF when enabling HDR in Blt Model sRGB games
 + Add framerate smoothing mechanism to Metaphor scheduling fix

24.9.28.1
=========
 + Add hook on SetProcessAffinityMask (...) to ensure games do not override
     any user-requested overrides.

24.9.28
=======
 + Overhauled input management for keybinds to better handle games with
     child/sibling windows (such as Metaphor's stupid exit confirmation)
 + Add hook on msvcp140.dll!_Thrd_sleep (...) because it may call directly
     into kernelbase.dll!SleepEx (...) instead of kernel32.dll.
 + Re-enable HID in Metaphor because it is required on SteamOS for gamepads.

24.9.27.1
=========
 + Further optimize Metaphor; no more periodic stutter.
 + Set PerformanceCoresOnly=false by default for all games except Metaphor.

24.9.27
=======
 + Use 10-bpc for sRGB bypass when upgrading games to Flip Model in SDR mode.
 + Add Alt+F4 bypass for Metaphor
    (Uncheck "Enable Alt+F4" to remove SK's confirmation dialog)
 + Disable Fullscreen Exclusive in Metaphor
 + Disable XInput slots 1,2,3 in Metaphor
 + Enable XInput emulation by default in Metaphor
 + Add thread scheduling fixes for Metaphor

    * For proper performance, make sure to set the game's framerate limiter to
        "Uncapped" and enable Special K's.   

 + Added INI option to run games on Intel Performance Cores only

     [Scheduler.System]
     PerformanceCoresOnly={true|false}   Default=true

   This will limit the entire game to running only on P-cores, it is enabled
     by default and applies on top of any affinity mask overrides you set, or
       affinity mask overrides set by external applications.


24.9.25.7
=========
 + Fixed forced 10-bpc being applied to AMD's Vulkan interop; it is a compat.
     hack for NVIDIA's interop-only and does not work on AMD's driver.
 + Do not list XInput slot# for UI controller in the Input Management section
     of the control panel when only a PlayStation controller is attached.
 + Revert back to asynchronous initialization by default for Streamline games,
     unless the new AllowFakeStreamline setting is set to false.
 + Force AllowFakeStreamline OFF in Ratchet & Clank
 + Added crash_handler.exe to internal injection blacklist
 + Added up to 100 ms spin if D3D11 hooks initialize before DXGI capabilities
     have been determined (i.e. flip model); if initialization times out, we
       will assume that Flip Model and Tearing are both supported.

24.9.25.6
=========
 + Added option to disable strict Streamline compatibility, because it
     is not compatible with various DLSS3->FSR3 mods that do not implement
       all of Streamline.

         [Compatibility.General]
         AllowFakeStreamline={true|false}   Default=true

     This may hurt stability in games that use real Streamline, but it is
       unlikely the myriad of mods pretending to be Streamline will be made
         more compatible any time soon.

24.9.25.5
=========
 + Added LOD Bias and Anisotropic Filtering options to the D3D12 control panel

24.9.25.4
=========
 + Added INI option to force a Mipmap LOD bias in D3D12 games

    [Render.D3D12]
    ForceLODBias=[-32.0,32.0]  Default=0.0 (Unchanged)

   >> An LOD Bias of 0.0 is technically valid, but using this INI, it cannot
        be set... consider using -0.000001 if you want to force all LOD Bias
          in a game to 0.0 for some reason.

    * Be very conservative with this setting unless you are deliberately
        trying to radically alter the image (lol)

      (i.e. single color flat texturing if a very large positive bias is used)

    - Negative biases increase sharpening and shimmering in texture filtering,
        the most likely use-case for a user to override them would be applying
          a small negative LOD bias to sharpen textures when using DLSS/FSR.

24.9.25.3
=========
 + Check D3D12_FEATURE_DATA_D3D12_OPTIONS19::AnisoFilterWithPointMipSupported
     at runtime before attempting to upgrade bilinear texture filters to
       anisotropic min/mag + point mip filter.

    >> This requires newer drivers and is a Vulkan interop-centric feature;
         if not supported by the driver, bilinear will be upgraded to trilinear
           when forcing anisotropic filtering on.

24.9.25.2
=========
 + Add workaround for implicit AMD OpenGL/DXGI Interop so that OpenGL-IK
     will always work without interference from AMD's D3D12 SwapChain.

24.9.25.1
=========
 + Added warning dialog with info on SKinny (a new support DLL for SK) when
     attempting to use Global Injection in certain Streamline games.

    * Currently, Horizon: Forbidden West and Forza Horizon 5

24.9.25
=======
 + Remove part of SK's libScePad integration now that SK can poll PlayStation
     controllers directly using their USB HID communication protocol.

    >> This fixes weird gamepad behavior in SK's control panel from polling
         PlayStation controllers twice in games that use libScePad.

24.9.24.3
=========
 + Fixed God of War: Ragnarok's fullscreen mode without having to force
     borderless on by default.
 + Fixed potential problem with Special K's global injection DLLs becoming
     stuck in "immersive" process (UWP) due to terminating the teardown listener
       thread early.

24.9.24.2
=========
 + Force AlwaysOnTop off in God of War: Ragnarok to prevent crashes
 + Remove option to disable redirection bitmaps on Flip Model SwapChains
     because this is not compatible with DXVK

24.9.24.1
=========
 + Fixed God of War: Ragnarok SwapChain re-creation failing due to incompatible
     window styles
 + Forced Borderless on by default in God of War: Ragnarok
 + Added additional validation to prevent executing D3D12 command lists on the
     wrong command queue when FSR3 and Streamline are used in a game

24.9.24
=======
 + Added options to force anisotropic level and upgrade standard bilinear or
     trilinear texture filtering to anisotropic in D3D12 games.

    [Render.D3D12]
    MaxAnisotropy=[1,16]           Default: -1 (No Preference)
    ForceAnisotropic={true|false}  Default: false

24.9.23
=======
 + Remove WS_EX_TOPMOST style on windows with otherwise DXGI incompatible
     window styles when calling CreateSwapChain[ForHwnd] (...) to fix an
       obscure problem with Streamline.
 + Fixed games using DirectStorage queues too large for the API to support
 + Window management improvements for Final Fantasy XVI

24.9.20.1
=========
 + Fixed incorrect display topology caching caused by hashing VBlank statistics
     as part of SK_RenderBackend_V2::output_s's invariant data.
 + Reworked Streamline initialization for games that load sl.interposer.dll
     but have not loaded any plug-ins yet when SK is injected.

24.9.20
=======
 + Add hook on sl.interposer.dll slInit (...) in order to override various
     Streamline configuration for enhanced compatibility with third-party
       overlays that do not have any Streamline compatibility measures.
 + Change Streamline initialization, when possible, to use DXGI Factory Proxy
     instead of vftable hooks to help fpsmon and other overlays not crash.
 + Disable attempts by a game to divert or silence Streamline debug output.

24.9.19.5
=========
 + Fixed DLSS control panel not appearing in D3D11 games

24.9.19.4
=========
 + Set DontHookWndProc=true by default in FFXVI to deal with the splash screen

24.9.19.3
=========
 + Handle Final Fantasy XVI's NVIDIA Streamline Interposer trying to
     create a new SwapChain while the game is exiting and has no window
       to create a SwapChain on in the first place... wtf?!
 + Make sure all HDR metadata API calls bypass NVIDIA Streamline's fake
     interposer SwapChain and are directed to the real SwapChain with a
       real display attached.

24.9.19.2
=========
 + Added aggressive anti-stutter mode to FFXVI; trades increased idle
     CPU load for decreased traversal stutter.

24.9.19.1
=========
 + Added auto-loading of .asi files from a game's directory or from
     any subdirectory of Special K's Profiles\<Game Name> directory.

   * This makes SK an automatic ASI loader and eliminates the need
       for third-party software to use ASI mods such as FFXVIFix.

    > Just drop your .asi file(s) into the appropriate directory and go!

    ( Feature is disabled-by-default in most games, but can be opted-in )

      To opt-in per-game, or globally (Global\default_SpecialK.ini), set:

        [SpecialK.System]
        AutoLoadASIFiles=true


 + Added an internal blacklist of third-party overlays that cannot be used
     in NVIDIA Streamline games because they will crash frame generation.

   * These are nothing to do with Special K itself, but blocking them puts
       an end to really cryptic errors from the overlays being blamed on SK.

    Currently only one overlay is known to be 100% incompatible and blocked:

      - fpsmon-64.dll

    This overlay creates useless "Operation Completed Successfully" error
      dialogs and then proceeds to b0rk the game.

    When the developer goes through the hell that is making their overlay
      compatible with NVIDIA Streamline and DLSS3 Frame Generation, the
        software will be removed from the blocklist.


 + Tweaked DirectStorage queue lengths in Final Fantasy XVI

24.9.19
=======
 + Added protection against SteamAPI's internal exceptions being caught by
     NVIDIA Streamline's Interposer DLL and triggering NVIDIA's stupid
       any exception detected ==> minidump crap built-in to DLSS3.

    * Calling SteamAPI functions from overlay code is UNSAFE thanks to NVIDIA
        and their non-defeatable and ill-advised exception handler built-in to
          Streamline.

     Streamline catches exceptions that ARE handled by the software, or are
       continuable, and turns harmless exceptions into full crashes (gah!!).

    sl.interposer.dll is pure evil when officially compiled by NVIDIA using
      the release build configuration.

    @ NVIDIA get that crap out of there please, and remove the codesigned DLL
        DRM so users can at least bypass your boobytrap without losing DLSS3.

24.9.18.6
=========
 + Added sensible limits to DirectStorage thread count sliders
 + Reduced the DirectStorage queue length in FFXVI to reduce stutter

24.9.18.5
=========
 + Added experimental DirectStorage Submit Thread and CPU Decompression Thread
     count overrides to Final Fantasy XVI.

  >> Default Submit Threads are 1; increasing may reduce load time and stutter.

   * Experiment with conservatively, high thread count has been known to crash.
   * CPU decomp threads are unlikely to help unless GPU decomp is disabled.

24.9.18.4
=========
 + Fixed potential "Steam is Offline" errors in Final Fantasy XVI for some users

24.9.18.3
=========
 + Fixed edge-case where DLSS3 Frame Generation is active on a VRR display, but
     SK was not disabling tearing while the game has VSYNC turned off.

24.9.18.2
=========
 + Baldur's Gate 3 has native DualSense support now, but lacks DualSense Edge
     support, so SK is configured to identify DualSense Edge controllers as
       DualSense to make them work natively in Baldur's Gate 3.

24.9.18.1
=========
 + Adjusted SEH Exception logging code for compatibility with GOG Galaxy API

24.9.18
=======
 + Use Flip Sequential by default if a game is already Flip Model and uses
     Sequential, or if upgrading a Blt Sequential game to  Flip Model, or
       if ReShade is loaded.

    >> This helps screenshot compatibility in games when using ReShade.

24.9.17.5
=========
 + Enable "Fake Fullscreen" by default in FFXVI to make HDR less of a nuisance

24.9.17.4
=========
 + Patched out graphics debugger check from Final Fantasy XVI Retail

24.9.17.3
=========
 + Hotfix for DirectStorage instability in Final Fantasy XVI

24.9.17.2
=========
 + Hotfix for VBlank counting thread running while a game has destroyed and
     is re-creating a SwapChain.

24.9.17.1
=========
 + Add RAM warning if used system RAM reaches >= 98% while a game is running
 + Added command console variable to control DXGI Budget Scale (see 24.9.10)

           DXGI.VRAMBudgetScale     (Range: 0.1 - 5.0)

        [ Press Ctrl+Shift+Tab to Open/Close the Command Console ]

      * Some games will respond in real-time to changes to this.
      * Changes made from the command console are saved to SK's per-game INI.
     
     This allows tweaking over- or under-reporting of available VRAM to get a
       game to load in higher detail assets or evict memory to reduce stutter.

     DXGI Budget tracking is used mostly in D3D12 or very advanced D3D11 games;
       
     Nixxes games have a weird Dedicated VRAM => Shared Mem offload system that
       can make tuning this worthwhile on cards with low VRAM (i.e. RTX 3070).

      -> Using a scale slightly above 1.0 will cause Nixxes ports to keep more
           in VRAM and page textures in/out of system memory less often.

24.9.17
=======
 + Disable tearing when using a VRR screen w/ DLSS3 Frame Generation,
     so that FG can use G-Sync instead of ... randomly tear :)

24.9.16.2
=========
 + Improved precision of real-time VRR refresh rate calculation
 + Restored the gray bars of "animation error" (as PresentMon calls it)
     to users with drivers that support HW GPU Scheduling + HW Flip Queue

24.9.16.1
=========
 + Added explicit DwmFlush (...) on a dedicated thread to sample DXGI's
     VBLANK timing information so that it doesn't wobble on drivers that
       support HW Flip Queue.

 + Added CPU affinity INI option

     [Scheduler.System]
     ProcessorAffinityMask=[1,0xFFFFFFFFFFFFFFFF] Default=0xFFFFFFFFFFFFFFFF

    This is a bitmask, so map out the processor numbers you want in binary
      and then convert to decimal.

      (i.e. ProcessorAffinityMask=1365  ->  10101010101  (6 physical cores))

24.9.16
=======
 + Reduced overhead and added smoothing to real-time VRR Rate calculation

  * Uses DXGI Present Statistics when available instead of NVIDIA's VBLANK
      counter. This should translate over to AMD and Intel GPUs in the future.

 24.9.15
========
 + Added Cutscene FPS unlock options for Final Fantasy XVI

24.9.14
=======
 + Fallback to DLL / EXE ProductName / ProductVersion for version info if
     FileDescription / FileVersion is not available (i.e. Starwars Outlaws)

24.9.10.1
=========
 + Fixed incorrect Pixel Shader input signature for Epic overlay in D3D12

24.9.10
=======
 + Added INI parameter to report increased or decreased VRAM capacity to D3D12
     games in order to reduce memory allocation issues.

   [Render.DXGI]
   VRAMBudgetScale=[0.1,5.0] (Default=1.0)

24.9.9
======
 + Fixed FSR3 Frame Gen compatibility issues in FFXVI

24.9.8
======
 + Tidy up DLSS3 Frame Gen compat hacks for Star Wars Outlaws to make them safe
     for use in other games.
 + Added ShadPS4 emulator to list of auto-Vulkan enabled software.

24.9.7.2
========
 + Increase memory pattern scan timeout from 2 seconds to 5 seconds to ensure
     that Steam Input bypass works as expected in Tales of Arise.
 + Scan memory addresses on a 16-byte boundary when disabling Steam Input in
     Tales of Arise to speed up text search.

24.9.7.1
========
 + Re-enable partial debug features in Star Wars Outlaws, otherwise DLSS
     cannot be properly detected.

24.9.7
======
 + Fix window management problems for non-HDR users when disabling NVIDIA's
     D3D12/Vk interop
 + Always use D3D12_RESOURCE_STATE_GENERIC_READ for initial state on GPU upload
     heap resources because some drivers actually validate this

24.9.6.3
========
 + Disable D3D12 Vulkan Interop on NVIDIA drivers in favor of D3D11
 + Disable various debug features when injecting into Star Wars Outlaws
     to avoid the wrath of Ubisoft's multi-layered DRM shenanigans

24.9.6.2
========
 + Fixed all known compatibility issues for Star Wars Outlaws Frame Generation

24.9.6.1
========
 + Restrict synchronous init to games that have Streamline and DLSS-G loaded
     before SK.

24.9.6
======
 + Use D3D12 GPU Upload Heaps for ImGui vtx/idx buffers on supported systems
 + Use synchronous initialization when sl.interposer.dll is loaded before SK
 + Fix incorrect HDR_COLORSPACE_PARAMS struct size in D3D12
 + Fix HDR10 metadata override type

24.9.5.2
========
 + When a game sets HDR modes using NVAPI, do not switch active presets
     if the user has already setup an override.
 + Ignore HDR metadata set using NVAPI

24.9.5.1
========
 + Remove check for number of generated frames.
    * Evidently DLSS3 works no matter what values you set...?

24.9.5
======
 + Improved compatibility with DLSS3 Frame Generation in Star Wars Outlaws
 + Detect DLSS-G as active if DLSSG.NumFrames is 0 or > 1; required for Outlaws

24.9.4
======
 + Added extra frames of delay when capturing a snipped screenshot region for
     games that have more than 2 backbuffers, so that the screenshot does not
       include the light blue snipping rectangle :)

24.9.3.2
========
 + Removed code to lighten images where max tonemapped R,G or B are below 1.0

24.9.3.1
========
 + Disable overbright tonemapping unless luminance scale is >= 1.0

24.9.3
======
 + Enable loading HDR presets in native HDR games even when the override does
     not specify any change to luminance.
 + Auto-switch to HDR10 Passthrough tonemap mode when switching from HDR10
     native to scRGB.

24.8.29
=======
 + Added support for AVIF and JXL screenshots in 32-bit games (finally)

24.8.28
=======
 + Use 2.2 gamma when HDR color correcting third-party overlays instead of sRGB
 + Brighten alpha transparency on Steam overlay in HDR10 mode
 + Add support for UltraHDR JPEG screenshot encoding

24.8.27.1
=========
 + Fixed potential crash if DLSS text OSD is enabled and game completely turns
     DLSS off.

24.8.27
=======
 + Fixed mouse performance issues in Black Myth: Wukong when the cursor is
     inside the game window's client region.

24.8.26.3
=========
 + Fix intermittent mouse cursor flickering after opening SK's control panel
     in some games.
 + Re-implement feature to save and restore mouse cursor position when the
     control panel is opened / closed.
 + Do not center mouse cursor on control panel if it is already hovering one
     of SK's mouse-interactable widgets (i.e. HDR).

24.8.26.2
=========
 + Perform HDR->SDR tonemapping in parallel on multiple threads to reduce
     wait time to paste tonemapped screenshots.
 + Optimize clipboard acquire lock/release behavior.

24.8.26.1
=========
 + Fixed JPEG XL DLLs not downloading correctly when selected from the HDR menu

24.8.26
=======
 + Patch end-of-frame anti-debug checks for graphics debuggers out of FFXVI

24.8.25
=======
 + Implement half-float (scRGB) and uint16 (HDR10) lossless JPEG XL encoding

24.8.24.4
=========
 + Disable Final Fantasy XVI's Splash Screen so it cannot break DirectFlip
     >> Only works for Global Injection

24.8.24.3
=========
 + Reduce the number of threads Final Fantasy XVI uses for JPEG XL screenshots
     in its photo mode to eliminate hitching (libjxl spawns 1 thread per-core).

24.8.24.2
=========
 + Transform HDR10 to scRGB before encoding JPEG XL screenshots in HDR10 games

24.8.24.1
=========
 + Added support for JPEG XL screenshots (64-bit only; 32-bit will be added)

   * Default quality level is 99%, this is primarily a lossy format.
   * JXL lossless compression ratio is poor, but not as poor as PNG.
   * AVIF or PNG are better choices for sharing lossless reference images.

24.8.24
=======
 + Fixed issues with "hide mouse cursor" feature not working in some games
     after alt-tab following changes in 24.5.25.2.
 + Fixed potential black pixel artifacts on ImGui's UI when using HDR10->scRGB
     translation mode.

24.8.22.1
=========
 + Add workaround for FFXVI beeping after Alt-Tab because it thinks the Alt
     key is stuck down.

24.8.22
=======
 + Added FFXVI plug-in to improve JPEG XL screenshot quality after looking at
     the artifacts caused by Square-Enix's default compression settings.

    >> Screenshots are now 16-bpc instead of 8-bpc and quality set to 98.5%

    * Lossless screenshots are possible, but will be significantly larger.

24.8.21
=======
 + Fixed potential DLSS3 Frame Generation crash when exiting Final Fantasy XVI

24.8.20
=======
 + Increased opacity of SK's UI in HDR10 mode.
 + Fixed a typo in ApplySRGBCurve (...) in shaders/common_defs.hlsl that
     would cause black clipping when converting between sRGB and Linear
       when direct copies between two resources are impossible due
         to format mismatch.

24.8.19
=======
 + Correctly distinguish FFXVI from FFXV since the executable naming
     pattern's underscore and store name are consistent.

24.8.18
=======
 + Add LastUsedColorSpace INI setting to help tonemap third-party
     overlays in D3D12 games with native HDR support
 + Reduce luminance histogram buckets for frequency analysis during
     tonemapping to 16384

24.8.17.1
=========
 + Byte-swap > 1-byte fields in PNG chunks when building on x86/x64
 + Use 99.5th percentile luminance for PNG / AVIF MaxCLL as discussed:
     https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9508136

24.8.17
=======
 + Fixed artifacts when using Gamut Expansion on input colors wider than AP1
 + Improved alpha transparency when drawing SK's UI in HDR10

24.8.16.2
=========
 + Fixed PQ being 1/125th as bright as it should be in AVIF and PNG screenshots

24.8.16.1
=========
 + Write 99th percentile luminance to AVIF MaxCLL metadata
 + Improve PQ <--> Linear calculations for pixels in > Rec 709 gamuts
    * Improves HDR->SDR tone mapping in some games

24.8.16
=======
 + Write 99th percentile luminance to HDR PNG clli chunk
 + Reverse the search direction (high->low) when searching percentile cutoffs
     using luminance histogram buckets for larger values and quicker calculation

24.8.11.1
=========
 + Fixed display of achievement titles and descriptions containing % characters
     in ImGui popups since ImGui expects a printf-formatted string...

24.8.11
=======
 + Improved handling of wide gamut scRGB colors when doing HDR->SDR tonemapping

24.8.9
======
 + Apply IDXGISwapChain3::SetColorSpace1 (...) whenever a D3D11/D3D12 SwapChain
     overlay instance is (re)created, for compatibility with RenoDX / ReShade.

24.8.6.1
========
 + Add support for HDR10 UAV upgrades in Trine 4.

     >> Unordered Access View format mismatches were not being handled for
          the case where the original format had the same number of bits as
            the new format (i.e. R10G10B10A2 = 32-bpp, R8G8B8A8 = 32-bpp)

24.8.6
======
 + Ignore texture hashing on D3D11 array textures because injection is not
     supported and it reads from unallocated memory in Trine 4.
 + Increase maximum HDR pipeline remaster RenderTarget size (after upgrade)
     from 128 MiB to 256 MiB. Resources that require more VRAM will continue
       to be ignored, which may affect users supersampling to > 8K.

24.8.4
======
 + Add additional HDR metadata logging in games that use HDR metadata
 + Auto-fix games that use invalid HDR metadata values when SK is not
     configured to disable HDR metadata outright (HDRMetadataType=-2)

24.7.30
=======
 + Improved (brightened) HDR->SDR screenshot tonemapping

24.7.29
=======
 + Remove debug log on calls to ID3D11DeviceContext1::UpdateSubresource1 (...)

24.7.28
=======
 + Use a RenderTargetView's Resource name if the RTV does not have a debug
     name in D3D11 Live RenderTarget View (mod tools).
 + Enable right-click emulation by holding gamepad activation button for
     > 0.4 seconds.

24.7.23.1
=========
 + Change size of sBIT chunk when adding HDR chunks to PNG data to account for
     missing alpha channel

24.7.23
=======
 + Use Windows SDR white level as SDR reference white level in HDR->SDR tonemap

24.7.22.1
=========
 + Slightly increase the overall brightness of HDR->SDR tonemapped screenshots
 + Added option to Global\osd.ini to assign a keybind to toggle command console

    [OSD.System]
    ConsoleToggle=...  Default=Ctrl+Shift+Tab

     * Set ConsoleToggle=<Not Bound> to disable the console

24.7.22
=======
 + When saving HDR->SDR screenshots, use the display's maximum luminance as the
     maximum tonemapped light level if the content's maximum level exceeds it.

   >> Often overlays, UIs, or other unintended things on screen contribute to a
        higher calculated maximum luminance and would dim the tonemapped image.

    * Your display is the mastering display, so the tonemap should adhere to its
        limitations to prevent dimming from details that were not even visible
          to you due to your display's capabilities.

24.7.21.1
=========
 + Add maximum 250 ms initialization sync delay when games call
     D3D11CreateDevice rather than D3D11CreateDeviceAndSwapChain
       to ensure Flip Model SwapChain overrides work.

24.7.21
=======
 + Fixed incorrect ICtCp chroma scaling during HDR->SDR screenshot tonemapping

24.7.20
=======
 + Added default config AsyncInit=false for Crash Bandicoot N'Sane Trilogy
     in order to ensure SK can upgrade it from Blit Model to Flip Model

24.7.17.1
=========
 + Disable D3D9[Ex] and OpenGL hooks in Talos Principle 2 to speed up init
 + Fixed potential loss of window tracking when games create new SwapChains

24.7.17
=======
 + Added fix-up for Talos Principle 2's addition of FSR3 Frame Generation;
     FSR3 always destroys the existing SwapChain and creates a new one when
       toggling frame generation on/off.

24.7.15
=======
 + Disable texture caching in Kingdom Come Deliverance by default

24.7.14.3
=========
 + Fixed OpenGL instability in Tomb Raider 2

24.7.14.2
=========
 + Fixed potential crash in Elden Ring when turning the game's framerate
     limiter back on starting with the latest patch.
 + Added cached memory addresses for Elden Ring 2.2.3.0 to speed-up game start.

24.7.14.1
=========
 + Revert project settings to use the latest Windows SDK version installed
 + Various code has been refactored to eliminate compiler crashing when trying
     to compile SK using clang (lol).

24.7.14
=======
 + Create HDR screenshots directory when saving HDR screenshots as .png, if
     the directory does not already exist.

24.7.13
=======
 + Fixed potentially blown-out SDR tonemapped screenshots caused by ICtCp max
     luminance being stored as a static variable.

24.6.20.1
=========
 + Added 2 second timeout to any memory pattern scan to prevent freezing after
     patches in some games with excessively large executables.
 + Restore framerate unlock support to Elden Ring 2.2.0.0

24.6.20
=======
 + Disable Elden Ring plug-in in versions of Elden Ring newer than 2.0.1, since
     the game no longer uses the original framerate limiting code.

24.6.19.1
=========
 + Truncated iCCP profile from 2195 bytes to 2178 in HDR PNGs generated by SK

24.6.19
=======
 + Correctly handle inverted selection rectangles when snipping screenshots
 + Apply whitebalance fix for SDR tonemapped screenshots
 + Use ICtCp during HDR->SDR screenshot tonemapping

24.6.16
=======
 + Integrated SKIV's HDR->SDR screenshot tonemapping algorithm and apply
     it to all HDR content, whether inverse tonemapped using SK or native.

24.6.15.3
=========
 + Switch to WIC's scanline adaptive PNG encoder optimization for better
     data compression rates while being completely lossless unlike SK's
       previous compression optimization strategy.

24.6.15.2
=========
 + Fixed various cursor management issues when using the new snipping tool.
 + Added gray translucent overlay while snipping mode is active.

24.6.15.1
=========
 + Made screenshot snipping into a dedicated keybind, you must click
     to begin the selection after pressing the keybind. The selection
       rectangle will only show up when clicked.

24.6.15
=======
 + Added support for snipping clipboard-only screenshots (HDR or SDR) using
     the mouse. Press the clipboard-only binding twice to use fullscreen.

24.6.14.3
=========
 + Optimized Perceptual/Color Boost perf. slightly for values > 0% and < 100%

24.6.14.2
=========
 + Fixed unintentional black pixels on some SDR->HDR inverse tonemapped content
     caused by Middle-gray Contrast setting being active when it should not be.

24.6.14.1
=========
 + Fixed selecting AVIF screenshot format not turning HDR PNG off

24.6.14
=======
 + Added HDR PNG as a third format option for saving HDR screenshots to disk
 + Added preference to control whether HDR clipboard screenshots contain
     actual HDR data (PNG; new default) or an SDR tonemapped copy.

24.6.13.3
=========
 + Added display primaries and whitepoint to mDCv chunk of HDR PNGs

     * It was using reference Bt.2020 values because many displays have invalid
         information (i.e. they just report Bt.709), but that may lead to
           oversaturation in SDR tonemapped images.

24.6.13.2
=========
 + Fixed accidental no tonemapping (linear range scaling) introduced in 4.6.12
     when storing tonemapped screenshots in Steam.

24.6.13.1
=========
 + Added cHRM, sBIT, cLLi and mDCv chunks with content and display information
     to captured HDR PNGs to assist color managed software with tonemapping.

24.6.13
=======
 + Added PNG HDR screenshot support
    * A PNG will be copied to the clipboard every time a screenshot is taken
        in HDR games so that you can paste the HDR image directly to Discord.
 + Overbright tonemapping is now disabled when HDR is in passthrough mode

24.6.12
=======
 + Apply separate screenshot tonemaps to native HDR and SK inverse tonemapping.
    * The tonemap used for native HDR content is roughly equivalent, but with
         correct colors, to gamebar's tonemap... so not particularly good.
 + Add warning if a third-party overlay is detected to be interfering with
     window management and preventing keybinds and other input from working.
 + Detect NVIDIA DXGI/Vk interop SwapChains even if the Steam overlay has
     hooked D3D11.

24.6.10
=======
 + Revert HDR->SDR screenshot tonemapping
 + Change HDR overbright bit processing from soft clip (overbright was allowed
     to influence the input to Perceptual Boost and output was scaled down),
       to hard clip (pre-scaled so that output never exceeds tonemap target).
 + Clamp various PQ EOTF encoding functions to [0,oo) since PQ is undefined for
     negative values
 + Apply Perceptual Boost in AP0 colorspace and apply clamp (see note about PQ)

24.6.9.1
========
 + Normalize HDR->SDR tonemapped screenshots if peak white was < 1000.0 nits
     in order to keep relative luminance range in SDR representation
       (i.e. avoid unnecessary dimming).
 + Remove Rec 2020 clamp from various scRGB processing, and replace it with
     simpler logic that only strips NaN/Infinity and keeps maximum FP values
       lower than 65504.0.

24.6.9
======
 + Fix potential Return to Monkey Island crash when opening SK's control panel

24.6.8
======
 + Improved HDR->SDR screenshot tonemapping
 + Apply overbright processing -after- de-gamma
 + Reduced luminance of HDR overbright bits; prevent values > 1.0 in de-gamma
 + Changed default overbright behavior to luminance clip (preserve chrominance)

24.6.5
======
 + Added LosslessScaling.exe to injection blacklist to prevent mistaking the
     Steam version of the software for a game and auto-whitelisting it.

24.6.4.3
========
 + Improved luminance heatmap (exposure) visualization on wide gamut colors
 + Improved NaN/Infinity mitigation performance in FP16 color buffers

24.6.4.2
========
 + Add AllowDxDiagn=false for God of War and God of War Ragnarok
     (assuming executable name contains GoW, case-sensitive)

24.6.4.1
========
 + Add Rec 709 clamp before tonemapping SDR screenshots since gamut mapping
     is not implemented.

24.6.4
======
 + Fix transposed Rec 709 to Rec 2020 matrix so that standard transfer
     characteristics (i.e. Rec 2020 primaries) can be used when converting
       scRGB screenshots to HDR10 for AVIF encode
 + Fix rounding problems in AVIF encode
 + Exposed SDR screenshot tonemapping tuning knobs if PBoost3 slider or
     Gamut Visualizer disclaimer are right-clicked.
    * Lerp scale controls bias towards chroma preservation
        (lower = more saturation at the expense of highlight "whiteness").

24.5.30.1
=========
 + Disable game-specific plug-in for Sekiro
 + Add "background render" option for all games configured to use
     fake fullscreen by default.
 + Activate game windows when engaging Fake Fullscreen
 + Prevent games like Cyberpunk 2077 from minimizing themselves in an
     endless loop at startup.

24.5.30
=======
 + Default Fake Fullscreen mode in NieR: Replicant and NieR: Automata
 + Disable texture caching for non-mipped textures in Kingdom Come...

24.5.29
=======
 + Vectorized NaN / Infinity checks in HDR shaders for better performance
 + Precompute Perceptual Quantization coefficient reciprocals for faster
     scRGB <--> HDR10 transformation

24.5.28
=======
 + Perform overbright processing in Rec 2020 and eliminate Rec 709 clamp
     on input if luminance scale > 1.0

24.5.27.2
=========
 + Add HDR Overbright Bit Tonemapping back as a per-profile INI setting

24.5.27.1
=========
 + Added support for "Any" Role or Architecture to DLL import INI records
 + If "Role" or "Architecture" are missing from a DLL import, they assume "Any"
 + Removed case sensitivity from DLL import config entries
 + Removed HDR Overbright Bits Tonemapping

24.5.27
=======
 + Added GPU clockrate to HDR Processing time since the time to execute varies
     due to power management under low GPU load...

24.5.26.4
=========
 + Added experimental Overbright Bits tonemapping for HDR games that qualify.
     >> The feature is always on and has no configuration at the moment.

24.5.26.3
=========
 + Various minor static analysis guided code cleanup

24.5.26.2
=========
 + Added HDR Screenshot Compatibility Mode checkbox to HDR control panel menu

24.5.26.1
=========
 + Fixed warning triggering in non-D3D12 cases.

24.5.26
=======
 + Add warning, and disable all ReShade functionality, if attempting to load
     ReShade as dxgi.dll or d3d12.dll in a D3D12 game.

24.5.25.4
=========
 + Fixed UI spacing if ReShade is loaded as an add-on

24.5.25.3
=========
 + Removed ReShade Injection keybind if ReShade is already injected
 + Removed ReShade config directory button unless ReShade is loaded as an add-on
 + Removed ReShade Compatibility Mode option if ReShade is loaded as an add-on
 + Removed ReShade plug-in selection if ReShade is loaded as an add-on

24.5.25.2
=========
 + Only handle mouse cursor hide/show functions using PostMessage (...) if the
     calling thread does not already own the game window

24.5.25.1
=========
 + Properly handle "deactivate mouse cursor on gamepad input" for auto-hide

24.5.25
=======
 + Improved reliability of various timer-based and input-based events that
     change the visibility or shape of the Windows mouse cursor.

24.5.24
=======
 + Added more verbose warnings if a PlayStation controller's battery charge
     status is invalid.
 + Hide battery level warnings on DualSense controllers paired over Bluetooth
     while Bluetooth compatibility mode is enabled.

24.5.13
=======
 + Add slightly more reliable force cursor visible/hidden option to cursor
     management UI.

24.5.10
=======
 + Implement 500 msec grace period after rumble motor output before
     switching back to native haptics for DualSense controllers.

24.5.9
======
 + Disable "rumble emulation" on DualSense controllers when there are no
     emulated left/right motor data in order to maintain compatibility with
       games that use native haptics.

24.5.8
======
 + Merge pull request #175 from Aemony:dlss_indicator_oneliner
    * Improved DLSS indicator 

24.5.5
======
 + Fixed removed 2 blank lines in text OSD when displaying console
 + Fixed removed 2 space padding in text OSD when displaying render stats

24.5.3
======
 + Unify ID3D11Device::CreateTexture2D{1} (...) shared logic into
     D3D11Dev_CreateTexture2DCore_Impl rather than forwarding
       CreateTexture2D to CreateTexture2D1

24.5.2
======
 + Merge pull request #166 from Nustat0:fix-32bit-d3d12
    * Added a workaround for 32-bit D3D12
 + Disable hack for flaky D3D12 drivers not reporting VRR correctly

24.5.1
======
 + Changed default HDR Color Boost to 50%
 + Update various HDR and input management tooltips for clarity
 + Added UI to configure PlayStation special button (e.g. touchpad click)
     key bindings.
 + Added "Disable RGB Lighting" option for DualShock 4 / DualSense controllers
 + Added support for environment variable-defined framerate limits

     SK_FPS_LIMIT=...
     SUNSHINE_CLIENT_FPS=... (auto-set by some software, do not use)

   This value will be forcefully applied and immutable, and will not be written
     to INI when game exits.

24.4.29.3
=========
 + Added user-configurable XInput deadzone for PlayStation controllers
     >> Default: 5% (likely too small if a game actually needs this)

24.4.29.2
=========
 + Extend HDR Gamut Expansion slider to 20%
 + Re-word AVIF encoding disclaimer to reflect recent changes in
     Windows support for 4:2:2 and 4:4:4 10- and 12-bpc AV1 images.

24.4.29.1
=========
 + Added 1 frame delay to achievement unlock screenshots

24.4.29
=======
 + Fixed temporary HDR mode not working after the SDR whitepoint option
     was added (24.4.19.1).

24.4.28.6
=========
 + Apply Rec 709 clamping whenever Perceptual Boost is enabled

24.4.28.5
=========
 + Set 33% Color Boost in default HDR profiles
 + Clamp non-native scRGB inputs to Rec 709

24.4.28.4
=========
 + Slightly optimized Perceptual Boost by removing Rec 2020 color clamp.
 + Changed Color Boost to a mix between Pure Luminance and Pure Chrominance
     implementations of Perceptual Boost.

    >> A new slider controls the weighting between Luminance and Chrominance

       * 0.0% and 100.0% are highest performance, since they only run PB once

24.4.28.3
=========
 + Apply non-Color Boosted Perceptual Boost in Rec 2020 colorspace
 + Fixed Reset button in HDR widget not using the same default values as
     used during initialization on first run.

24.4.28.2
=========
 + Default "Color Boost" to off, and use 112.5% saturation as default now
 + When toggling "Color Boost," raise or lower default saturation if applicable

24.4.28.1
=========
 + Added option to apply Perceptual Boost to Chroma (Default) or Luminance
    >> New option is called "Color Boost" when Perceptual Boost HDR is enabled.

24.4.28
=======
 + Moved various Bluetooth settings for DualShock 4 / DualSense controllers to
     the "Compatibility Options" section of the gamepad control panel.

    >> Functionality SK cannot use while Bluetooth is in Compatibility Mode:

         Latency Measurement
         Battery Levels
         Mute Button      (DualSense [Edge])
         Paddle Buttons   (DualSense Edge)
         Function Buttons (DualSense Edge)
         LED Color
         Rumble
         DualShock4 v2 (-ALL- features)

    Compatibility mode exists because older DirectInput-based games only work
      w/ these controllers in Bluetooth mode if the functionality above is not
        used at any time after powering the controller on.

      * If you do not require compatibility with very old games or the ancient
          joy.cpl control panel that ships with Windows, you are encouraged to
            select "Always Enable Full Capabilities in Bluetooth."
 + Changed "Always Enable Full Capabilities in BT" to a global setting.
 + Only take achievement unlock screenshots for actual achievement unlocks
     (i.e. ignore percentage updates for Steam achievements with n/m progress).
 + Added support for achievement popups in Epic Game Store games.
 + Fixed width on achievement popups aligned to the left side of the screen.
 + Set the window title of SK's Aspect Ratio Background to match a game's main
     window so that Discord does not get confused and display the wrong name.

24.4.26
=======
 + Do not display battery level warnings on DualSense controllers in DualShock 3
     mode connected over Bluetooth, because the data is invalid garbage left in
       the Windows HID driver from the last time the controller was in full mode.

24.4.25.2
=========
 + Auto-identify SONY PlayStation controllers as the base model in Unity engine
     games because they often cannot recognize newer models.
 + Auto-identify DualShock 4 v2 controllers as DualShock 4 to Arkham Knight
 + Added Compatibility Options section to control panel for PlayStation
     controllers, where alternate controller identification can be configured.
 + Changed controller identification override INI settings to an integer:

     -1=No Preference  (Default)
      0=Do Not Apply
      1=Apply

    >> This is necessary so that auto-enabling the feature for specific engines
         is possible, and users can reverse the auto-enable decision.

       * Auto-enablement only applies if -1 is set.

24.4.25.1
=========
 + Adjust timing on Epic Game Store Achievement screenshots to catch
     the EOS unlock graphics
 + Place EOS achievement screenshots in Achievements\ subdirectory as
     done with Steam achievement screenshots

24.4.25
=======
 + Added named achievement screenshots for Epic Game Store games
 + Disabled SteamAPI integration in Yakuza 0 by default

24.4.24.5
=========
 + Correctly disable HID output reports for non-Bluetooth devices when
     HID hooks are disabled.

24.4.24.4
=========
 + Disable DualShock 4 v2 controllers running in simplified Bluetooth
     mode.

24.4.24.3
=========
 + Added option to enable full DualShock4 / DualSense capabilities over
     Bluetooth even if a game has not yet put the controller in that mode.

24.4.24.2
=========
 + Added bulletpoint explaining why some DualShock4 / DualSense features
     no longer work over Bluetooth.

24.4.24.1
=========
 + Do not use haptics or LEDs on Bluetooth PlayStation controllers until a
     game first uses rumble, or if the controller is already in
       DualShock4/DualSense mode.

24.4.24
=======
 + Added stupid hack for systems with broken PresentMon running D3D12, where
     VRR status cannot be determined. VBlank rate < Reflex rate is assumed
       VRR active.

24.4.23.5
=========
 + Prevent setting LED color in DualShock 3 Bluetooth Compatibility mode on
     DualShock 4 controllers.

24.4.23.4
=========
 + Slim down NVSDK_NGX_Parameter_GetI_Detour hook, it does not work correctly
     for DLSS resolution scaling.
 + Prevent crashing if DLSS text OSD is enabled, but game has not yet
     fully initialized DLSS.

24.4.23.3
=========
 + Add option to report v1 DualShock 4s as v2, disabled by default because it
     will break games.

24.4.23.2
=========
 + Do not block gamepad/keyboard input (unless set to always disable) during
     the first frame drawn.

    >> Helps some Unity games w/ HID gamepad initialization.

24.4.23.1
=========
 + Do not hook NVSDK_NGX_D3D12_GetFeatureRequirements or
     NVSDK_NGX_D3D11_GetFeatureRequirements unless DLSS feature support
       spoofing is enabled, because the APIs will not return correct values
         if NGX detects they have been hooked.

24.4.23
=======
 + Added options to identify DualShock 4 v2 and DualSense Edge controllers
     to games as DualShock 4 and DualSense respectively, for games that
       understand the general DualShock4 / DualSense protocols but are too
         old to recognize the newer model.

    [Input.libScePad]
    IdentifyDualShock4v2AsDualShock4={true|false}  Default: true
    IdentifyDualSenseEdgeAsDualSense={true|false}  Default: true

    This feature is enabled by default since the communication protocol
      between these different models is the same, and games generally do
        not make use of special features like DualSense Edge's paddles.

﻿24.4.21
=======
 + Added hooks on NGX Get/SetULL, GetI, SetD for DLSS completeness
 + Apply analog input deadzone to idle controller determination, even if
     deadzone is not being applied to input readings sent to games.
 + Reverted default Forza Horizon 5 settings to workaround anti-debug.

24.4.20.2
=========
 + Fixed AVIF HDR screenshots with content that exceeds 10k nits or
     125.0 (scRGB) in a single color channel producing inverted color.

24.4.20.1
=========
 + Fixed rare ImGui color overflow if gamepad capture status changes
     in the middle of drawing the control panel's input management tab.
 + Give Windows Media Foundation (HW video acceleration) surfaces a
     fast-path that avoids texture caching hooks in D3D11.
 + Added DLSS config parameter to spoof HW feature support for some
     broken DLSS implementations (i.e. Harold Halibut's Unity DLSS).

       [NVIDIA.DLSS]
       SpoofFeatureSupport={true|false}  Default: false

    * Only works for D3D11/D3D12, SK ignores broken Vulkan stuff :)

24.4.20
=======
 + Merge pull request #165 from audaki:fix-hdr10-gamut-visualizer
    * Fix hdr10 gamut visualizer
 + When enabling HDR image processing on native HDR games, processing
     will now stay enabled on future launches. Making it easier to
       do simple fixes like rescale maximum luminance without ReShade
 + Made Resizable BAR easier to right-click in Display menu

24.4.19.3
=========
 + Add current game's relative executable path to DRS profile on NVIDIA
     GPUs if the fully-qualified path is not present when attempting to
       read a driver setting DWORD.

24.4.19.2
=========
 + Added Resizable BAR status to Display menu on NVIDIA GPUs
     >> Setting can be changed (per-game) by right-clicking it

24.4.19.1
=========
 + Added SDR White Level slider to the control panel's Display menu
     >> This sets the OS SDR white level for the current display
 + Automatically apply system SDR white level preference at game start
     >> Fixes bug in Windows caused by OpenGL and Vulkan apps setting SDR
          white level to 80.0 nits temporarily and never restoring it at exit.

24.4.19
=======
 + Allow XInput emulation setting to apply even for real Xbox controllers
     in games that use Windows.Gaming.Input. This allows background input,
       which is impossible in the native UWP API.
 + Reduced the strictness of Rec 2020 color clamp and limit FP16 black pixel
     fix logic only to -pure- black pixels, not pixels that have one or two
       ~0.0 color channels.
    >> Should improve appearance and gradiation of highly saturated colors

24.4.18
=======
 + Merge pull request #164 from audaki:main
    * Fix gamut visualizers
 + Dump textures with actual names to subdirectories honoring their name,
     to make working with named textures simpler.
 + Prevent selecting 11-bpc Render Pass Remastering in Tales of Arise
 + Ignore Windows Media Foundation D3D11 devices for video playback in games.
 + Improved support for Windows.Gaming.Input emulation, includes rumble
     and secondary trigger rumble (impulse trigger) data is added as
       additional mild rumble.
       
      >> Will attempt to simulate the secondary trigger rumble using haptics
           waveform stuff in the future, current solution is adequate.

24.4.17.3
=========
 + Added full support for HDR remastering in Harold Halibut, with
     the exception of 8-bpc Compute Shader Passes.

24.4.17.2
=========
 + Added OBS's hook caching executables (get-graphics-offsets{32|64}.exe)
     to SK's internal injection blacklist.
 + Added support for XInput Emulation for PlayStation controllers in games
     that use Windows.Gaming.Input (mostly Microsoft Store games).

    >> The Windows.Gaming.Input API is not currently emulated, instead this
         causes games to resort to XInput fallback code...

       This means a few Windows.Gaming.Input features (i.e. Impulse Triggers)
         for real Xbox controllers will not work.

    * The plan is to eventually emulate the Windows.Gaming.Input API proper,
        and translate Impulse Triggers to DualSense Force Feedback Triggers.

24.4.17.1
=========
 + AutoVRR re-application no longer requires having the control panel open

24.4.17
=======
 + Added feature to reapply AutoVRR optimization if the display device or
     its refresh rate change after the framerate limit was originally setup.
 + A global policy controlling whether AutoVRR is reapplied has been added
     to the AutoVRR config menu (policy is on by default).
 + If AutoVRR is not set to re-apply, a warning icon will be shown next to
     the framerate limit slider to indicate it was set when the display had
       different settings.
 + Added a notification toast to indicate when AutoVRR has been applied.

24.4.16
=======
 + Fixed ImGui color stack overflow when displaying Frametime Method tooltip

24.4.15.3
=========
 + Added warning dialog if SK is injected into a D3D10 game; standard Windows
     MessageBox, since SK cannot draw anything in D3D10 :)

 + If SK is injected into two or more games at once and one of the games is
     currently in the foreground, gamepad input will be blocked to the 
       games running in the background.

 + Added mechanism to disable VRR while SK is applying a background FPS limit,
     so that the game does not cause all applications on the system to run at
       a low framerate.

     >> It is critical that you never force VSYNC on in driver settings, or
          applications that want to opt-out of VRR will be unable to and they
            will harm the performance of all other applications on the system.

24.4.15.2
=========
 + Added Auto Exposure to DLSS control panel
 + Hide Auto Exposure and Alpha Upscaling overrides unless the game uses them,
     or they were already forced on/off in SK's INI for the current game

24.4.15.1
=========
 + Removed option to force DLSS Alpha Upscaling -On- in DLSS 3.7.0, only
     forcing it Off or not overriding it at all are valid options.
 + Added options to use UNORM rather than FLOAT Render Targets for HDR remastering
     >> Right-click the HDR widget

24.4.15
=======
 + Removed ImGui nav focus on plot widgets (i.e. Framepacing Graph) when using
     keyboard or gamepad in the control panel
 + Condensed Frametime calculation selection in advanced Framerate Limiter view
 + Blacklist openxr_load.dll while SK is injected into games, because it will
     deadlock when the game exits. It's optional and for VR, so not a big deal.

24.4.14
=======
 + Fixed incorrect battery level for DualShock 4 Bluetooth controllers
 + Added support for binding DualShock 4 trackpad click to keyboard input
 + Correctly handle DualSense (Edge) / DualShock 4 macro binds when multiple
     gamepads are connected or if the same gamepad is connected via USB and Bt

24.4.13.4
=========
 + Fixed unintentional repeated keyboard input if a gamepad button -> key
     binding is held for more than a couple of frames
 + Only send KeyUp notifications for bound gamepad buttons when transitioning
     from down to up (duh?)
 + Give gamepad -> keyboard input synthesis a dedicated thread in order to
     avoid synchronous OS input queue work on render/game-critical threads.

24.4.13.3
=========
 + Added sanity checks for CPU/GPU/Disk update intervals in case INI files
     have acquired values of 0.0; Sane Range = [0.125,2.5] (in seconds).
 + Turned XInput deadzone compensation -Off- by default, only a handful of
     games actually need this... and it makes those that don't harder.

24.4.13.2
=========
 + Achievement popups no longer steal input focus away from the control panel,
     and always raise their popup over top any widgets below them.
 + Fixed several menu items in the Control Panel that might not be selectable
     using a gamepad or keyboard (i.e. "File | Exit" and Latency Analysis).

24.4.13.1
=========
 + Improved support for ReShade overlay while SK is blocking keyboard input
 + Improved handling of DualSense Edge macro keybinds
 + Added TouchpadClick macro binding for DualSense + DualSense Edge

24.4.13
=======
 + Removed unnecesary load of dxgidebug.dll when user did not request
     SK's D3D11/12 debugger.

24.4.12.4
=========
 + For users using the default Steam Overlay, ReShade and Epic Game Store
     overlay activation keybinds (Shift+Tab, Home, Shift+F3), SK always
       allows these button combos to pass-through and activate the overlays.

 + Added support for activating gamepad button -> keyboard bindings even when
     a user has disabled keyboard input to the game.

   >> Gamepad generated kbd input will pass-through the normal input blocking

 + Added implicit Latency Waitable SwapChain support to D3D12 games that do
     not use the feature; since it is not possible to control device latency
       in D3D12 (only SwapChain latency).

24.4.12.3
=========
 + Disable Mipmap Generation on BC6H or BC7 textures, it's -too damn slow-!
 + Preliminary support for narrowing down the textures shown in the D3D11
     Render Mod Toolkit based on resolution, format, mipmaps, usage, etc.

24.4.12.2
=========
 + DualSense Edge users can now bind the Left/Right Function buttons and
     Left/Right Paddles to a single button on your keyboard.

    (e.g.)

      [Input.libScePad]
      LeftFunction=F5
      RightFunction=F6
      LeftPaddle=Tab
      RightPaddle=Enter

    This applies to individual game INIs, and is not stored in Global/input.ini

     * Future versions will allow multiple keys to be bound, or instead of
         creating keyboard input, send a command to the command console.

24.4.12.1
=========
 + Added explicit wait for frames drawing an achievement popup to finish
     GPU-side before unloading the achievement icon; stability improvement.

24.4.12
=======
 + Disabled redundant mode change skip code if NV's Streamline Interposer
     is loaded. (Helps prevent crashes in Horizon: Forbidden West (Steam))
 + Remove code that prevents games that natively use a Latency Waitable
     SwapChain from using IDXGISwapChain::ResizeTarget (...).
 + Extended the range of the FPS limit slider to 1.25x Refresh Rate
 + Revert parts of battery level measurement changes from 24.4.11

24.4.11.1
=========
 + Added more logging if achievement statistics are not working because of
     server-side problems on https://backend.special-k.info

24.4.11
=======
 + Improved PlayStation controller battery measurement;
     Percentage = 3.1 fixed-point instead of Percentage = Level/0xA
 + Made PlayStation controller critical battery level a user-configurable
     setting (right-click the Bluetooth PlayStation controller battery).
 + Battery level warnings will go away after plugging the controller in.

24.4.6.1
========
 + Improved fit of Alpha Upscaling override option in control panel, and
     add indicator for its current state.

24.4.6
======
 + Changed description of DLSS Preset E from Invalid to (DLSS 3.7.0+)
 + Added option to force alpha upscaling on/off if DLSS 3.7.0 is present

24.3.30.1
=========
 + Permit local injection in Ratchet and Clank, as it no longer crashes the game's
     launcher for the CreateDXGIFactory mismatch issue mentioned in 24.3.30.

    * Turning HDR on/off using local injection will still crash the game, so it is
        not suggested if you have an RTX 4xxx GPU (Streamline issue).

24.3.30
=======
 + Fixed NVIDIA Reflex not working in Ratchet and Clank without an injection
     delay because the game uses multiple API versions of CreateDXGIFactory;
       all calls will now forward through to CreateDXGIFactory2
 + Permit local injection for Horizon: Forbidden West even if Streamline is not
     disabled.

24.3.29.1
=========
 + Fix potentially leftover ReShade.ini files in game's working directory if
     ReShade DLL is loaded as a plug-in but does not cleanly unload.
 + Disable NvAPI_Mosaic_GetDisplayViewportsByResolution API calls because they
     take 300 ms to return for each monitor installed in Nixxes games and are
       called during startup and every time you open graphics settings.

24.3.29
=======
 + Prevent delayed global injection if the 64-bit Epic Overlay is loaded,
     because Epic's overlay will deadlock in its LoadLibrary hook.

24.3.28.1
=========
 + Attempt yet more fixes for Nixxes Streamline / DLSS-G problems, if in doubt
     always delete sl.dlss_g.dll from a Nixxes game and avoid Frame Generation.

    >> 0.01 ms injection delay re-introduced to Nixxes games if sl.dlss_g.dll
         is loaded; note that this will cause RTSS to crash Ratchet and Clank.

    >> Give user error message if local injection is attempted in a Nixxes
         game that uses Streamline and either sl.interposer.dll or sl.dlss_g.dll
           have not been deleted.

24.3.28
=======
 + Added DLSS options to text OSD

24.3.27
=======
 + Fixed Plug-In install path tooltip only printing first character in a path
     because std::filesystem::path (path).c_str () returns wchar_t*

24.3.26.3
=========
 + Fixed various issues with the keyboard and gamepad control panel directions
     in the startup banner depending on the current input devices present

24.3.26.2
=========
 + Added 2 pixel DLAA compat hack default settings for Dragon's Dogma 2

24.3.26.1
=========
 + Fixed Reflex breaking in Horizon Forbidden West and various Nixxes games

24.3.26
=======
 + More fixes for Nixxes Streamline implementation, in particular their launcher
     which loads sl.interposer.dll, but does not initialize it and then crashes

24.3.25.2
=========
 + Disabled unfinished Shin Megami Tensei 2 plug-in

24.3.25.1
=========
 + Added warning to DLSS section of control panel if DLSS frame generation may
     be b0rked in a game because the Streamline Interposer was loaded before SK

    >> Frame Generation generally works in these scenarios, but the reported
         framerate will be the real framerate rather than generated framerate,
           and SK's UI will be completely screwed up.

         * SK HDR (non-native) cannot be used without flickering if this happens

      -- Tooltip explains possible solutions...

24.3.25
=======
 + Improved compatibility with some HDR native games using DLSS-G
 + Improved compatibility with Nixxes DLSS3 Frame Generation games
 + Global injection delay no longer necessary in Horizon Forbidden West
 + If HFW crashes when turning on HDR (Epic version), try deleting the
     Epic Overlay DLL as instructed in startup notification

24.3.24.1
=========
 + Changed "Frametime Method" setting in Control Panel to "Graph Measurement"
     to avoid implying any affect on the behavior of SK's framerate limiter.
 + Freed references to SK's own DLL acquired using GetModuleHandleEx (...) during
     CBT hook initialization and shutdown.

24.3.24
=======
 + Added 1 ms global injection delay to Horizon Forbidden West to make it work
     with Nixxes' wonky Streamline code if the Epic Overlay is turned off.

24.3.23.3
=========
 + Fixed HDR10 HDR->SDR screenshot tonemapping applying Rec2020 twice in D3D12
 + Corrected hue shift on colors wider than Rec 709 when saving scRGB AVIF
     screenshots

    * Microsoft Edge now supports AVIF, and Windows can properly decode 4:2:2
        and 4:4:4 encoded screenshots w/ appropriate updates to AVIF codec.

        Tooltip left unchanged because it is unlikely most users have received
          the necessary update to handle 10- and 12-bit 4:2:2 / 4:4:4 content.

      -- Eventually, those will be portable high-quality encodings :)

24.3.23.2
=========
 + Load Horizon Forbidden West HDR Fix earlier to workaround Steam DRM
 + Corrected internal DLSS resolution reporting in Nixxes games

24.3.23.1
=========
 + Default Auto VRR Optimization to enabling VRR Optimized Framerate Limiter
     >> Before, it would only do so for Ultra Low Latency (not default).
 + Changed Ultra Low Latency to only control Reflex Boost by Latency Markers
 + Changed VRR Bias to: Optimal VRR (Reflex Rate) - 0.5% instead of + 0.1 FPS
 + Clicking VRR Bias in the Framerate Limiter section will now immediately
     engage the closest VRR Bias'd rate if framerate limiting is enabled.
 + AutoVRR mode will automatically engage and lower the framerate limit if
     the limit is set higher than refresh, even if AutoVRR already triggered
       one time.

24.3.23
=======
 + Replaced "Start-to-Start" frametime mode with a frametime method setting
 + Frametime measurement method is now a global setting
 + Added "Frame Pace" to frametime measurement method and made it the default,
     to use SK's framerate limiter delay point as the frame interval timing
       point.
 + When "Frame Pace" is selected, but the limiter is not enabled, frametime
     measurement will implicitly use "Start-to-Start" now.
 + Moved the Frametime Method setting underneath framerate limit in Advanced.

24.3.22
=======
 + Merge pull request #153 from Nustat0:fix-empty-api-name
    * Update Active API if its name is empty
 + Integrated Ersh's Horizon Forbidden West HDR fix and updated it for
     Steam -and- Epic versions of the game.

24.3.21
=======
 + Fixed implicit frametime sample collection done in framerate limiter wait
     function when start-to-start mode is turned off.

    >> Sampling is always done in the Present hook now, either before the
         real Present function is called, or before the hook returns.

    * VRR optimized mode is applied post-present and thus would sample from the
        same side of the Present call whether start-to-start was enabled or not

24.3.19
=======
 + Apply fake HID device removal + arrival compat hack only to SDL games
 + Reduce the VRR refresh rate update frequency to make it easier to read

24.3.18.5  ( Rant on Display setting that warrants explanation )
=========
 + Removed unintentional Auto-VRR Optimization on forced G-Sync status check

   >> NOTE that Auto-VRR Framerate Limiter optimization does not work on
       NVIDIA systems if the "Display G-Sync Status" option is turned off.

     * That option exists historically because G-Sync status APIs in NvAPI have
         wonky performance overhead because SK is among the only software to
           ever use the driver API to check VRR status in D3D9/D3D11.

     [ The unpredictable overhead is a non-issue in modern versions of SK... ]

   Fun fact:  NVIDIA did not even know who was responsible for maintaing
                that part of NvAPI when we discussed implementing it for
                  D3D12/Vulkan/GL.

         NV opted to create an entirely new API (rofl) instead of extending the
           original one to support D3D12/Vulkan. SK has had enough time working
             with their new API to iron out its performance overhead as well,
               so the setting is largely irrelevant.

    Tl;Dr:  "Display G-Sync Status" is somewhat of a misnomer and turns off
              various NVIDIA VRR-related functionality as opposed to simply
                not showing you this status in the control panel.

24.3.18.4
=========
 + Added current VRR refresh rate to NVIDIA Latency Analysis section.
 + Removed the button to trigger Reflex Latency Analysis flash for displays
     that support the feature since it requires GFE overlay integration.
 + Terminate HID Input/Output threads rather than using normal thread exit,
     because pending overlapped IO may cause TLS-related crashes on DLL unload.

   >> Hacky solution, but these threads live for the entire lifetime of the DLL
        and the DLL only unloads at application exit; skipping cleanup to avoid
          a crash is harmless.

24.3.18.3
=========
 + Fixed issues with "Continue Rendering" not working in SDL games because hooks
     on GetFocus (...), GetForegroundWindow (...), GetActiveWindow (...) and
       GetGUIThreadInfo (...) were returning the game's window handle before SK
         was fully initialized.
 + Disable DirectInput in Ni No Kuni 2 because it will crash if it encounters a
     DualSense controller and attempts to read it using DirectInput.
 + Register the SK_HID_Listener class using a unique window class name per-process
     so that it window class registration will never fail.
 + Extend HID input blocking to GetRawInputData

24.3.18.2
=========
 + Fixed potential imaginary numbers in VRR VBlank counter in 32-bit builds on
     the first frame drawn, and then compounded into a rolling-average that stays
       imaginary.

24.3.18.1
=========
 + Add effective VRR Refresh Rate to text OSD if VRR Compact mode is enabled or
     if G-Sync status is enabled and detailed framerate stats are enabled.

24.3.18
=======
 + Support latency measurement on DualShock 4 controllers
 + Improved analog deadzone handling on DualShock 4 controllers
 + Added Gamepad Chord Button tooltip explaining all the default bindings

24.3.17.3
=========
 + Moved the PlayStation battery indicator to polling rate / latency line
     >> Power-saving mode (DualSense) is now accessed by right-clicking battery
 + Moved the Guide/PlayStation button options to a single shared setting
 + Xbox and PlayStation controllers can simultaneously share slot 0 now, based
     on which controller has had the most recent input.

   >> The XInput API activity light will show the PlayStation logo when PS is
       overriding Xbox.

24.3.17.2
=========
 + Fixed potential unclean DLL unload caused by HID Input Report Consumer and
     Output Report Producer threads sleeping on I/O failure during DLL unload.

24.3.17.1
=========
 + Reset all internal device state after reconnecting PlayStation controllers
 + Gave PlayStation controllers more descriptive names rather than using the
     USB/Bluetooth name SONY assigned them
 + Added gamepad serial # tooltip to PlayStation controller list
 + Fixed mute button not working on DualSense controllers

24.3.17
=======
 + Added Gamepad Chord Input (Guide button) support for Xbox controllers
 + Added bullet-point to Protocol / Device Name list to denote the
     PlayStation controller with the most recently polled input state.
 + ALL PlayStation controllers will now rumble while XInput Mode is on
 + Control panel is now useable with PlayStation controllers while a real
     Xbox controller is plugged-in on slot 0.

     >> If a PlayStation controller is connected, PlayStation XInput Mode
          will always hide native Xbox controller 0 from the game.

      * A mode to fuse Xbox and PlayStation into a single virtual controller
          that games read on slot 0 like SK does for its own UI is planned.

24.3.16
=======
 + Added Protocol, Device Name, Latency and Active Report Rate info
     to the control panel for supported PlayStation controllers.

24.3.15.2
=========
 + Continue calculating VRR refresh rate even if the Framerate Limiter
     heading in the control panel is not expanded.
 + Add preliminary infrastructure for measuring HID device latency on
     devices that support Input/Output timestamps (i.e. DualSense).

24.3.15.1
=========
 + Fixed SDL not picking up the first digital input after a deadzone'd
     analog input was not translated to XInput.

24.3.15
=======
 + Smooth VRR VBlank rate calculations slightly to avoid unreadable jumps
 + Added XInput deadzone filtering (on by default) to XInput emulation for
     PlayStation controllers because some SDL games do not handle deadzone.

24.3.14.2
=========
 + Added VRR scanout rate to Control Panel's GSync Status for NVIDIA users

24.3.14.1
=========
 + Only write HID Output Reports (rumble, lights, powersave mode) when
     the data between two consecutive calls to write_output_report (...)
       actually have new info to send to a PlayStation controller...

24.3.14
=======
 + Added new option to control the size of HID's input queue to assist
     games that use native DualShock/DualSense w/ latency reduction.

   >> Reduced circular queue depth to 3 from OS default of 32; missed inputs
        are theoretically possible at very low framerates.

       DS4Windows already uses a -0- buffer queue by default, so SK will
         cause no more dropped inputs than DS4Windows or Steam Input do.

 + New option technically works for all HID devices, but many games do
     not use HID and instead use Steam Input; setting does not apply.

   * The option -DOES- apply to SK's own XInput Emulation, however.

24.3.13.3
=========
 + Moved the start-of-frame event marker to the very end of Present, after
     any driver latency markers, etc.

24.3.13.2
=========
 + Fixed spacing issue on Frame Start-to-Frame Start checkbox if framerate
     limiter is not enabled.
 + Added additional tooltip detail to Frame Start-to-Frame Start
 + Added sanity check for games making excessively long calls to Sleep

24.3.13.1
=========
 + Added Frame Start-to-Frame Start frame time measurement to make SK
     more consistent with new PresentMon and RTSS methodology.

   >> This setting can be found under: Framerate Limiter | Advanced >

    * Has not been tested in all combinations of APIs and layered
        APIs (GL/Vulkan/D3D9/DXGI) -- Pure D3D11/12 is well-tested.

24.3.13
=======
 + Added support for int64 command console variables
 + Added support for powering-off specific Bluetooth HW Addrs instead
     of ALL controllers
 + Improved support for connecting the same gamepad using Bluetooth and
     USB simultaneously

24.3.12.1
=========
 + Merge pull request #150 from Nustat0:d3d12-32bit-fixes
    * Fixed some checks that prevented 32-bit D3D12
 + Merge pull request #144 from Nustat0:dgvoodoo-interop
    * Detect D3D8/DDraw/Glide in SK_dgVoodoo_CheckForInterop (...)

24.3.12
=======
 + Fixed RawInput device registration flags causing no Mouse and Keyboard input
     in Planet Coaster
 + Compatibility hack for Wrath: Aeon of Ruin to delay window activation
 + Remove unnecessary synchronous INI write when changing HDR tonemap mode

24.3.11.2
=========
 + Added tooltip text explaining the XInput latency test only applies to
     third-party drivers and cannot be used to test SK's own latency
       (as it would always be 0).
 + Write HID output reports to (wired) PlayStation controllers if an
     RGB / Mute LED override is active instead of waiting for first vibration.

24.3.11.1
=========
 + Fixed LED brightness reverting to Mid when override is turned off and on
 + Clear PlayStation controller rumble when exiting a game so that it does not
     sustain the vibration until the controller eventually stops on its own.

24.3.11
=======
 + Remember LED brightness and color settings for DualShock4/DualSense
     controllers when toggling the override off.
 + Add support for writing neutral input values when blocking DualShock4 input
     to games (wired-only).

     (Previously it would reuse the last input data, which often includes
       the buttons you used to toggle the control panel)

24.3.10
=======
 + Improved gamepad compatibility with Wrath: Aeon of Ruin
 + Added 15 frame device refresh timer in case SK was injected after a game
     setup its HID devices and SK would otherwise not be able to control them

24.3.9.1
========
 + Removed yet more CAPCOM log spam

24.3.9
======
 + Remove assertion on CancelIoEx (...) when responding to HID device removal
 + Added code to prevent logging per-frame HDR support checks (ugh) in CAPCOM
     games.

24.3.4.1
========
 + Fixed potential deadlock in Wrath: Aeon of Ruin during window activation

24.3.4
======
 + Added an option to reset NVIDIA driver profile settings to default state
     using RunDLL_NvAPI_SetDWORD and a tilde (~) instead of a hex value.

     rundll32 "SpecialK64.dll", RunDLL_NvAPI_SetDWORD 0x000F00BA ~ game.exe

   * This will reset the reBar Enable driver setting to whatever the driver
       was originally intended to do for game.exe.

24.3.3
======
 + Merge pull request #147 from Nustat0/more-refresh-rate-factors
    * Add more Refresh Rate Factors
 + Merge pull request #136 from Nustat0/targetfps-factor
    * Added ability to specify TargetFPS/BackgroundFPS as refresh rate factor
 + Fixed Yuzu disconnecting controllers after opening SK's control panel in
     input exclusive mode caused by 24.3.2.2

24.3.2.3
========
 + Added Reloaded-II.exe and Reloaded-II32.exe to internal injection blacklist

24.3.2.2
========
 + Reduce overhead when blocking HID device read requests made by games using
     overlapped I/O (asynchronous).
 + Prevent stale input data from being returned to games when an overlapped I/O
     request times-out.

24.3.2.1
========
 + Handle subclassed windows when sending games Device Change Notifications
 + Send one Device Change Notification per-HID controller when blocking HID

24.3.2
======
 + Removed private D3DKMT and D3D11 DLL symbol exports from SK
 + Passthrough D3DKMT proc address queries to the real DLL if SK is
     locally injected as d3d11.dll

24.3.1.6
========
 + Added PS+Circle (Switch to Last Application) to complement "Switch to Game"
 + Unminimize application windows when attempting to activate them

24.3.1.5
========
 + Allow PS+Square (Switch to Game) to cycle between multiple running games
 + PS+Square works even if background input is disabled for a game
 + Changing volume using chorded gamepad input will unmute the game

24.3.1.4
========
 + Added logging if a DLL being hooked using SK_CreateDLLHook2 (...) was
     not already loaded, to diagnose loader lock contention.
 + Load HID.dll, dinput8.dll and dinput.dll _before_ attempting to hook.

24.3.1.3
========
 + Add 1 ms delay between Device Change Notifications sent to other threads
     when enabling / disabling input APIs to keep Unity from crashing...

24.3.1.2
========
 + Bound PS + Square to "Switch to Game" to activate the game window
     if is in the background.
    >> Requires "Continue Rendering", and Gamepad Input set to "Enabled"

24.3.1.1
========
 + Added console variable: HDR.Luminance , floating-point, 1.0=80 nits
 + Bound PlayStation + Left / Right to HDR +/- 10 nits
     >> Changes made this way are temporary

24.3.1
======
 + Reduced ReadFile hook overhead when handling HID device files

24.2.29.2
=========
 + Fixed potential nullptr deference when calling SK_XInput_Enable (...)

24.2.29.1
=========
 + Block USB DualSense input better when opening the control panel,
     in games that use native PlayStation HID for input.
 
24.2.29
=======
 + Added += and -= operators to console command processor
 + Added initial support for PlayStation Button + ... chorded input;

     Current defaults:   ( Will be configurable in the future )
       PS + Share/Create = Screenshot
       PS + Triangle     = Power-Off (the gamepad)
       PS + L3           = Play/Pause Media
       PS + R1           = Next Media Track
       PS + L1           = Prev Media Track
       PS + Up           = +10% Game Volume
       PS + Down         = -10% Game Volume

 + Gamepad input is now blocked to games while holding the PlayStation button
 + Control Panel opens when -releasing- the PlayStation button, if no chord
     combinations are triggered.
 + Chorded input only applies if the option to open SK's control panel using
     the PlayStation button is enabled.
 + Do not show sRGB Bypass options in the Display menu to HDR users, since
     HDR uses a different setting for that.

24.2.28.2
=========
 + Fixed mis-detection of sRGB OpenGL framebuffers
 + Removed some debug logging from DirectInput8 backend

24.2.28.1
=========
 + Enable D3D11/12 <--> Vulkan interop for all hardware vendors, since there is
     no way to turn it off on AMD drivers anymore.

24.2.28
=======
 + Add workaround for AMD's D3D12/OpenGL interop; it can no longer be disabled
 + Run Bluetooth power-off commands from a single thread to help prevent games
     that do not have thread-safe input code from crashing
 + Update NieR: Replicant plug-in to work with new HID input code
 + Default sRGB OpenGL games to Linear content EOTF in HDR
 + Properly disable 10-bpc OpenGL overrides in sRGB games

24.2.22.3
=========
 + Made VRR status in Compact FPS mode (text OSD) a configurable OSD option

24.2.22.2
=========
 + Add Bluetooth Input-Only mode, to prevent removing DualShock 3 compatibility
     mode from DualShock 4 / DualSense controllers; allows some games that
       might not normally support PlayStation controllers over Bluetooth to work.

    * This mode is pointless, and unwanted if using XInput Emulation. It is
        intended for games that have native PlayStation controller support.

      >> SK cannot set lights or use vibration in this mode unless you also
           plug the controller in.

     ] See the Battery icon in PlayStation control panel for more info.

24.2.22.1
=========
 + Show Bluetooth controller battery icon in Input Management control panel
     even if the controller is fully charged or an error has occurred, so
       that users can click it to disconnect the Bluetooth controller.
 + Improved ability to deal with multiple PlayStation controllers, including
     different types connected at the same time.
 + Added +666 ms input activity timestamp to all Bluetooth controllers when
     deciding which controller had the most recent input.
     
   * This ensures that the same device connected via USB and Bluetooth
       simultaneously never registers duplicate inputs if HID input reports
         are processed out-of-order.

24.2.22
=======
 + Added new Screensaver Behavior to disable the system screensaver while the
     game's window is fullscreen and active.

     * This mode is enabled by default, as that is the most sensible behavior...

   >> Refer to Window Management | Input/Output Behavior | Screensaver Behavior

 + Added a notification if SK has blocked screensaver activation because the game
     is fully covering the monitor it is drawing on (i.e. fullscreen) and active.

 + Fixed notifications that are intended to be shown once, as indicated by use
     of SK_ImGui_Toast::ShowOnce flag, not actually acquiring this property if
       no notification INI entry exists for the notification type.

24.2.21.6
=========
 + Initialize SK_NtLdr_LockLoaderLock and SK_NtLdr_UnlockLoaderLock during
     MH_Initialize rather than deferring this until MH_ApplyQueuedHooks; avoids
       very rare deadlocks if other software has hooked GetProcAddress (...).

24.2.21.5
=========
 + Restored support for blocking input to games that poll DirectInput using a
     custom device GUID (i.e. NieR: Replicant)
 + Handle Rx and Ry axes (analog left/right triggers on Xbox 360 gamepads) as
     absolute coordinate axes rather than relative when returning neutral input
 + In games that use low-level keyboard hooks, check the process that owns the
     foreground window when processing input rather than the focused window

24.2.21.4
=========
 + Added rumble motor strength normalization for games that do not respect the
     XInput device capabilities reported (0-255). Instead, the strength will
       be normalized to the largest value (up to 65535) the game has used.

24.2.21.3
=========
 + Added full support (rumble,buttons,lights,battery) for Bluetooth DualShock 4

24.2.21.2
=========
 + Improved thread-safety on WM_DEVICECHANGE notification

24.2.21.1
=========
 + Option to disable HID will actually block games from creating \\?\hid...
     files now instead of simply returning neutral data if attempting to read
 + When toggling XInput/HID API Blockage or turning on XInput Mode, call the
     game's window proc with a WM_DEVICECHANGE message.

    >> Previous attempt to do this used PostMessage (...), which never works.

24.2.21
=======
 + Added full support (rumble, buttons, lights, battery) for USB DualShock 4
 + Added partial support (buttons, battery) for Bluetooth DualShock 4
    * Pairing a DualShock 4 to Bluetooth AFTER SK has used it as USB tends
        to require a full game restart.

24.2.20.1
=========
 + Removed DirectInput debug code for XInput that could crash some games.

24.2.20
=======
 + Fixed potential crash in multi-threaded D3D9 games when drawing ImGui's UI
 + Improved XInput Mode controller hot-plug support in some games

24.2.16.7
=========
 + Apply the DualSense brightness slider to the color LEDs around the trackpad
     as well. The HW setting actually only affects the mute button and player
       indicators, but SK will now dim the lightbar as part of the setting.

24.2.16.6
=========
 + Support selecting the control panel's battery icon to power-off a DualSense
     controller iusing a gamepad / keyboard
 + Add PlayStation icon to XInput API version in Input Management status when
     a game is actively polling PlayStation translated input using XInput
 + Fixed XInput translation version sometimes not appearing and reporting native
     1.4 in games that are not actually native 1.4
 + Expand the Input Management / Gamepads section of the control panel by default
     if a PlayStation controller is plugged-in

24.2.16.5
=========
 + Added option to completely kill Steam Input by placing ValvePlug.dll in Steam's
     install directory and then launching any game using SKIF. The Steam client
       will remain patched with Steam Input killing code until restarted.

    This works best if you launch a game using SKIF while the Steam client is not
      already running. Otherwise the client has partial Steam Input functionality
        and Valve can still harm you.

 + Removed the terms "Experimental" and Emulation from PlayStation XInput Mode,
     it's very reliable now :)

24.2.16.4
=========
 + Fixed unintentional removal of Floating-Point from R11G11B10 rendertargets
     in 24.2.16.3

24.2.16.3
=========
 + Added option to use UNORM instead of FP for HDR remastering on sub-native
     resolution render passes. This helps with artifacting on bloom effects.

   [SpecialK.HDR]
   KeepSubnativeRemastersUNORM={true|false}  Default=false (use floating-point)

 + Defaulted Granblue Fantasy: Relink to using UNORM for sub-native passes.

24.2.16.2
=========
 + Only reset the firmware LED lighting in Bluetooth mode if user has
     configured LED color overrides

24.2.16.1
=========
 + Enable RGB overrides on DualSense controllers in Bluetooth mode

24.2.16
=======
 + Added option to override DualSense RGB colors
 + Added option to override DualSense RGB brightness

24.2.15.3
=========
 + Added ability to power-off Bluetooth DualSense controllers
     >> Click the battery icon in the control panel
 + Added console command to power-off gamepads:

     Input.Gamepad.PowerOff 1

   * You can bind this to a keyboard macro to hotkey gamepad power-off;
       eventually it will be bound to a PlayStation + <button> chord input.

24.2.15.2
=========
 + Added battery indicator to control panel for DualSense controllers when
     running in Bluetooth mode.
 + Added option to control powersaving mode on DualSense controllers (BT).

24.2.15.1
=========
 + Apply XInput slot disable options to SK's own emulation of XInput
 + Apply rumble disable option when emulating XInput

24.2.15
=======
 + Properly handle calls to ID3D11Device[3]::CreateTexture2D[1] (...) with
     nullptr passed for ppTexture2D when HDR remastering is enabled

24.2.14.2
=========
 + Fixed potential buffer overrun if a game calls GetRawInputData (...) with
     an uninitialized header.

24.2.14.1
=========
 + Fixed stack overrun in Hollow Knight caused by it calling XInputGetStateEx
     with an incorrectly sized data structure on the stack.

24.2.14
=======
 + Added full support for Bluetooth DualSense; vibration, lights and battery
 + Better handle transition between USB and Bluetooth PlayStation data xfer
 + Added XInputGetStateEx emulation for games that use SDL and poll gamepads
     using Microsoft's undocumented entry-point to get guide button status
 + Added debug mode option for XInput Emulation

24.2.13.5
=========
 + Added proper HID VID/PID detection using IOCTL_HID_GET_DEVICE_ATTRIBUTES
     instead of parsing UNC device paths.

24.2.13.4
=========
 + Handle situations where DualSense controllers are both USB and Bluetooth
     at the same time; use the device's Bluetooth data instead of USB.

24.2.13.3
=========
 + Added protection against DualSense controllers with missing buttons
     according to the HID / SetupAPIs (which are manipulated by Steam).

24.2.13.2
=========
 + Initial support for Bluetooth DualSense controllers
     >> Vibration, lighting and battery level are not supported yet

24.2.13.1
=========
 + Revert recent changes to window management that broke Fallout: New Vegas

24.2.13
=======
 + Fixed a few thread race conditions during initialization and shutdown
 + Fixed a typo on the SteamAPI 'Disable Integration' checkbox's tooltip
 + Fixed mismatched utf-8 source files in various code units

24.2.12.2
=========
 + Added Notification Section to the Control Panel
 + Added User-Configurable Notification Corner
 + Added Notification ID to its Config Menu
 + Added Silent Notification Mode
 + Added flags to create notifications that cannot be silenced, that do
     not store settings in notifications.ini and have custom config modes
 + Most Control Panel settings that used to synchronously write changes
     to an INI file now do so asynchronously using a dedicated thread.

24.2.12.1
=========
 + Fixed SK processing keyboard input (triggering its keybinds) while Granblue
     Fantasy Relink's window is not even active, due to the game's unusual
       Raw Input device setup.

24.2.12
=======
 + Add new INI option to keep 8-bpc HDR remastered Render Targets UNORM instead
     of Floating-Point for games with shaders that do not work correctly in FP.

   [SpecialK.HDR]
   Keep8BpcRemastersUNORM={true|false}  Default=false (use floating-point)

   * Defaulted Granblue Fantasy Relink to UNORM for 8Bpc HDR Remasters


24.2.11.6
=========
 + Add workaround for incompletely implemented ID3D11Device3::CreateTexture2D1
     API in DXVK.

24.2.11.5
=========
 + Supplement changes in 24.2.11.4 with hooks on:

     ID3D11Device3::CreateRenderTargetView1
     ID3D11Device3::CreateShaderResourceView1
     ID3D11Device3::CreateUnorderedAccessView1

   * All forms of HDR remastering are now supported in Granblue Fantasy Relink
       and any other game that uses these higher-versioned device interfaces

24.2.11.4
=========
 + Added hooks for ID3D11Device3::CreateTexture2D1 (...) to catch otherwise
     missed Render Targets and Textures in Granblue Fantasy Relink;

     * This allows HDR remastering, previously only textures created using
         ID3D11Device::CreateTexture2D (...) were processed.

24.2.11.3
=========
 + Add SK_ImGui_Toast::UseDuration to Notification Initialization Message

24.2.11.2
=========
 + Increased rumble emulation strength on DualSense controllers

24.2.11.1
=========
 + Added support for changing Bordered Window <---> Borderless Fullscreen
     using the Display menu; previously you had to change to Borderless
       as an intermediate step.
 + Resolved flickering issues caused by Epic popup windows when
     Multitasking-on-Top (or "Fake Fullscreen") mode are in use.

24.2.11
=======
 + Block WM_STYLECHANGING and WM_STYLECHANGED messages to games,
     because it has been causing flickering problems when Steam and
       Epic popup a notification on top of the game using an OS window
         (as opposed to their in-game overlay).
 + Added default settings for Granblue Fantasy Relink to address the
     rampant controller disconnect problems on alt-tab.

24.2.10.4
=========
 + Added cursor auto-hide on gamepad input option to cursor management,
     see "Input Management | Mouse Cursor".

24.2.10.3
=========
 + Limit SONY HID input devices to limited set of USB Product IDs that
     SK knows about (all standard DualShock 3/4, DualSense [Edge] models),
       and do not attempt to read input from anything else for now.
 + Fixed potential crash in OpenGL drivers that do not have support for
     glGetTextureParameterIivEXT

24.2.10.2
=========
 + Wait until user clicks Save Settings before applying "Never Show"
     to notifications.
 + Fixed checkbox to show detailed latency analysis statistics being
     drawn at x,y coordinate (0, screenpos.y) and not being visible.
 + Do not move the ImGui cursor to the center of the control panel upon
     opening the control panel if it is already over top a widget that
       is capturing mouse input (e.g. HDR widget).

24.2.10.1
=========
 + Add 25 second notification explaining how to configure notifications;
     * Start by configuring that notification to never show it :)
 + Removed requirement for AVX instructions

24.2.10
=======
 + Automatically turn Background Render mode on when using "Fake Fullscreen"
 + Ignore all calls to ChangeDisplaySettings (...) when "Fake Fullscreen"
     is enabled.
 + Count the number of OpenGL contexts created, and disable calls to
     ChangeDisplaySettings (...) if more than 0 and OpenGL-IK is enabled.
 + Remove assertion on PlayStation controllers with more than 2 pages of
     buttons, and log and ignore the device instead.
 + Ensure that special PlayStation buttons (i.e. PS Button / Mute) do not
     trigger SK bindings while the window is in the background, unless the
       user has enabled background gamepad input.

24.2.9.4
========
 + Clear XInput controller vibration before calling XInputEnable (...).
 + Improved handling of SK_ImGui_PollGamepad_EndFrame (...) if it is
     called multiple times in a frame.
       (e.g. SK is emulating XInput and DS4Windows is too)

24.2.9.3
========
 + Optimized SK_Battery_UpdateRemainingPowerForAllDevices (...), it was
     only supposed to run every 5 seconds, not every frame!
 + Optimized ZwSetInformationThread_Detour (...) to only duplicate handles
     for various anti-debug workaround parameters.

24.2.9.2
========
 + Only process WM_WINDOWPOSCHANGED messages where NOSENDCHANGING was not
     specified when SetWindowPos (...) was called.
 + Stop sending fake WM_NCACTIVATE messages when background rendering is
     enabled and non-client deactivation occurs.

24.2.9.1
========
 + Fixed potential double-activation of control panel preventing it from
     being opened using a keyboard.

24.2.9
======
 + Switched XInput emulation Input/Output Report Consumer/Producer threads
     to Async Overlapped I/O for better performance and lower latency.

24.2.8.4
========
 + Removed 1+ frame(s) of latency from XInput emulation
 + Optimized SK_D3D11_IgnoreWrappedOrDeferred for lower overhead in D3D11 games
 + Reduced number of times WindowFromPoint is called during ClipCursor

24.2.8.3
========
 + Remove HDR remastering options when using DXGI-Layered Vulkan
 + Optimized PlayStation controller rumble

24.2.8.2
========
 + Apply Tales of Arise button swap when running using SK's own XInput
     emulation.
 + Allow haptic feedback in SK's control panel on DualSense controllers
     even if XInput emulation is turned off.

24.2.8.1
========
 + Added controller vibration to XInput emulation for PlayStation controllers.
     >> Currently only works for wired controllers, and only for DualSense.

24.2.8
======
 + Added option to disable SteamAPI integration to the Steam | Compatibility
     section of the control panel.

    >> "No Draw Overlay" option can still be used with SteamAPI stuff disabled,
         but not much else can.

24.2.7.9
========
 + Fixed XInput activity indicator not lighting up when using XInput Emulation
 + Added support for DualShock 3 controllers

24.2.7.8
========
 + Fixed SK not blocking input to the game when its control panel is open and
     XInput emulation is active (lol).
 + Enable XInput Placeholding on XInput slot 0 when enabling XInput emulation

24.2.7.7
========
 + SKinput Beta:
   ------------
    XInput emulation now available for PlayStation 4/5 controllers.

     For games that do not use other parts of the XInput API to detect connected
       controllers, polling continuously, SK can now replace DS4Windows (*).

    (*) Only tested on wired USB controllers; vibration not yet implemented.

    >> See: Input Management | Gamepad | PlayStation  (DualShock 4 / DualSense)

  + SK no longer requires DirectInput to read the D-Pad or analog axes, and can
      get all input state directly from HID without interference from Steam!

24.2.7.6
========
 + Added Battery Low warning for actual computers, not just game controllers.
 + Remove right-click tooltip on notifications after user right-clicks.

24.2.7.5
========
 + Added settings for all common notifications to control how long they are
     visible for, whether they can appear multiple times per-game, or disable
       them completely.

    >> Right-click a notification to configure it.

24.2.7.4
========
 + Added success notification when D3D11 Texture Mods have been detected and
     will load.
 + Added success notification when a Plug-In is loaded.
 + Replaced all warning dialogs with warning notificiations.

24.2.7.3
========
 + Replaced Assertion Failure dialogs with error notifications (20 seconds)

24.2.7.2
========
 + Replaced VRAM warning popup with warning notification (20 seconds, one-time)

24.2.7.1
========
 + Fixed UTF-8 character encoding issues in a few source files, which caused
     garbled text on some of ImGui's menus.

24.2.7
======
 + Added notification system to replace the annoying orange text warning popups
 + Added notification when XInput controller batteries are <= 25%
 + Muting or changing a game's volume using hotkeys (Ctrl+Shift+PgUp/Dn/Home)
     displays a notification in the bottom-left corner indicating the volume.

24.2.6.2
========
 + Added section to 'Input Management | Gamepads' to control blocking individual
     input APIs to games, so that if a game natively supports non-Xbox devices,
       the game uses the native API when DS4Windows or Steam Input are active.

    >> Blocking XInput may allow games to use a device's native button prompts.

 + Renamed DisablePS4HID setting in SK's INI to simply DisableHID

24.2.6.1
========
 + Added warning dialog if game crashes with Illegal or Priviliged Instruction
     exception and RTSS is loaded; Detours compatibility mode usually fixes.

24.2.6
======
 + DualShock 4 controllers can be used with SK's control panel now without any
     sort of XInput emulation.
 + Fixed Start+Select (Share + Whatever) not working as a way of opening SK's
     control panel on PlayStation controllers (PlayStation button should work).

24.2.4.2
========
 + Optimized D-Pad button polling for Dual Sense controllers.
 + Steam Input PS bypass only working in a few games; may never work reliably.

24.2.4.1
========
 + Avoid polling native Steam controller if XInput slot is >= 4
 + Bypass Steam Input's bull@#$% so that SK can actually poll the controller's
     buttons while Steam Input is enabled... thanks Valve, really appreciated.

24.2.4
======
 + Added native support for Dual Sense controllers in SK's UI; all except for
     haptic UI freedback (this will be used only if DS4Windows emulates XInput)

24.2.3.5
========
 + Added internal list of games that do not correctly support 10-bpc or 16-bpc
     HDR and hide these options from users / force INI values to use the
       alternative format.

    * Currently Blood, Batman Arkham Knight and Noita are 16-bpc disallowed

24.2.3.4
========
 + Fixed Valve's half-assed HDR overlay implementation that does not have
     configurable luminance levels. Their new shaders are once again replaced
       with SK's configurable shaders.

    >> Use the HDR menu to control Steam's overlay luminance, the slider is
         only available in D3D11 games, but it also applies in D3D12
           (just no real-time adjustments in D3D12)

24.2.3.3
========
 + Only pump SKIF's redraw if SKIF is in the foreground

24.2.3.2
========
 + Fixed double hook on ShowCursor (...)
 + Eliminated unnecessary file attributes query before opening some files

24.2.3.1
========
 + Optimized control panel open/close and fixed cursor not changing to SK's
     in some applications when opening the control panel

24.2.3
======
 + Improved mouse cursor auto-hide behavior in some games that check the
     return value of ShowCursor (...) and call the function infinitely until
       they get the value they expect.

    >> Do not do this; if no mouse is attached, the value never changes (!!)

24.2.1
======
 + Fixed unintentionally pumping SKIF's heartbeat message when the game
     SK is active in is already the foreground window


24.1.31.2
=========
 + Fully revert initialization changes introduced in 24.1.27
     (a7d133a4e186e66240e1f21a12734d934437b9ed) for compatibility

24.1.31.1
=========
 + Added local injection version number to system registry
 + Fixed SK's HW mouse cursor failing to show up when hovering certain windows

24.1.31
=======
 + Reverted default state of "block mouse input while no game cursor is visible"
    to disabled, because it interferes with games ability to show the cursor in
      response to movement in UI screens.
 + Fixed a few issues with mouse cursor sporadically appearing

24.1.30.5
=========
 + Add 133 ms heartbeat message to wake SKIF and keep it redrawing when SK is
     setup in "Continue Rendering" mode, in order to avoid the game losing VRR
       during Alt-Tab (while injection service is running).

24.1.30.4
=========
 + Spawn PresentMon worker thread if text OSD's FPS text is enabled in D3D12,
     otherwise the VRR indicator will not work

24.1.30.3
=========
 + Moved Raw Input input activity to the end of the API list since it is the
     least likely API to be sampled every frame
 + Continue tallying Raw Input mouse events while the mouse is blocked

24.1.30.2
=========
 + Fixed issue preventing SDR users from using DXGI/Vulkan interop on NV GPUs

24.1.30.1
=========
 + Added grayed-out input API state to control panel when SK is blocking an API
    that the game is attempting to read

24.1.30
=======
 + Re-introduced DXGI/D3D11 "wait for init" behavior when using global injection,
     for compatibility with games like Sonic Frontiers.     

       * (Wait For Init was removed in 24.1.27.x)

24.1.29.x
=========
 [.10]+ Fixed race to initialize in Microsoft Store version of Firewatch when
          activating Unity's game window at start.
 [.9] + Always use 'Backspace' rather than localized key name for startup banner
          keyboard combo.
 [.9] + Only show PlayStation controller directions in the startup banner if an
          appropriate controller is connected.
 [.8] + Fixed Epic Game Store games not resolving their config directory correctly
          after introducing SKIF-defined profile names 
 [.7] + Fixed potential DLL loader deadlock during debug symbol loads
 [.6] + Fixed uPlay Epic Game Store games not being detected as EGS due to uPlay
          launcher not forwarding the -epic-app command line switch to the game
 [.6] + Added support for SKIF-provided profile directories for config/log files
 [.5] + Fixed Epic Game Store localized game name resolution sometimes using the
          name of a game's DLC rather than the name of the game.
 [.4] + Improved "Block Input when no cursor is visible" to rule-out false
          positives caused by SK's own cursor.
 [.4] + Cursor auto-hide works as intended when mouse input is constantly disabled
          to the game (cursor will timeout and vanish when not hovering SK's UI)
 [.3] + FalloutNV.exe works with local and global injection now, but please
          avoid local injection if at all possible because it WILL break.
 [.2] + Fixed various OpenGL and HID issues if user tries to use local injection
          as dinput8.dll; highly discouraged and unreliable.
 [.2] + Disable EOS overlay in 32-bit software so that it does not deadlock
 [.1] + Turn off DontHookWndProc in Dragons Dogma Dark Arisen for compatibility
          with DXVK
 [.1] + Handle a possible Structured Exception in iSK_Logger::close (...) during
          DLL unload.

24.1.29
=======
 + Display XInput slot enablement/placeholding status in XInput slot tooltips
 + Hide XInput Packet Sequencing debug info unless SK is actively keeping a
     disconnected controller alive.
 + Simplified XInput Slot checkboxes, and added a yellow state to indicate when
     SK is blocking input to the game
 + Expose PlayStation controller options previously only shown in control panel
     when a game uses libScePad.dll.

    >> All (wired) PlayStation controller users now have access to them, but
         some (trackpad remapping) still only show up in games using libScePad.

24.1.28.6
=========
 + Avoid requesting new (unchanged) HID Preparsed Data every time a PlayStation
     controller is polled to reduce input polling overhead.
 + Forward a game's XInput poll requests through SK's Steam-Free XInput DLL
     if [Input.Steam] Disable=true is set, so that Steam cannot screw with it.

24.1.28.5
=========
 + Added Steam Input auto-bypass: Copies hid.dll, setupapi.dll, kernel32.dll
     from system directory to <SK_Install>\Drivers\{HID|SetupAPI|Kernel32}\...

   >> This prevents Steam Input from intentionally breaking the APIs used to
        communicate with input devices without using their proprietary API.

    * PlayStation controller features in SK now work if Steam Input is enabled.

24.1.28.4
=========
 + Added support for muting/unmuting games using a DualSense's mute button
 + Added support for opening SK's control panel using the PlayStation button
 + Removed Waitable SwapChain option from control panel; if you -really- want,
     it can still be configured manaully using SK's INI.
     
    >> Waitable SwapChains are discouraged, use Reflex or Latent Sync instead.
 
24.1.28.x
=========
 [.3] + Added Presentation Interval Clamp setting to SwapChain settings;
          clamping is disabled if user manually sets an interval outside of
            the VRR compatible clamp range: [0,1]
 [.2] + Added "VRR" to compact FPS text in OSD, if G-Sync is active
 [.1] + Prevent showing SwapChain settings for multiple APIs when SK is running
          in a layered environment (e.g. DXVK on DXGI, is both Vulkan and D3D11).

24.1.28
=======
 + Changed the default mouse capture behavior when the control pane is open;
     unless a game is showing the Windows cursor, mouse input while the cursor
       is -not- over the control panel will be blocked.
 + Added support for enumerating/hot-plugging PlayStation controllers w/ HID

    >> Will be used for native UI control w/o XInput, and to bind special
         buttons such as Dual Sense's mute button to mute/unmute the game.

      * This functionality already exists, but only for games that use
          SONY's native input API.

24.1.27.3
=========
 + Eliminate the need for an injection delay when launching DOOM Eternal

24.1.27.2
=========
 + Added Window thread activity to unresponsive TopMost removal logic, since
     stupid engines like Unreal stop processing window messages while playing
       full motion video.
 + Removed debug log spam related to window topmost state

24.1.27.1
=========
 + Changed Xbox game test to use \Content\ in game executable path, and
     formally blacklist gamelaunchhelper.exe
 + Added idTechLauncher.exe to injection blacklist so that injection into
     DOOM Eternal works reliably
 + Added 5 second injection delay to DOOM Eternal
 + Enable Vulkan Bridge for DOOM Eternal by default so non-HDR users can
     also use Special K :)
 + Moved end-of-frame TopMost status check into the thread added in 24.1.27

24.1.27
=======
 + Added a thread that runs every 250 ms to remove TopMost status from games
     if they have stopped drawing frames, so that users don't get stuck with
       game windows that cover the full screen, are top-most and unresponsive.

24.1.26.x
=========
 [.3] + Fixed D3D11 HUDless screenshots not snapping early enough, because
          the number of screenshot stages changed.
 [.2] + Fixed missing HUDless screenshot keybind in control panel, because
          the number of screenshot keybinds changed.
 [.1] + Turn off XInput auto slot-0 assignment if the UI slot is not valid
          (i.e. user has disabled UI control by setting UISlot=4)

24.1.26
=======
 + Merge pull request #134 from MapleHinata/main
    * Enable Streamline workarounds for Yakuza: Infinite Wealth #134
 + Merge pull request #133 from Nustat0/fix-saving-config-for-ddraw-d3d8
    * Fix various config settings not saving for local D3D8/DDraw injection
 + Fixed problems in latest versions of Yuzu where SK hooks Qt's OpenGL test
     window rather than the actual render window (i.e. no UI mouse input)
 + Fixed not being able to set Borderless mode in the control panel if
     Fullscreen Window mode is set in INI (it should be implicitly borderless)

24.1.24.2
=========
 + Fixed API detection issues in Stardew Valley
 + Improved support for UWP games on Microsoft Store
 + Add detection for XInput devices that are Steam Input virtual controllers

24.1.24.1
=========
 + Show option to control Gamepad Backgropund Input behavior even if XInput
     hooks have been disabled
 + Improved support for SteamInput when switching between two running games.

24.1.24
=======
 + Implemented enough of ImGui to draw a warning telling users to turn
     OpenGL-IK on if they try to run SK in pure OpenGL mode
 + Fixed potential wglGetProcAddress problems when locally injecting SK
     as OpenGL32.dll (highly discouraged due to OpenGL ICD complications)

24.1.23.1
=========
 + Skip Steam achievement friend statistics calculation in offline mode
 + Optimized SteamInput AppId override w/ CreateProcess instead of ShellExecute
 + "Fake Fullscreen" preference now applies during SwapChain creation if a game
     tries to -create- a Fullscreen SwapChain rather than the best-practice of
       transitioning from an initially Windowed SwapChain to a Fullscreen one.

 + Added option to prevent games from changing your display's refresh rate

    [Display.Output]
    AllowRefreshRateChanges={true|false}  Default: true

   * This setting is also available in the Fullscreen Setup menu
       (right-click Display Resolution status text)

24.1.23
=======
 + Give "Fake Fullscreen" mode implicit "Multitasking-on-Top" behavior if user
     has not configured a window layering preference
 + Fixed incorrect handling of WM_SHOWWINDOW causing spurious window activation
 + Prevent games from using SetCursorPos (...) and ClipCursor (...) while their
     window is not in the foreground

24.1.22.x
=========
 [.4] + Fixed flickering UI in some D3D11 games
 [.3] + Fixed accidental early-return in SK_Steam_ForceInputAppId (AppId64_t appid);
 [.2] + Update SteamAPI compatibility to SDK v1.57 (full) + 1.58a (partial/broken?!)

24.1.22.1
=========
 + Update SteamAPI compatibility to SDK v1.57 (full) + 1.58a (partial/broken?!)
 + Added compatibility with "Enigma Protector" games; you must launch them
     at least one time as a normal game, not using SKIF's "Instant Play".

   >> Reset your INI for said game if you have already run a game that
        was recently patched to include CAPCOM's stupid new toy.

 + Fixed HDR presets occasionally switching to Raw Framebuffer mode if a
     game turns HDR off while SK is overriding HDR.

24.1.22
=======
 + Automatically patch Ni No Kuni2's NvAPI HDR bug on affected versions;
     though its native HDR is terrible and you should not use it!
 + Modified hook on NvAPI_Disp_HdrColorControl <Get> to return DXGI's
     HDR mode rather than NVAPI's (which requires FSE).
 + Slightly reduced dbghelp memory usage if crash handler is disabled;
     probably only significant in 32-bit games with lots of mods.

24.1.21.3
=========
 + Add SWP_ASYNCWINDOWPOS to SetWindowPos hook if called on the game's window
     from a thread that does not own that window (fixes Disgaea PC deadlock)
 + Revert CancelIoEx to CancelIo because it was leaving orphaned threads waiting

24.1.21.2
=========
 + Use CancelIoEx (...) when cancelling overlapped HID while input is blocked
 + Use SendMessageTimeout (...) when simulating WM_DEVICE_CHANGE for games
     that run their window message loop on the same thread as render
 + Reduced MinHook memory reserved space for better 32-bit compatibility
 + Added spinlock to SK_DXGI_IsFakeFullscreen (...) because D3D9 SwapChain
     QueryInterface has potential to deadlock

24.1.21.1
=========
 + "Experimental" tab in HDR widget renamed "Details" and no longer requires
     Adaptive Tonemapping or Perceptual Boost to be enabled.
 + Details tab in HDR widget auto-expands if Compute Pass Remastering or
     Adaptive Tonemapping are enabled.
 + Clicking 'Enable Processing' when Raw Framebuffer Tonemap is selected now
     turns SK's own HDR on persistently. (i.e. saved to INI and always-on)
 + Added partial support for mipmapped and array texture HDR remastering
     >> Resources that are BOTH mipmapped and array (i.e. cubemaps), are
          unsupported.
 + Added more detailed error messages when HDR remastering fails, so that
     users can disable the correct HDR remaster type (compute/render, bits)

24.1.21
=======
 + Added Fake Fullscreen indicator to SK's Control Panel when active
 + Added option to enable/disable Fake Fullscreen in D3D11/D3D12 games
     >> Right-click the Framebuffer Resolution status in the control panel
 + Added checks to ensure desktop resolution is >= fullscreen resolution
     before engaging Fake Fullscreen.

24.1.20.3
=========
 + Improved Fake Fullscreen Mode to work with Elden Ring
     >> Also turned it on by default in Elden Ring, Yakuza *, Nioh, Sekiro
 + Fixed NvAPI HDR not turning off when set to off in-game settings

24.1.20.2
=========
 + Added code to translate NvAPI HDR API usage to DXGI
 + Added option (to go along with NvAPI HDR) to lie to games and tell them
     they are running in Fullscreen Exclusive, while SK translates this to
       Borderless Fullscreen.

    [Render.DXGI]  (Only implemented for DXGI: D3D11/D3D12)
    FakeFullscreenMode={true|false}  Default: false  (sorry, not on by default)

    * Consider adding to SK's Global master/default, needs more testing before
        it can be made the default policy.

    -> Has known aspect ratio issues, if the game requestes a fullscreen res.
         with a different aspect ratio than the desktop.

24.1.20.1
=========
 + Handle DXGI SwapChains created without Shader Input bind flags
     (Monster Hunter Stories 2) when applying Flip Model upgrade
 + Automatically apply window procedure hook bypass to all CRAPCOM DRM games

24.1.20
=======
 + Added Input.XInput|DisableSlots setting to Input Management control panel

     >> Click the "XInput Slots" checkboxes until they turn red, this will
          make all input polled on these XInput slots return neutral data to
            prevent double-input.

      * Intended use-case is DS4Windows + Steam Input, where Steam Input creates
          a duplicate XInput controller because ... ask Valve why.

24.1.19.1
=========
 + Add message explaining that Ratchet and Clank's DirectStorage settings cannot
     be changed if DLSS3 Frame Generation is enabled
       (Global Injection Delay is needed for DLSS3 to not break)

24.1.19
=======
 + Blacklist crashpad_handler.dll (yes, .dll) from applications that SK injects
     into because it prevents saving SK's INI in Dave the Diver

24.1.18.2
=========
 + More Steam Input hacks; you can ignore the comment from 24.1.18.1 :)

24.1.18.1
=========
 + Add workarounds for Steam Input not allowing the overlay to be opened

     >> Do not set gamepad background behavior to "Disabled in Background",
          or you may have to open and close the Steam overlay before
             Steam Input stops breaking your game.

24.1.18
=======
 + Partially restore RawInput device registration hook code in order to prevent
     games from disabling legacy Win32 keyboard and mouse messages
       (legacy keyboard messages include Alt+F4)

24.1.17
=======
 + Ignore colorspace changes in games if SK has explicitly selected an HDR preset;
     DXVK may asynchronously set a different (wrong) colorspace during gameplay.

    * This has most of the benefits of the recent redesign, for users playing
        native HDR games, but it won't switch to native scRGB/HDR10 if you change
          settings in-game.

24.1.16.5
=========
 + Force colorspace overrides at all times if vulkan-1.dll is loaded in order
     to prevent problems caused by DXVK
 + Disable wndproc hooks in Dragon's Dogma Dark Arisen because DXVK9 subclasses

24.1.16.4
=========
 + Add support for turning HDR on/off in games using their in-game settings as
     long as SK has no user-forced override turned on (fixes Alan Wake 2)

24.1.16.3
=========
 + Disable CRAPCOM DRM workaround (SteamAPI aspect) on Steam Deck, or Proton
     will report corrupted save files
 + Fixed problem that could prevent Alan Wake 2's undocumented scRGB HDR mode
     from engaging when it resizes the SwapChain from RGB10A2 to RGBA16F
 + Automatically enable linear content EOTF in games that use native scRGB HDR

24.1.16.2
=========
 + Fixed incorrect HDR preset activation when detecting native HDR

24.1.16.1
=========
 + Added automatic injection delay to Ratchet & Clank so that its implementation
     of Reflex will work and allow DLSS-G Frame Generation to work
 + When a game changes HDR colorspaces now, SK will automatically put its own
     HDR processing into the correct Native HDR10/scRGB mode to make life easier

24.1.16
=======
 + Block all 4 XInput slots while the control panel is using gamepad, because
     some games would respond by switching to a different XInput slot and continue
       getting input (from duplicate controllers) in Steam Input games
 + Add tooltips to the Haptic Feedback and Disable All Rumble options in SK's cpl
     >> They serve two different purposes and this was not always clear

24.1.15.2
=========
 + Extend CRAPCOM DRM kill to all CAPCOM, CO. LTD. signed executables
 + Auto-pump Steam callbacks in non-RE Engine games using CRAPCOM DRM

24.1.15.1
=========
 + Added CRAPCOM DRM mode, to completely bypass all restrictions normally imposed
     by CAPCOM's stupid DRM. Pirates can even use this to pirate DLC if they want.

     * See comments in commit for more details on stealing CRAPCOM's crap

24.1.15
=======
 + Reduced Steam Input AppId override overhead
 + Rewrite mentions of ReShade 5.9.3 in SK's control panel to 6.0
 + When (temporarily) blocking gamepad input to games, stop showing input polling
     activity in the control panel for the blocked device slots.
 + Don't implicitly placehold disconnected XInput gamepads when blocking input, just
     return neutral input data and ERROR_SUCCESS
 + No longer auto-disable wndproc hooks in CRAPCOM DRM games, install a surrogate
     window procedure instead and hook it, because the DRM will not check if the
       surrogate procedure's memory is modified.

24.1.14.5
=========
 + Allow crashing as intended if you override swapchain backbuffer count in D3D12
     and you've promised not to shoot yourself in the foot

24.1.14.4
=========
 + Do not apply backbuffer count overrides during SwapChain resize in D3D12
     unless user presents a footgun license and can afford to lose some toes.

24.1.14.3
=========
 + Fixed Steam crashing D3D12 games due to its use of D3D11On12 for its overlay

24.1.14.2
=========
 + Fully automate SteamAPI/CAPCOM DRM workaround for all MT Framework and RE Engine
    games so that Steam Input will work in CAPCOM's abomination of a DRM scheme.

24.1.14.1
=========
 + Fixed inadvertent blocking of gamepad input in games that use Overlapped FileRead
     to poll USB HID input.
 + Changed the default gamepad input state back to Enabled, if you need input to be
     blocked in the background, set it to Disabled (in background).

24.1.14
=======
 + Fixed crashes in Street Fighter 6 caused by the Steam Overlay
 + Fixed RawInput performance problems in The Descent caused by the Steam Overlay

24.1.13.2
=========
 + Fixed the purported SteamAPI fix in 24.1.13.1, for real this time :P

24.1.13.1
=========
 + Fixed potential failure to initialize SteamAPI features in games old enough to
     ship with SteamAPI DLLs that do not implement ISteamInput006
 + Finished hooking up the INI option to disable Steam Input to cover all cases

     [Input.Steam]
     Disable={true|false}  Default: false

24.1.13
=======
 + Change VSYNC setting in control panel to report ther current state, by name,
     instead of "No Override" if no override is active. 
 + Added OpenGL Debug Output support
 + Added options to control OpenGL's framebuffer color precision and depth/stencil

     [OpenGL.System]
     Prefer10bpc={true|false}     Default: true
     UpgradeZBuffer={true|false}  Default: true

   These new options control the framebuffer setup for legacy OpenGL titles, if
     the game uses more modern OpenGL APIs (most do not) then they do not apply.

 + Temporarily disabled HDR ZeroCopy in OpenGL due to GPU memory leak when
     switching between scRGB and HDR10 modes

24.1.12
=======
 + Added Steam Input activity light to Input Management tab, with the particular
     subset of devices that Steam Input is enabled for in the polling count
 + Changed the default gamepad enable state to 'Disabled in Background' in order
     to keep consistent with normal Steam Input behavior; set to 'Enabled' if you
       want background input.

24.1.11.4
=========
 + Handle unexpected changes to Steam Input AppId if background input mode is on
 + Upgraded part of the bastardized Steamworks headers to include ISteamInput006
 + Add logging if the Steam client implements a newer version of ISteamInput
 + Add logging when blocking HID overlapped I/O for the first time
 + Reworked delayed SteamAPI initialization to catch most games callback
     registration when using global injection

24.1.11.3
=========
 + Workaround compiler bug causing XInput crashes in updated MSVC 2022 toolchain
 + Corrected OpenGL pixel format descriptor's color bits count; it is not supposed
     to include alpha bits (e.g. 24-bit color, 8-bit alpha... not 32-bit color)

24.1.11.2
=========
 + Fixed crash in Elden Ring caused by erasing the deferred initialization
     callback running on a different thread.

 + Added command console variable to toggle XInput blocking at runtime,
 
     Input.XInput.HideAllDevices  {true|false}

   Intended usage is to fix games that see XInput devices using other input
     APIs and cannot tell they are the same device (e.g. double inputs).

24.1.11.1
=========
 + Disable blocking NVIDIA MessageBus input while the control panel is
     in exclusive input mode.

24.1.11
=======
 + Use SteamInputConfigurationLoaded_t callback to determine games
     that are using XInput <--> Steam Input vs. Native Steam Input
 + Added NVIDIA MessageBus input polling activity to Input Management
 + Added locale as an instance parameter of iSK_Logger
 + Explicitly set C stdlib thread locale before loading/storing INIs

24.1.10.1
=========
 + Added logging if SK has to force a Steam Input AppID override
 + Improved reliability of Steam background input for non-native games

24.1.10
=======
 + Add HID device path and joyGetPosEx caching to reduce perf overhead
     from querying device capabilities on disconnected devices.
 + Fixed potential stack corruption caused by Steam Input when polling XInput

24.1.9.1
========
 + Revised WinMM Joystick filtering logic such that it only ignores devices
     with no D-Pad -and- fewer than 4 buttons; it was either/or before.

24.1.9
======
 + Implemented IClientUtils::SetFocusedWindow (...) to eliminate the need
     for steam://forceinputappid/ when blocking/unblocking Steam Input.
 + Added support for IClientEngine version 006, since the Steam client will
     no longer grant requests for version 005 or older.
 + Fixed IClientEngine::GetIClientUtils (...); 006 requires a pipe _AND_ user.

24.1.8.4
========
 + Added an option to draw D3D11 Render Targets in the Render Mod Toolkit as
     fullscreen overlays over the main scene (including alpha blending).

24.1.8.3
========
 + Fixed using the wrong CPUID register to test for MWAITX support on AMD CPUs
 + Optimized HID device file management for games that repeatedly open/close
     the same device.
 + Added automatic call to IDXGISwapChain3::SetColorSpace1 (...) if SK HDR
     is forced on, and SK was injected too late to wrap the SwapChain.

    >> Generally this only works for D3D12 games; D3D11 are not Flip Model
         if SK is injected late most of the time.

24.1.8.2
========
 + Simplified SK_IsDebuggerPresent (...) to eliminate rare race conditions.
 + Improved reliability of Steam Input (wrapper, not native) alt-tab after
     activating SK's control panel, or when enabling background input. 

24.1.8.1
========
 + Prevent Alan Wake 2 and Cyberpunk 2077 from showing controller disconnect
     messages when blocking HID + XInput input devices.

24.1.8
======
 + Increased strictness on UTF-8/UTF-16 conversions between unknown codepages;
    >> Untranslatable INI files will fail with an assertion at run-time.
 + Upgraded OpenGL games to 32-bit or 24-bit depth, depending on the
     stencil buffer setup (i.e. 24 + 8-bit DS instead of 16-bit D)
 + Make sure the OpenGL pixel format for default framebuffer is 10-bpc
     when using HDR10.

    >> For Noita, and possibly other GL games, use HDR10 if transparent
         artifacts are visible when using scRGB.

24.1.7.7
========
 + Optimized CharNextW (...) implementation for UCS2
 + Remove scoped lock on GetProcAddress_Detour (...)

24.1.7.6
========
 + Avoid repeatedly calling various NVIDIA Reflex APIs in pure D3D9
 + Add Final Fantasy 7/8/9 launchers to internal injection blacklist
 + Add an error message dialog when Final Fantasy 7 silently CTD's if
     no audio devices are present while trying to launch the game.

24.1.7.5
========
 + Eliminate "Controller Disconnected" messages in some games when SK is
     blocking gamepad input temporarily.

24.1.7.4
========
 + Added WinMM Joystick API hooks for certain bad ports (i.e. Chrono Trigger)
 + Filter WinMM Joystick devices that lack D-Pad and at least 4 buttons from
     being seen by games, as often they will interpret dwPOV == 0 as D-Pad UP
       when polling devices that have no D-Pad!

24.1.7.3
========
 + Allow clipboard-only screenshots in non-HDR and non-Steam games

24.1.7.2
========
 + Increase reliability of background input in non-Steam Input native titles

24.1.7.1
========
 + Added stronger warning when enabling "Continue Rendering" in SteamInput
    native games.

   * You're playing with fire; chances are very good no input will work at all!

24.1.7
======
 + Fixed race to initialize per-display information with GDI name before
     getting WDDM caps using the GDI name.
 + Added support for background input when using Steam Input's XInput
     API wrapper back to SK.

   >> Native Steam Input API games still do not support background input.

24.1.6
======
 + Stopped forwarding GetOverlappedResult to GetOverlappedResultEx for
     Proton compatiblity.
 + Remove debug spam when a file with \hid in its name is encountered
 + Fixed potential crash in Elden Ring when using button texture mods
 + Fixed potential crash in NieR: Automata when using HDR

24.1.1.2
========
 + Removed background input support for Steam Input games, because Valve's
     tracking of window state is beyond awful

24.1.1.1
========
 + Implemented Steam Input disable option

     [Steam.Input]
     Disabled={true|false}  Default: false

24.1.1
======
 + Light up Steam Input activity indicator in Input Device Management for games
     using Steam Input XInput wrapper rather than just Steam Input native API
 + Added support for background input in Steam Input native games
 + Added support for HID devices manually polled using GetOverlappedResult

23.12.31.1
==========
 + When HDR Zero-Copy mode is active in OpenGL-IK, move the OpenGL->Direct3D
     framebuffer flip into the HDR post-process shader to reduce 1 render pass

23.12.31
========
 + Merge pull request #130 from Banz99/nier_update
    * Update Radical Replicant for the newest build of Nier Replicant v. Sqrt 1.5

23.12.30.1
==========
 + Reduced flicker when using adaptive tonemapping by keeping a longer history of
     luminances from previous frames.

23.12.30
========
 + Add further CPUID checks before using AMD MWAITX, as not all Ryzen CPUs
     actually support this instruction.

23.12.29.1
==========
 + Remove all HDR metadata override settings except for disable, because all it was
     doing is passing invalid data to DXGI.

    >> Consider using Special K's HDR10 or scRGB HDR mode instead, because it
         also corrects third-party overlay colorspaces.

23.12.29
========
 + Workaround Special K installer shipping invalid INI files by deleting them.

23.12.28
========
 + Add workaround for some Frostbite Engine games that try to create FORMAT_UNKNOWN
     UAVs to access the backbuffers on an SK Flip Model promoted SwapChain in D3D11.

23.12.27.2
==========
 + Add CrashReport.exe bypass to prevent Resident Evil 4 from crashing (lol)

23.12.27.1
==========
 + Added HDR Zero-Copy Mode support for OpenGL-IK games (scRGB only)

23.12.27
========
 + Added HDR Zero-Copy Mode to D3D11 to reduce Memory Bandwidth requirements

23.12.26.3
==========
 + Disable DXGI Flip Model in games that use IDXGISwapChain2::SetSourceSize,
     in order to prevent scaling problems.

23.12.26.2
==========
 + Add X-Ray Oxygen dummy window class to internal list of windows not to hook
 + Fixed steam_library_t typedef; array of strings, not string pointers

23.12.26.1
==========
 + Added [[unlikely]] C++ compiler hint to release build assertion macro
 + Do not wrap Streamline native SwapChain to avoid crashing in Forza Horizon 5
 + Avoid zero-copy to SwapChain backbuffer when DLSS-G and HDR are active
 + Avoid static storage on dll_ini to facilitate runtime renaming

23.12.26
========
 + Fixed potential race to initialize SK's INI parser that could lead to
     crashes in some games with unusual filesystem permissions.

23.12.25.3
==========
 + Added dedicated achievement screenshot file storage

    * Stored as <Normal Screenshot Path>\Achievements\Name.{jxr|png|jpg|avif}

 + Added customizable screenshot filenames; refer to std::wcsftime documentation

     Global\osd.ini:

       [Screenshot.System]
       FilenamePattern={wcsftime specifiers},  Default:  %G %F %T

     >> %G is a non-standard substitution that refers to the name of the game

23.12.25.2
==========
 + Merge pull request #125 from Nustat0/fix-missing-drop-late-frames
    * Fix missing Drop Late Frames checkbox for DDraw/D3D8
 + Merge pull request #124 from Nustat0/allow-32bit-d3d12-hdr
    * Allow 32-bit D3D12 HDR if AllowD3D12FootGuns=true
 + Merge pull request #114 from Aemony/osd_bottom-aligned_fix
    * Fixes bottom-aligned OSD
 + Merge pull request #113 from Aemony/hdr_metadata_override
    * Add support for HDRMetadataType parameter
 + Merge pull request #112 from Aemony/poc_overridden_swapchain_stuff
    * Show swap chain overrides Special K is applying
 + Merge pull request #111 from Aemony/bitblt-disallow-tearing 
    * Disable tearing + waitable when using Flip->BitBlt override

 + Added INI option to prevent the Steam Overlay from drawing

    [Steam.System]
    NoDrawOverlay={true|false} (Default: false)

23.12.25.1
==========
 + Eliminated 2 framebuffer copies per-DLSS3 generated frame output when HDR
     format conversion is required (i.e. scRGB from 10-bpc or HDR10 from 8-bpc)

    >> Perf. difference between HDR10 and scRGB framegen is now virtually zero

23.12.25
========
 + Removed "Effective Refresh Rate" from Latency Analysis Widget, because it is
     a high overhead NvAPI call and causes perf issues while looking at perf...
 + Limited log spam on calls to IDXGISwapChain3::SetColorSpace1 (...)
 + Added missing Source Copy <--> Unordered Access View transition barrier in
     D3D12 when copying DLSS3's non-HDR surface for HDR processing.

23.12.24.3
==========
 + Added tooltips to G-Sync Status when it reports "Supported + Inactive", to
     explain that either PresentMon is not working (D3D12) or the current
       Presentation Model is incompatible with VRR (i.e. Composed Flip / GDI)

23.12.24.2
==========
 + Optimized D3D12 ImGui backend so that it does not reload font textures when
     games change resolution
 + Changed SK's overlay luminance setting to be global instead of per-game

23.12.24.1
==========
 + Reworded HDR10 tooltips in HDR widget
 + Added tooltip for D3D12 HDR format conversion performance counter
 + Added tooltip if Steam overlay is found responsible for preventing SwapChain
     Resize (D3D12 games)

23.12.24
========
 + Fixed potential crashes in some D3D12 games because SwapChain current index
     was not reset to 0 after SwapChain resize

23.12.23
========
 + Added DLSS3 Format Conversion GPU time (Compute Shader Blt) to HDR widget
    in D3D12 titles that require special format conversion from DLSS-G's
      generated output before they can be used in HDR.
 + Optimized DLSS3 Format Conversion compute shader (~33% speedup)

23.12.22.1
==========
 + Workaround Streamline bug in Yakuza Like a Dragon Gaiden that requires
     ignoring hooks on IDXGIFactory2::CreateSwapChainForHwnd (...)

23.12.22
========
 + Added option to use compatibility hacks when storing screenshots to make
     them work with software that does not completely implement AVIF and JPEG XR
       decoding.

   Global\osd.ini:

     [Screenshot.System]
     CompatibilityMode={true|false} (Default: false)

23.12.21.2
==========
 + Added HDR Processing Time (GPU execution time) to HDR widget for D3D12 also

23.12.21.1
==========
 + Workaround compiler optimization that was nop'ing calls to ZeroMemory on
     D3D11 State Blocks, breaking HDR10 screenshots in some cases.
 + Removed debug symbols from compiled HLSL shaders
 + Removed ImGui DLL exports, they were only needed for SK's original custom
     ReShade plug-in and it is no longer supported.

23.12.21
========
 + Allow Linear content EOTF to be turned off manually in sRGB games
 + Default Genshin Impact to 2.2 content EOTF even though it is sRGB

23.12.20.1
==========
 + Added a warning text line at the top of the control panel if a game tried
     and failed to change the resolution of its SwapChain.

    >> Special K has been setup to swallow certain resize failure events in
         order to prevent incompatible combinations of software from crashing.

     When hiding these errors from games, a game's internal resolution may
       not match display output; confirm graphics settings if you see this.

23.12.20
========
 + Improved support for ReShade effects that require sRGB views in D3D12
 + Added control panel option to embed Nickname in Screenshot Metadata as Author

23.12.19.1
==========
 + Increased JPEG encode quality for screenshots imported to Steam to maximum
 + Added acquisition metadata to JXR, PNG and JPG screenshots:

     Steam/Epic User Name
     Special K Version
     Application Name
     Date Taken
     Screen DPI

23.12.19
========
 + Tested and compatible with HDR in dlssg_to_fsr3

     >> Configure from SK's control panel w/ Early Load-Order and restart game

 + Add Fullscreen Mode -> Windowed Mode fallback in D3D9 games if they fail to
     engage Fullscreen Exclusive.

23.12.18.3
==========
 + Copy corrupted INI files to <ini_name>.bak, rather than move, to prevent rare
     race condition that might cause data loss in processes that fork themselves
       during initialization (DRM-related usually).

23.12.18.2
==========
 + Added compression quality setting for JPEG XR HDR screenshots (Default: 90%)

23.12.18.1
==========
 + Fixed potential crash if hot-loading ReShade in a DLSS Frame Generation game
     using scRGB HDR

23.12.18
========
 + Changed INI parser to never write empty INI files
 + Finished support for scRGB Frame Generation (D3D12)
 + Changed default value of [NVIDIA.DLSS] AllowSCRGBinDLSSG to true

     >> There may be some additional performance overhead for scRGB Frame Gen;
          mostly memory bandwidth.

23.12.17.1
==========
 + Added warning message if DLSS Frame Generation attempts to copy the game's
     interpolated frame to SK's HDR SwapChain using a D3D12 Compute Queue.

    >> SK cannot currently correct SDR/HDR format mismatches on Compute Queues,
         and this causes artifacts in games like Cyberpunk 2077.

23.12.17
========
 + Added Aspect Ratio Unlock for STAR OCEAN THE SECOND STORY R
 + Fixed potential crash in Tactics Ogre Reborn introduced in 23.7.4.1
 + Added support for dumping DLSS-G buffers to textures for debug

23.12.16.4
==========
 + Automatically put games that use sRGB SwapChains into Linear mode when applying
     inverse tonemapping.

23.12.16.3
==========
 + Loading a dumped texture no longer requires removing the "Compressed_" or
     "Uncompressed_" prefix from the filename.
 + Fixed missing "_TYPELESS" suffix when dumping some compressed texture formats

23.12.16.2
==========
 + Added support for TYPELESS texture dumping and injection
 + These textures must keep the _TYPELESS part of their name for proper re-injection
     >> Typically you'd treat them as UNORM or UNORM_SRGB in image software and keep the
          `_TYPELESS.dds` name for engine compatibility.

23.12.16.1
==========
 + Always write INI files in \Global\ using UTF-16LE to avoid conversion from UTF-8
     to UTF-16LE when parsing them.

23.12.16
========
 + Turn off non-mipmapped texture cache immediately in all Unity engine games, as
     soon as a window is created with UnityWndClass.

23.12.15.1
==========
 + Defaulted Star Ocean 2 to turning off texture cache for non-mipmapped textures
 + Added various nullptr checks

23.12.15
========
 + Added D3D11 stateblock backup/restore and set rasterizer state to sane defaults
     before triggering ReShade render passes early.
 + Adjusted DXGI budget tracking thread to only change monitored adapters in
     DXGI-based APIs if the game's running on a different adapter than the
       thread is actively monitoring.

23.12.13.1
==========
 + Reduced MMDevAPI overhead when the volume control widget is open

23.12.13
========
 + Improved handling of audio device hot-plug when game is running on non-preferred
     audio device. It should transition to the preferred device immediately now.
 + Audio Session selector now enumerates sessions for all end-points, so applications
     running on a different audio device than the game show up as expected and their
       volume can be controlled.
 + If a process has multiple audio sessions and the one being controlled by the audio
     widget goes idle, automatically switch to one of its non-idle audio sessions.

23.12.11.2
==========
 + Fixed ReShade on-demand injection in D3D12 games so that it renders its effects

23.12.11.1
==========
 + Fixed unaligned D3D12 Descriptor Heap access on CPU handles used for ReShade

23.12.11
========
 + Improved UI scaling on Audio Management UI
 + Hide "Switch Audio Device" button if there is only 1 active audio device
 + Add support for closing Audio popups by clicking outside or pressing Escape

23.12.10.2
==========
 + Added sRGB support to ReShade when loaded as a plug-in, which is necessary
     for various edge-detect shaders (SMAA, AMD CAS, ...) that require sRGB.

    >> Partial support has been added to D3D12; all formats except R10G10B10A2

     * In HDR, sRGB is unnecessary. Just make sure ReShade is set to "Draw First".

 + Custom SDR EOTF can be configured in-game, rather than requiring a manual INI edit,
     by selecting "Custom" from the HDR Content EOTF combo box.

23.12.10.1
==========
 + Fixed unnecessary audio device changes causing brief audio drop-outs during Alt+Tab

23.12.10
========
 + Added option to associate monitors with audio devices, such that SK will change
     the game's output audio device depending on which monitor the game is using.

    >> See the Display menu for more, if you want this behavior globally, then
         configure it once and copy the "Display.Audio" section of the game's INI
           to Global\master_SpecialK.ini

23.12.9.4
=========
 + Adjusted spacing on OSD Frame Counter

23.12.9.3
=========
 + Added Frame Counter option to OSD's FPS reporting

23.12.9.2
=========
 + Fixed crash in IMMDeviceEnumerator::EnumAudioEndpoints (...) on some drivers

23.12.9.1
=========
 + Properly transition to the game's active device if the audio session is
     stream re-routed so volume control works correctly after changing devs

23.12.9
=======
 + Added button to change the device the game outputs to in Audio Management

23.12.8.1
=========
 + Fixed HDR MaxLuminance values set using Profile Display Capabilities sometimes
     not applying correctly.
 + Added profiled MaxLuminance override values to display logs

23.12.8
=======
 + Added support for default_ReShade.ini and master_ReShade.ini in Global\ReShade\
     >> Works the same as default_SpecialK.ini and master_SpecialK.ini
 + Added support for default_ReShadePreset.ini in Global\ReShade\
 + Added button to browse to the directory where ReShade config/logs are stored
 + Added warning (in plug-in control panel) if a local ReShade.ini is found and
     is overriding SK's normal behavior for ReShade config file management

23.12.7.4
=========
 + Added keybind (Ctrl+Alt+Shift+R) to inject ReShade on-demand into any
     OpenGL/D3D11/D3D12 game, see the Plug-Ins control panel section for more.

    * Requires ReShade 5.9.3+

23.12.7.3
=========
 + Clamp non-black pixels to smallest FP16 subnormal value rather than normal;
     fixes raised black level on the SDR side of SDR/HDR split view.

23.12.7.2
=========
 + Removed Rec 709 gamut clamp from D3D11 HDR Adaptive Tonemapping

23.12.7.1
=========
 + SDR/HDR Splitter now uses the Windows SDR White Level setting to scale
     the non-HDR tonemapped SDR image to match what Windows would have done.
 + Added Windows SDR White Level and Dolby Vision Low Latency info to logs.
 + Added option to set overlay luminance to match Windows SDR by right-clicking
     HDR overlay luminance sliders (see HDR menu).

23.12.7
=======
 + Merge pull request #122 from Nustat0/auto-bias-target-percent
    * Added ability to specify target input latency in (ms) or (%)

23.12.6.4
=========
 + Expanded the ReShade Plug-Ins section of the control panel by default
 + Changed overlays such as Steam, RTSS, uPlay, Discord to use 2.2 gamma

23.12.6.3
=========
 + Fixed potential black pixel artifacts caused by changes in 23.12.6.2
 + Added support for HDR10 in Star Ocean Second Story R
 + Added internal support for upgrading Render Targets to 16-bpc UNORM instead
     of 16-bpc FLOAT when remastering render passes, for engines that have
       floating-point blending problems (i.e. Unity).

    >> The only known game that needs this is Star Ocean 2, if the are more,
         an INI option will be added.

23.12.6.2
=========
 + Replaced "Bypass sRGB Gamma" option in HDR calibration with Content EOTF.

    >> Old default behavior (no bypass) is equal to sRGB Content EOTF.

    * Linear is equivalent to "Bypass sRGB Gamma"
    * 2.2 is an approximation of sRGB that more closely matches how most
        SDR displays would display sRGB framebuffer content produced by D3D

       >> 2.2 is NOT how the DWM composites SDR content, it ALWAYS uses sRGB.

23.12.6.1
=========
 + Remove 2-space left-padding from text OSD when the title/clock is not shown
 + Fixed pagefile monitor displaying on a single line of text

23.12.6
=======
 + Added "Load Now" button to ReShade plug-in selector in SK's control panel.

   * Allows loading ReShade into running games without restarting the game.

    >> Requires an OpenGL/D3D11/D3D12 game and a version of ReShade 5.9.3 or
         newer installed to PlugIns\ThirdParty\ReShade\ReShade{32|64}.dll

23.12.5.5
=========
 + Added necessary DWORD -> LONG cast before converting charge rate from
     integer mW to decimal W.

23.12.5.4
=========
 + Ignore native resolution rendertargets when considering promotion from
     8-bpc to 16-bpc for HDR remasters in Star Ocean The Second Story R.

23.12.5.3
=========
 + Changed (dis)charge rate reporting from milliwatts to watts, and
     hide the rate if for some reason it is 0.0.

23.12.5.2
=========
 + Fixed signed vs. unsigned issues in discharge rate reporting

23.12.5.1
=========
 + Added battery (dis)charge rate to battery meter while running a
     battery-powered device off of battery or charging it.

23.12.5
=======
 + Fixed issues in Unity games where the mouse cursor could move to the
     center of the screen and stay there if they are launched in the background
       and another application takes window activation during game startup.

23.11.24
========
 + Don't display Render Latency statistics in D3D9 games, for real this time
 + When encountering corrupted INI files, backup to <ini>.bak before recovering

23.11.20.3
==========
 + Fixed displaying DXGI Present Statistics in D3D9 games if
     WDDM3 HW Flip Queue is enabled.

23.11.20.2
==========
 + Removed smoothing from percentile calculations in framepacing widget

23.11.20.1
==========
 + Added Steam Input pesticide to restore native XInput support to
     Tales of Arise for more reliable input.
     
    * Enable XInput by placing CDE62E66.dds in SK_Res\inject\textures

23.11.20
========
 + Default non-Linear SDR games to 2.2 power-law when linearizing
     their SwapChain for HDR inverse tonemapping

23.11.19.4
==========
 + Default missing Mode= entry in ReShade plug-in Import INI entry
     to mean "Compatibility"

23.11.19.3
==========
 + Fixed potential crash in ReShade's "Generic Depth" Add-On

23.11.19.2
==========
 + Added "Compatibility Mode" option to ReShade Plug-In
 + Removed Unofficial Plug-In category

23.11.19.1
==========
 + Fixed unintended ReShade device context code in D3D12 games without
    ReShade loaded.

23.11.19
========
 + Loading ReShade DLL as ReShade{32|64}.dll will rebase its config to
     SpecialK\Profiles\<game>\ReShade\ReShade.ini if ReShade.ini does not
       already exist in the game's directory.

 + ReShade v 5.9.3.2048+ disables all of ReShade's render hook code for
     D3D11 and D3D12 and SK does the rendering for ReShade.

    * Significantly improves stability in DLSS-G games, properly handles
        HDR UI colorspace, always draws ReShade's UI after SK's UI.

 + When loading ReShade as a plug-in, Global\ReShade\Textures and
     Global\ReShade\Shaders are the default search paths for effects/textures.

 + ReShade load-order no longer matters when using version 5.9.3.2048+.
        

23.11.13.2
==========
 + Added AVIF encoder configuration to HDR menu in control panel
 + AVIF codec will automatically download the first time it is selected
 + AVIF still unsupported in 32-bit software, sorry :)

23.11.13.1
==========
 + Fixed Yellow/Green shift in tonemapped screenshots introduced in 23.11.13

23.11.13
========
 + AVIF screenshot support is now optionally enabled by placing libavif_x64.dll
     in SpecialK\PlugIns\ThirdParty\Image Codecs\libavif\

    * Later versions will support 32-bit, and will have encoder quality options

23.11.12
========
 + Fixed an issue in D3D12 on AMD GPUs that might render ImGui's UI in sRGB
 + Fixed colorspace conversion to Rec2020+PQ from scRGB in AVIF screenshots
 + Clamp colors to Rec2020 when converting HDR10 to scRGB for JXR screenshots

23.11.10.2
==========
 + Add workaround for games that poll keyboard input for Alt+F4 rather than
     using the correct WM_SYSCOMMAND message.

23.11.10.1
==========
 + Optimized D3D11 ReShade add-on render path to avoid creating unnecessary
     temporary Render Target Views.
 + Added Ctrl+R keyboard shortcut to toggle ReShade trigger behavior for the
     selected shader in D3D11 Render Mod Tools.
 + Only show "Trigger ReShade On First Draw" for shaders that have compatible
     aspect ratio.
 + Skip ReShade post-processing altogether if trigger shaders are setup, but
     the game does not activate any of the triggers in a frame.

    * This is intended to skip post-processing when the ONLY thing on screen
        is the game's UI.

  Example d3d11_shaders.ini (Baldur's Gate 3) to apply ReShade before HUD:

    [DrawState.Vertex]
    5dcbb1c5=HUD
    73199e2e=HUD
    a8226121=HUD
    c9ce2d35=HUD
    d2650529=HUD

    [DrawState.Pixel]
    2a588cb1=TriggerReShade
    2bf49536=TriggerReShade

23.11.10
========
 + Added support for triggering ReShade on specific Pixel/Vertex shaders in
     D3D11, the same way it used to work for the custom version of ReShade.

    * Requires an add-on compatible version of ReShade (5.9.3+).

  Use the D3D11 Render Mod Tools and run through the Pixel Shaders trying
    "Trigger ReShade On First Draw" until you find one that draws ReShade
      before the game's UI.

    -> Save the Current State when done.

23.11.9.1
=========
 + Always flush ReShade's D3D12 "immediate context" after drawing, because
     it does not see native DXGI SwapChain presents in games using
       NVIDIA Streamline and it is not safe to defer execution until present.

23.11.9
=======
 + Reduced D3D12 CPU performance overhead when using ReShade add-on mode
     to draw ReShade before SK does HDR image processing.
 + Changed "Draw ReShade First" option to control whether ReShade runs
     before or after SK's HDR processing.
     
    * ReShade will always draw before SK's UI now (when add-on compatible).

23.11.8
=======
 + Disabled AVIF screenshots; they'll be re-enabled when the encoder
     is changed to be an optional plug-in.
 + Fixed problems changing render API hook settings caused by merge of
    "Added temp parameters for toggled render APIs (#99)"

23.11.7.3
=========
 + Added HDR metadata to AVIF screenshots for proper tonemapping
 + Fixed frametime spikes causing Latency Analysis graph to potentially
     scale to billions of milliseconds.

23.11.7.2
=========
 + Changed Display Scanout time in Latency Analysis to measure the time
     between the CPU simulation start and finished image display.

    * Prior, it only measured the time between the GPU starting work
        and the image being displayed on screen.

   Outside of Frame Generation, this is almost always total frametime.

23.11.7.1
=========
 + Added experimental .avif screenshot support for 64-bit HDR games

    >> This format is supported by Chrome (displayable in HDR) and
         Firefox (SDR only), Edge does not support it, nor does HDR + WCG.

23.11.7
=======
 + Removed dgVoodoo2 D3D12 init. workaround that causes issues on Intel drivers

23.11.6
=======
 + Improved ReShade add-on stability in D3D12 games that use NVIDIA Streamline
 + Renamed "sRGB Passthrough" tonemap mode to "sRGB Inverse"

23.11.5.3
=========
 + Fixed (worked around) Thread Local Storage corruption when loading ReShade
     as dxgi.dll in some Steam games

23.11.5.2
=========
 + Added D3D12 achievement icons for Steam games
 + Added smoothstep near-black and lowered HDR10 black level to 0 when using SK's
     HDR10 output mode (all tonemaps except Raw Framebuffer).

23.11.5.1
=========
 + Added some latency measurements back when HW Flip Queue is active, but with
     avg / max frame queue time replaced with 'HW Flip Q'

23.11.5
=======
 + Removed various latency measurements that are broken on systems with WDDM3.0
     Hardware Flip Queue (Recent NVIDIA Drivers)
 + Improved ReShade add-on stability in Cyberpunk 2077

23.11.4.1
=========
 + Fixed incorrect wait on ReShade fences when the fence has not signaled yet.
 + Fixed rare HDR10/scRGB buffer copy failure in D3D12 in games like Cyberpunk 2077

23.11.4
=======
 + Fixed yet more unintended Rec.709 color clamping for HDR10 and scRGB Passthrough
 + Disabled ReShade add-on support for all versions of ReShade older than 5.9.3.1024
 + Integrated fence-based resource lifetime management added in 5.9.3.1024
 + Cyberpunk 2077 works now, but you will have to be careful because of Streamline,
     to avoid crashes, load ReShade's DLL as ReShade64.dll and be aware that ReShade
       will post-process its own UI.

23.11.3
=======
 + Removed CPU-side wait for ReShade to execute GPU commands, and only use that
     code in Cyberpunk 2077. A fence-based synchronization method is needed, but
       does not exist in current versions of ReShade.

    >> Avoid using ReShade in Cyberpunk 2077 for performance issues for now.

23.11.2.2
=========
 + Removed overhead at the end of every frame caused by 23.11.2's audio changes
 + Extend Reflex latency pipeline graph to fit "Driver" time if it is the longest
     render stage in a frame (i.e. Frame Generation)

23.11.2.1
=========
 + Removed unintentional Rec.709 color clamp on HDR10 and scRGB Passthrough

23.11.2
=======
 + Fixed audio management keybinds not applying in some games if sound is not
     initialized successfully by the third frame drawn.
 + Improved HDR->SDR screenshot tonemapping blend between luma preserving and
     chroma preserving for really bright scenes in D3D11 and D3D12.

23.11.1
=======
 + Added keybind to toggle ReShade overlay, this keybind works even if keyboard
     input is being blocked to the game.

     Keybind: Shift+Home , it can be configured in Global\osd.ini

 + While the ReShade overlay is active, SK will stop blocking keyboard and mouse
     input to the game so that the user can interact with it.

  >> Both of these features require ReShade 5.9.3+ (unreleased; see Discord).

23.10.31.2
==========
 + Avoid potential deadlock in D3D12 games that use Fullscreen mode when
     "skip redundant mode changes" is enabled.
 + Skip ReShade effect processing if no effects are enabled.

23.10.31.1
==========
 + Added CPU command queue sync when triggering ReShade in D3D12 to ensure that
    temporary rendertargets are not destroyed before ReShade's effects complete.

23.10.31
========
 + Fixed WaitForDebugger not blocking DllMain due to attach state not being set
 + Apply ReShade basepath override only for plug-in DLLs with ReShade in the name

23.10.30.4
==========
 + Removed debug code that was dumping disassembled EOS overlay shaders in D3D12
 + Removed hard-coded Ctrl+Shift+T debug keybind to test Steam/EOS Achievement 0
 + Added console command to debug Steam/EOS Achievement # (trigger unlock popup)

     "Platform.AchievementTest <achievement_id>"

   If you want the original debug keybind back, add this to Global\macros.ini:

     [Macro.SpecialK_Debug]
     Ctrl+Shift+T=Platform.AchievementTest 0

23.10.30.3
==========
 + Improved ReShade add-on registration reliability when using Lazy or Plug-In
     load order.
 + Request ReShade add-on API version 8 during initialization so that the overlay
     activation feature is -optional- and SK will work as intended with older
       versions of ReShade that lack support for API version 9.

23.10.30.2
==========
 + Added support for new ReShade add-on event to monitor overlay activation state

     >> SK will hide its own overlay and stop blocking mouse/keyboard/gamepad input
          to ReShade while its config overlay is active.

        * This requires a yet unreleased version of ReShade (5.9.x+); see Discord.

23.10.30.1
==========
 + Add recursive pattern to ReShade Shader / Effects search path

23.10.30
========
 + Added ReShade AddOn integration to control whether ReShade draws before (default)
     SK in D3D11 and D3D12 games.

     >> This allows running HDR analysis shaders on SK's output (if disabled), or
          using HDR processing shaders such as Pumbo's AutoHDR without affecting
            SK's UI or SK's custom luminance control for third-party overlays.

  + In AddOn capable versions of ReShade, SK defaults to searching Effect / Textures
      from <SK Install Path>\Global\ReShade\Shaders, and ...\Textures if they exist.

     >> Use this to store ReShade Shaders and Textures in a central location instead
          of duplicating them for every game.

     * NOTE: This setup will be performed only for empty ReShade.ini files because of
               a bug in current versions of ReShade that will not allow adding
                 directories to an existing search path.

23.10.29.2
==========
 + Apply Reflex out-of-band input processing fixes to all Reflex games
 + Added HDR colorspace correction for Epic Overlay in D3D12

    * Luminance setting is shared with the Steam overlay, configure it by running
        a game in D3D11 using Steam or EOS Overlay and the slider in the HDR menu.

        >> Slider and real-time adjustment are not available in D3D12

23.10.29.1
==========
 + Apply the Alan Wake 2 Reflex out-of-band input processing fix to SK's own Reflex
     implementation to handle rare edge cases.

23.10.29
========
 + Fixed Alan Wake 2 mouse input stutter caused by INPUT_SAMPLE Reflex Latency Markers
     being issued outside of SIMULATION_START / SIMULATION_END.

    NOTE: There's still a bit of stutter when moving the mouse if that triggers a
            switch between gamepad and KB&M input icons.
            
          If you only use one input device type you are encouraged to disable the
            others under SK's Input Management section so that it never switches icons.

23.10.28.4
==========
 + Added SK calculated Reflex input latency marker for native Reflex games that are
     missing this (i.e. Alan Wake 2)

23.10.28.3
==========
 + Fixed stability problems caused by Epic overlay in DLSS-G games

23.10.28.2
==========
 + Added warnings if attempting to launch Alan Wake 2 without EOS Overlay or with
     RTSS and EOS Overlay simultaneously, since the faulty overlay check has been
       removed.
 + Colorspace fixes for RTSS's overlay in HDR work in D3D12 now;
     the luminance level is only configurable from D3D11 (in the HDR menu), but
       D3D12 will use the values you set in any D3D11 game while RTSS was visible.

23.10.28.1
==========
 + Completely automated bypass of Alan Wake 2's broken Third-Party Overlay check

23.10.28
========
 + Added bypass for Alan Wake 2's faulty third-party overlay check.
 
    >> Just click Quit and SK will ignore it and allow you to play the game.

 + Automatically disable scRGB if DLSS-G is detected; clicking the scRGB
     radio button after the automatic disable will ignore auto-disable
       behavior in the future for the game.

23.10.21
========
 + Experimental alpha blending overhaul for HDR10

    >> Font and various graphs should be more legible when using HDR10, but
         SK's UI might be brighter than the configured luminance target.

23.10.20.4
==========
 + Only parse LOTF's INI file once per-launch :)

23.10.20.3
==========
 + Added new callback game plug-ins can register for on game exit to handle
     various shutdown tasks (on clean exit).
 + EAC bypass is disabled in Lords of the Fallen when the game exits.

23.10.20.2
==========
 + Added DLSS-G option back to Lords of the Fallen when launched using SK
    >> If you enable DLSS FG, it's critical that you do not disable native Reflex

23.10.20.1
==========
 + Improved HDR10 screenshot tonemapping
 + Added achievement enabler for Lords of the Fallen's EAC bypass

23.10.20
========
 + Added option to disable native Reflex in games, and an explanation why you might
     want to do this, rather than simply overriding the game's Reflex settings.

23.10.19
========
 + Disable HDR support in 32-bit D3D12 software to prevent dgVoodoo2 from crashing.
     >> If you want HDR in dgVoodoo2, use D3D11

23.10.18
========
 + Optimized Latency Analysis Graph's statistics storage for high framerates
 + Simplified the Latency Analysis Widget when the control panel is closed
 + Added checkbox to show detailed timing diagram in the Latency Analysis Widget
 + Added debug option to INI to disable a game's native Reflex implementation

23.10.17
========
 + Added option to disable DLSS OTA Updates to the Compatibility Hack section
     of the DLSS control panel.

    Games that use OTA updates spawn background processes to do version checks
      -every- game launch, sometimes multiple times (i.e. after changing settings).

23.10.16.3
==========
 + Added CPU / GPU FPS to Latency Analysis Graph's annotations

23.10.16.2
==========
 + Changed latency analysis graph to sample the last 1 second worth of frames
     (up to 512 fps) instead of using the constant 64 frames Reflex returns.

23.10.16.1
==========
 + Restored hold gamepad activate to right-click behavior lost in ImGui upgrade
 + Fixed control panel slider activation when using a gamepad
 + Fixed missing VRAM quota slider after ImGui upgrade

23.10.16
========
 + Smoothed data display range changes on latency analysis graph
 + Removed Cyberpunk 2077 plug-in from Special K

23.10.15.x
==========
 [.5] + Removed Starfield plug-in's FOV settings
 [.4] + Condensed NVIDIA Reflex control panel and added tooltips to mode selection
 [.3] + Fixed startup crash in Control HDR related to DLSS initialization
 [.2] + Added CPU and GPU name to Latency Analysis Graph
 [.2] + Increased thickness of bounding lines on Latency Analysis Graph
 [.1] + Fixed rare crash if a game restarts EOS (Epic Online Services) during exit.

23.10.15
========
 + Added effective fps to latency analysis graph, CPU and GPU framerate are
     both visible by looking for the blue and red bars respectively.

23.10.14.x
==========
 [.4] + Improved latency analysis graph's CPU/GPU Bound function and handling of
          CPU/GPU load inversion.
 [.3] + Fixed Steam achievement screenshots not actually capturing the popup
 [.3] + Fixed haptic rumble not working in menus in games that don't use XInput
 [.3] + Fixed potential nullptr dereferences in ImGui's updated codebase
 [.2] + Fixed Steam API Frame Counter not being right-clickable after ImGui upgrade
 [.1] + Fixed DLSS AppID override option not turning off when unchecked
 [.1] + Hooked additional D3D11/D3D12 NGX Init functions

23.10.14
========
 + Added compat hack option to override DLSS AppID
 + Added compat hack option to add extra pixels when forcing DLAA

23.10.13.x
==========
 [.6] + Added descriptions to DLSS preset overrides
 [.5] + Added DLSS-G DLL version to DLSS control panel
 [.4] + Fixed potential crash when querying DLSS internal resolution while
          DLSS Frame Generation is enabled
 [.3] + Added EAC Bypass for Lords of the Fallen 2 (or whatever it's called)
 [.2] + Added DLSS Resolution Scale override; game restart almost always required
 [.2] + Added DLSS Dynamic Resolution Scale override
 [.1] + Changed DLSS Preset override names from N/A to Game Default and
          Default to DLSS Default
 [.1] + Use a game's window title in the control panel if it is not Steam or EGS

23.10.13
========
 + Added DLSS Preset override; requires game restart or Alt+Enter usually

23.10.12.3
==========
 + Disable DLAA option in DLSS 1.x games

23.10.12.2
==========
 + Added safeguards against overriding DLSS DLLs in DLSS 1.x games

23.10.12.1
==========
 + Added CPU Bound / GPU Bound indicator to Latency Analysis graph

    * Currently, games are considered bounded by CPU or GPU if there is
        more than a 25% difference in CPU and GPU time per-frame.

23.10.12
========
 + Added DLSS and DLSS-G text overlay toggles to "DLSS Indicators" section

23.10.11.4
==========
 + Use 95th percentile luminance when tonemapping screenshots to prevent
     third-party overlays with 10k nits text from dimming things excessively.

23.10.11.3
==========
 + Changed the Browse DLSS Directory button to use the actively loaded DLL

23.10.11.2
==========
 + Report the DLSS internal resolution by querying NVSDK_NGX_Parameter_Color
     and using the D3D11/12 resource desc instead of NGX's Width/Height params,
       because many games do not set those correctly.

23.10.11.1
==========
 + Only set DLAA Perf/Quality Level if DLSS version is >= 3.1.13 because it
     did not exist prior (DLAA was implicitly Input Res == Output Res) and
       would cause black screens in games.

23.10.11
========
 + DLSS sharpness settings are hidden if DLL version is >= 2.5.1
 + DLSS DLL override preferences are saved immediately after changing them

23.10.10.2
==========
 + Added initial support for DLSS-RR (Ray Reconstruction) in D3D12 games

23.10.10.1
==========
 + Added DLSS Preset Indicator (no override yet)

23.10.10
========
 + Optimized NVIDIA NGX hook initialization
 + Merge pull request #107 from Aemony/osd_improvements
  * Split Title and Clock into two separate options.
  * Rearranged Extended Monitoring section to follow the same order that the
      OSD components appear in.
  * Made hidden options visible at all times, just not interactable, to make
      it clearer that some options have sub-options.
  * Made column separators unmovable.

23.10.9.3
=========
 + Added option to auto-load an updated DLSS DLL from SK's Plug-In Directory

    >> This can be done from the DLSS Control Panel, or can be done manually.

    1. Create the directory: SpecialK\PlugIns\ThirdParty\NVIDIA
    2. Place an updated version of nvngx_dlss.dll there
    3. Set [NVIDIA.DLSS] AutoRedirectDLL=true in SpecialK.ini

    Now SK will always load the Plug-In DLL instead of a game's DLL.

    If you want this by default, you can set it in Global\default_SpecialK.ini
      after setting up the correct file location.

23.10.9.2
=========
 + Fixed DLSS overrides in Baldur's Gate 3
 + Added DLSS version number to control panel
 + Added button to open a file explorer window in the DLSS DLL's directory

23.10.9.1
=========
 + Write DLSS setting changes to INI immediately after changing them

23.10.9
=======
 + Added a DLSS control panel section for D3D11/12 games that are using it
 + Added option to force DLAA in DLSS games that don't normally support it
 + Added option to override DLSS sharpening

23.10.8.1
=========
 + Added Auto-Bias tuning parameters to Latent Sync to control the maximum
     input bias to apply, as well as the target input latency.

23.10.8
=======
 + Merge pull request #105 from Aemony/tlr-steamapi-fix
    * Expect 85 KB minimum for steam_api.dll 
 + Merge pull request #104 from Aemony/pcgw-link-fix
    * Improved PCGW link
     - Don't use app ID for Non-Steam games
     - Naively fall back to using window title for other games
 + Merge pull request #103 from Aemony/better-debug-menu
    * Moved ImGui debug options to a submenu

23.10.7.1
=========
 + Disabled imgui.ini code in new version of ImGui
 + Automatically enable Multitasking-On-Top when using Aspect Ratio Stretch

23.10.7
=======
 + Added experimental auto-bias mode to Latent Sync to minimize latency;
     potential visible tearing is possible until the algorithm is polished
 + Changed the graph scale for Reflex's timing to adjust to single-frame
     outliers
 + Fixed abnormal pixel spacing on framepacing widget after ImGui upgrade

23.10.5
=======
 + Selecting non-Latent Sync Framerate Limiter modes will revert to
     original VSYNC settings rather than forcing 1:1 VSYNC on.
 + Selecting VRR Optimized Framerate Limiter mode while 1/n VSYNC is
     on will warn the user that this prevents VRR from working.
 + Selecting DLSS-G Framerate Limiter mode no longer changes VSYNC
     setting.
 + Renamed "Draw Calls" to "Render Submit" in Reflex timing plot
 + Restored original LT+RT / L2+R2 widget toggle behavior when
     SK's control panel has been opened using a gamepad

23.10.4.1
=========
 + Renamed Reflex timing plot to Simulation, Draw Calls, GPU Render

23.10.4
=======
 + Added experimental ImPlot visualization for Reflex timing data:

     * CPU/API/GPU time per-frame for the last 64 frames

23.10.3.1
=========
 + Added a 2 frame latency to DLSS-G engagement checks

    A game must "evaluate" the DLSS-G feature within 2 SwapChain presents, or
      SK will assume that it has reverted to normal presentation and fallback
        to normal framerate limiting strategies.

    This eliminates most false-positive DLSS-G status while games are in menu
      screens but have not technically disabled DLSS-G.

23.10.3
=======
 + Fixed most broken keyboard functionality following the ImGui codebase update

23.10.2
=======
 + Experimental version with ImGui render code updated
 + A number of input-related features have been broken by this update, and
     will be fixed over time.

23.9.30.2
=========
 + Added command console variable to control cursor visibility using macros

     Cursor.Visible {true|false}

23.9.30.1
=========
 + Fixed D3D12 SwapChain resize failures in FSR3 Frame Generation games.

23.9.30
=======
 + Added OBS executables to SK's internal injection blacklist to prevent
     SK from injecting into the Steam version w/o users whitelisting it.

23.9.29.4
=========
 + Set Starfield's Resolution Scale setting accordingly when selecting a
     DLSS Mode in FSR2Streamline.

23.9.29.3
=========
 + Framepacing graph now displays the dim "NV" text whenever Reflex's framerate
     limiter is active, even if the user is not manually using DLSS-G Pacing.

23.9.29.2
=========
 + Implicitly override a game's Reflex settings if DLSS-G is active and
     a framerate limit is set, but user has not requested Reflex override.
 + Correctly handle Reflex overrides in games (i.e. The Witcher 3) that set
     NvSleep parameters EVERY frame despite documented performance penalties.

23.9.29.1
=========
 + Run all of Starfield's Steam callbacks on its main thread

23.9.29
=======
 + Added DLSS-G detection for all D3D12 games; false positives may happen
     when using menus in some games that switch DLSS-G off in menus.

23.9.28.5
=========
 + Fixed potential initialization issues in Nixxes games that use
     Streamline + DLSS-G

23.9.28.4
=========
 + Added Reflex + SK Framerate Limiter back to FSR2Streamline's DLSS-G
     control panel.

    >> Enabled by default, this may temporarily increase latency after
         opening menus (DLSS-G turns off) and closing them. But latency
           will come down during gameplay.

    * Should produce DLSS Frame Generation frame pacing nearly as good as
        SK native framerate limiting.

23.9.28.3
=========
 + Disabled Streamline compatibility mode for FSR2Streamline in Starfield,
     reset SK's config file if using an updated version of FSR2Streamline.

23.9.28.2
=========
 + Handle Auto-DLSS-G pacing mode better when using FSR2Streamline

    >> Previous implementation did not auto-activate DLSS-G Pacing mode
         without first opening the control panel...

23.9.28.1
=========
 + Added alternate thread scheduling mode for Starfield:

    * Prevents CreationRender threads from rapidly raising and lowering priority
    * Disables likely errant SetThreadPriorityBoost (..., TRUE) on I/O threads
    * Raises priority on game save thread to reduce hitching

   Enabled by default, see the Performance section of Starfield's control panel

23.9.28
=======
 + Automatically load FSR2Streamline.asi w/ lazy load order if it is present
     in a game's directory
 + Acquire DLL loader lock before suspending threads to prevent deadlock

23.9.27.2
=========
 + Added support for FoV and mipmap LOD bias control to Microsoft Store
     versions of Starfield, and removed reliance on hard-coded addresses.
 + Added internal cache of Starfield addresses per-version to speed init
     up and reduce timing conflicts with other mods.

23.9.27.1
=========
 + Initialize Starfield plug-in while all threads are suspended in order to
     prevent races with other mods.
 + Added additonal HDR rendertarget upgrades for Starfield's single-channel
     8-bpc RTs.

23.9.27
=======
 + Reworded forced 1/n VSYNC mode options to indicate they disable VRR
 + Fixed multiple framerate limiter mode combo boxes in control panel for
     non-Reflex capable users.

23.9.25
=======
 + Added hard-coded memory addresses for Steam version 1.7.33.0 of Starfield

23.9.19.1
=========
 + DLSS-G Frame Pacing Limiter Mode is FORCED on while using DLSS-G,
     when DLSS-G deactivates (i.e. in menus, SK will revert to its more
       efficient framerate limiter options.

   * This will apply universally to all DLSS-G Frame Gen games in the future!

 + Changed Starfield resolution scale warning to report % in 1 dimension

23.9.18.3
=========
 + Added workaround for SFSE not loading plug-ins early enough...
     please do not load render plug-ins using SFSE, they will be loaded
       too late to work reliably.
 + Removed Ultra Performance option, since Starfield's minimum
     render scale is 50% and it requires 10%.

23.9.18.2
=========
 + Fixed crash in FSR2Streamline tooltips because of % rather than %% in
     a formatted string function

23.9.18.1
=========
 + Added better tooltips to FSR2Streamline DLSS mode selection
 + Initialize FSR2Streamline earlier to enable warnings for mismatched
     resolution scaling -before- the engine initializes.

23.9.18
=======
 + Added resolution scale warning if using FSR2Streamline with invalid
     resolution scale for the selected DLSS profile.

23.9.16.1
=========
 + Updated to work correctly with new version of FSR2Streamline

23.9.16
=======
 + Removed SwapChain override from SK's log unless user settings actually
     resulted in an override being applied
 + Added support for changing FSR2Streamline parameters in real-time with
     newer releases of the mod
 + Added Raw Image tonemap mode to passthrough SDR image in an HDR container
     for third-party (i.e. ReShade) image processing instead of SK's own

23.9.15.2
=========
 + Hooked up clipboard-only screenshot feature to D3D12 render backend

23.9.15.1
=========
 + Added keybinds for capturing screenshots without third-party overlays and
     without saving anything to disk (clipboard-only).

23.9.15
=======
 + Added ReShade Mode to Compatibility Settings

     [Compatibility.General]
     ReShadeMode={true|false}, Default: false

    * Enabling this allows, in most D3D11 and D3D12 games, to change when ReShade
        post-processes the scene by using the "Show OSD In Video Capture" option
          in SK's control panel.

       When "Show OSD in Video Capture" is turned off, you can use ReShade
         to post-process the pre-HDR retrofitted image, producing better HDR and
           not screwing up SK's UI :)

       Turn the option ON if to use HDR analysis shaders on SK's HDR output.

     - If it is working as intended, toggling "Show OSD..." On/Off should cause
         ReShade's own UI to switch between drawing above or below SK's UI.

23.9.14.1
=========
 + Revert framerate limiter change in 23.9.14, because it only works as intended
     in some games Reflex implementations.
 + Fixed various issues with forcing HDR10 on in D3D12 games that
     aren't already 10-bpc

23.9.14
=======
 + Combined Reflex (DLSS-G Pacing Mode) with the SK's last framerate
     limiter mode selected, to provide slightly better frametime consistency
       on -REAL- frames when using DLSS-G Frame Generaiton.

    >> Latency should be unaffected, making this the only known third-party
         limiter that works correctly in DLSS-G games.
   
 + Re-worded Streamline warning when enabling scRGB HDR to mention DLSS3
     and HDR10 and remove the mention of a custom Streamline Interposer
 + Changed INI parser error message (UTF-8 to UTF-16 conversion) to removed
     user identifiable paths from logs
 + Removed AutoDeleteDLSSG and AllowDLSSG options from INI

23.9.13.4
=========
 + Special K is compatible with all Streamline games tested, no interposer
     replacement required.

    * A handful of games support scRGB HDR through SK with DLSS-G, however,
        the game's render pipeline up until final outpuit is 10-bpc, so this
          doesn't really bring any benefits.

      >> Use HDR10 for Frame Generation games, less of a headache :)

23.9.13.3
=========
 + Reduced log spam on multi-monitor systems when moving windows between monitors
 + Added support for D3D11 HDR pipeline remastering when forcing HDR10, or when
     running an HDR10-native game with HDR10 selected in the HDR widget.

   >> For the HDR10-native case, remember to select HDR10 Passthrough (Preset 3)

 + Updated FOV / Mip Bias memory addresses for Starfield 1.7.29.0 (Steam-only)

23.9.13.2
=========
 + Disable framerate limiter bypass functionality if sl.interposer.dll is loaded;
     assume that DLSS-G mod has already disabled this game code in Starfield.
 + Turn framerate limiter bypass off by default to prevent compatibility issues
     with other Starfield mods doing the same thing.

23.9.13.1
=========
 + Accidentally set AutoDeleteDLSSG instead of AllowDLSSG in 23.9.13

23.9.13
=======
 + Improved Streamline/DLSS-G support

    * Some games (i.e. Ratchet and Clank) now support DLSS Frame Generation while
        scRGB HDR is active in SK.

    An updated Streamline Interposer (Streamline 2.2.0) is available on Discord,
      use it for maximum compatibility with Starfield [HDR10 ONLY].

 + AllowDLSSG is now enabled by defaultrr

23.9.12.5
=========
 + Moved Reflex-based FPS limit to Framerate Limiter Mode option (on qualifying HW)
 + Added green NV text to top-left of framepacing graph when Reflex limit is active
 + VSYNC is turned off by default when selecting Reflex limiter; intended for DLSS-G

23.9.12.x
=========
 [.4] + Remove assertion message on NvAPI_Disp_HdrColorControl hook execution if
          called using a struct version SK doesn't know about; NV's DXGI/Vk interop
            uses NV_HDR_COLOR_DATA_VER3, but this NVAPI version is not released yet.
 [.3] + Added option to use NVIDIA Reflex framerate limiter instead of SK's limiter
          >> Intended for use with DLSS Frame Generation, see the Advanced section.
 [.2] + Added option (enabled by default) to disable Starfield's built-in FPS limiter
          >> Potentially fixes Frame Generation deadlocks during load screens
 [.1] + Added version check to Starfield plug-in so that hard-coded memory addresses
          do not cause problems on first game patch

23.9.12
=======
 + Added option to upgrade 11-bpc HDR render targets to 16-bpc in Starfield
    * Less likely to reduce banding; more likely to keep white things white

23.9.11.7
=========
 + Allow HDR10 colorspaces to be set even if framebuffer is 8-bpc
     (undocumented feature?/bug in DXGI)
 + Restrict range of HDR luminance slider to display limits when using one of
     the preset Perceptual Boost profiles

23.9.11.x
=========
 [.6] + Screenshots taken using SK's keybind (F8) will now be taken -AFTER-
          third-party software (i.e. ReShade) performs end-of-frame rendering
 [.5] + Apply DXGI Colorspace changes as many times as needed when changing HDR
 [.5] + Prevent games from setting HDR metadata while HDR10 override is active
 [.4] + Added Streamline Hook Compatibility Mode; breaks normal games

         [NVIDIA.Bugs]
         StreamlineCompatibilityMode={true|false}  Default: False

 [.3] + Various changes to HDR10/scRGB Colorspace Management:

          * Added command console variables HDR.EnableSCRGB, HDR.EnableHDR10,
             - HDR.Enable false can turn HDR off regardless which mode is active
             - HDR.Enable true defaults to scRGB
          
          * Added warnings and better tracking for partial HDR10 state enable
              (i.e. prompt to restart game or press Alt+Enter)
          
          * Load HDR config files before game-specific plug-ins, so that user
              preferences can be used by plug-ins during startup.

 [.2] + Fixed a problem where some Starfield mods put the game into Windows 7
          compatibility mode, causing SK not to initialize correctly because
            IsWindows8Point1OrGreater (...) and IsWindows10OrGreater (...) both
              fail.
          
           * SK would try Windows 7 fallback codepaths... for a D3D12 game, and crash.
 [.1] + Additional improvements to HDR screenshot tonemapping

23.9.11
=======
 + Fixed all HDR visualization modes when HDR10 is active
 + Improved HDR -> SDR tonemap (screenshots) by applying Reinhard on luma and chroma

23.9.10.x
=========
 [.14] + Upgraded FSR2_RESAMPLED_LUMA_HISTORY to FP16 in Starfield for better HDR, if
           "Upgrade most 8-bit RTs to 16-bpc" is enabled.
 [.13] + Fixed HDR10 screenshots in D3D12; tonemapping and .jxr
 [.12] + Don't do any HDR image processing unless SK's 10BitSwapChain option is enabled
           >> Fixes games with native HDR10 being altered by SK without opting-in
 [.11] + Improved compatibility with Streamline/DLSSG for Starfield

     [Import.FSR2Streamline]
     Architecture=x64
     Role=ThirdParty
     When=PlugIn
     Filename=C:\Program Files (x86)\Steam\steamapps\common\Starfield\FSR2Streamline.asi

   >> Load the plug-in directly, delete winmm.dll and use PlugIn load-order

23.9.HDR10
==========
 + Added experimental HDR10 support

     * Visualizations are known to not work (other than Grayscale / Tonemap Curve)
     * SK's UI will be rather ugly compared to scRGB
     * Expect crashing, especially in D3D12 games

23.9.10.x
=========
 [.5] + Changed ImGui's D3D12 command execution code so that graphics crashes reach
          a game's GPU crash handler rather than triggering SK's CPU crash handler
 [.4] + Fixed rare framepacing graph and CPU widget initialization race
 [.4] + Added memory address caching to Starfield plug-in
 [.3] + Sped up Starfield plug-in init
 [.3] + Fixed instances of "Removing Corrupted Hook for 'DirectInput8Create'..."
 [.2] + Added PhotoMode Compatibility setting for Starfield
 [.1] + Added Mipmap LOD Bias and FOV control for Microsoft Store version of Starfield
 [.1] + Fixed range and power on LOD Bias control slider in Starfield

23.9.10
=======
 + Added Mipmap LOD Bias control to Starfield for Steam users

23.9.9.x
========
 [.6] + Added support for extended remastering to non-Steam version of Starfield
 [.5] + Fixed reversal of meaning for INI_UTF8 and INI_UTF8NOBOM
 [.4] + Fixed 16-bpc SwapChain being enabled for non-HDR users in Starfield
 [.3] + Added support for upgrading RTs to 16-bpc even for non-HDR users
 [.3] + Added options to upgrade Render Targets to 16-bpc in Starfield to control panel
          >> Steam users have additional options available
 [.2] + Fixed Bethesda games plug-in to create INI files in ANSI mode
 [.1] + Fixed problem in 23.9.9 that could cause INI data loss

23.9.9
======
 + Added support for encoding UTF-8 INI files without a Byte-Order-Marker
 + When loading existing INIs, UTF-8 Byte-Order-Marker beahvior is preserved

23.9.8.2
========
 + Only reallocate D3D12 heaps too small to store the remastered SwapChain for Starfield

23.9.8.1
========
 + Merge pull request #91 from Aemony/asi_support
    * Added ASI files to the plugin file dialog

23.9.8
======
 + Integrated Ersh's solution for isolating remastering to certain rendertargets,
     if SK remasters all RTs allocated using D3D12Device_CreatePlacedResource, it will
       cause artifacts in some cases.
 + Removed CreateRTV spam from logs for Starfield

23.9.7.1
========
 + Fixed a few visual glitches in Starfield HDR remastering, by restricting the feature
     to render-passes only and ignoring compute-only resources.

   The resolution restrictions are not necessary when ignoring compute,
     and have been removed.

23.9.7
======
 + Added HDR Pipeline Remastering to Starfield

     8-bpc Render targets with resolution > 1024 W or > 1024 H are now
       promoted to 16-bpc for higher precision and unclipped HDR luminance

    This makes the NativeHDR plug-in unnecessary, as it only remastered UI RTs.
    
     * Won't work with DLSS Framegen; turn that off if you want the best HDR.

23.9.6
======
 + Added Windows.Gaming.Input input counter to Input Management tab
 + Fixed missing Raw Input issue in Serious Sam Fusion 2017

23.9.5
======
 + Initial implementation of Windows.Gaming.Input gamepad hooks...

    Allows gamepad input in Starfield while you alt-tab to a different app if
      "Continue Rendering" is enabled. If you use this feature, you need to
        disable keyboard input to the game or it will think Alt is stuck down.

    Windows.Gaming.Input usually stops reporting input while the game window
      does not have focus, so SK polls XInput while the window is out of focus
        and uses that to generate Windows::Gaming::Input::GamepadReading values.

    This experimental WGI integration can be disabled w/ a hidden INI setting:

      [Input.Gamepad]
      EnableWindowsGamingInput=false

23.9.4.2
========
 + More fixes for Honkai Star Rail's anti-cheat

23.9.4.1
========
 + Fixed Honkai Star Rail's SetThreadDescription (...) calls crashing its launcher
 + Hooked GetGUIThreadInfo (...) to improve odds of background rendering working

23.9.4
======
 + Disabled hook on SetLastError (...) unless Special K was built in debug mode

23.9.3.4
========
 + Reverted a change in 23.9.3.2 that broke Path of Exile

23.9.3.3
========
 + Fixed D3D9 games not tracking focus window correctly after 23.9.3
 + Added config setting to fake foreground status instead of window activation
     when implementing the "Continue Rendering" feature, for games like
       Fallout: New Vegas that refuse to cooperate while alt-tabbed.

    [Window.System]
    TreatForegroundAsActive={true|false}, Default: False => (Input Focus == Active)

23.9.3.2
========
 + Fixed potential window management problems in non-Yuzu games added in 23.9.3
 + Merge pull request #88 from WallSoGB/Bethesda
    * Add global Bethesda games plugin:

     - Memory patch for FNV, FO3, TESIV for compatibility with SK's texture tools.
        (Injection doesn't work, but cache + debug visibility do)
     - FOV sliders for Starfield.

23.9.3.1
========
 + Reorganized thread and debug-related hook initialization for faster startup
     and re-enabled hook on SetThreadAffinityMask (...).
 + Upgraded Halo Infinite to XInput 1.4 instead of UAP so that background
     input processing and gamepad blocking hooks work correctly.

23.9.3
======
 + Added window management hacks to change what SK considers the game's
     primary window in Yuzu when switching between Single and Multi-Window
 + Added D3D12FootGun mode, if you have to ask, you don't need/want it
 + Allow "Sleepless Render Thread" option to be selected in D3D12

23.9.2.6
========
 + Fixed black terrain textures in Starfield while HDR is active
 + Fixed potential crash during screenshots introduced in 23.9.2.3

23.9.2.3
========
 + Added detection for mismatched Unicode / ANSI Window Classes, so that window
     procedure hooks persist correctly when windows are recreated (Starfield)

23.9.2.2
========
 + Fixed mistracking window dimensions when Starfield re-creates its window

23.9.2.1
========
 + Fixed HDR support in Starfield and changed its internal RTVs from
     B8G8R8A8_UNORM to R16G16B16A16_FLOAT for compatibility with Steam overlay

23.9.2
======
 + Added Multi-Monitor Mode to Window Management Settings

    This is an experimental mode that allows specifying Override Resolutions
      that span multiple monitors.
      
    Traditionally SK has imposed several measures to keep window dimensions
      within the confines of a single monitor because rendering into a window
        that spans more than one monitor incurs major DWM overhead.

    Windows 11's DWM is changing to better support multi-monitor rendering,
      so spanning monitors in windowed-mode is now viable in some situations.
      
    For sensible frame pacing, your displays should use the same refresh rate.
    
 + Merge pull request #85 from Aemony/sam2017
    * Don't hook Serious Sam Fusion 2017's window procedure

23.9.1.2
========
 + Fixed Display Management Keybindings not opening keybind edit dialog when
     selected from the control panel's Display menu

23.9.1.1
========
 + Added ~ operator to Float / Int / Short command console variables to negate
     the existing value.

    * Due to the way TargetFPS works with negative values, this allows you to
        toggle the framerate limit without losing your preference.

23.9.1
======
 + Fixed instability in Starfield's D3D12 SwapChain when changing window modes
 + Fixed potential uninitialized pointers in SK_GetThreadDescription on Win 8

 + Merge pull request #83 from Nustat0/unity-asyncinit
    * Prevent AsyncInit from re-enabling itself in Non-OGL Unity games
 + Merge pull request #86 from Aemony/eldenring_ps
    * Elden Ring: Updated to use current PS texture hash

23.8.29
=======
 + Added INI setting to raise process priority to High instead of Above Normal
     for settings that conditionally raise priority based on window state.

     [Scheduler.Boost]
     RaisePriorityToHigh={true|false}, Default: false => (Uses Above Normal)

 + Fixed D3D11 Render State Tracking remaining on -after- a HUDless screenshot

23.8.28.1
=========
 + Fixed GitHub Issue #81, imported .ini file parse failure on pre-mature EOF

23.8.28
=======
 + Added 3rd level of cache hierarchy for textures (L3Hash) to reduce D3D11
     texture caching overhead in games that load textures multi-threaded.

    [Textures.D3D11]
    CacheUsingL3Hash={true|false}, Default: true

     * This potentially uses more CPU memory, but it should be negligible.

23.8.27.3
=========
 + Changed default HDR Profile 0 gamma from 0.965 to 0.95

23.8.27.2
=========
 + Defer initialization of WASAPI (volume widget) for games using Dolby Atmos
 + Removed assertion for D3D11 Immediate Device Context equivalency during
     ImGui rendering, some mods will break this assumption without crashing.

23.8.27.1
=========
 + Fixed "Bad Format" warning that may appear in some D3D11 games that use
     DirectX Video for decoding their FMV cutscenes (i.e. NieR: Replicant).
 + Low-Spec Mode is automatically disabled if a user has texture mods installed.
 
23.8.27
=======
 + Optimized stack memory usage for D3D11 state block recording
 + Removed a few applications from the strictest level of injection blacklist

23.8.26.2
=========
 + Removed unnecessary call to AllowSetForegroundWindow (...) during init.

23.8.26.1
=========
 + Added Baldur's Gate HUD shaders to internal list for HUD toggle / HUDless
     screenshots
 + Only ask to enable Vulkan Bridge when launching the -Vulkan- version of BG3

23.8.26
=======
 + Post-multiply alpha in sRGB gamma for HDR10
 + Changed UI alpha -output- while in scRGB HDR mode to use sRGB gamma
 + Improved support for rendering widgets while global UI scale is > 1.0
 + Switched to pre-multiplied alpha for ImGui rendering in D3D11/12/Vulkan/GL
 + Reverted FCAT bars back to all vertical and wider
 + Merge pull request #80 from Aemony/main
    * Bypass EAC for Armored Core VI
 + Merge pull request #72 from Nustat0/dgvoodoo-d3d12
    * Fixed GUI not showing up when bootstrapping dgVoodoo (D3D12)

23.8.22
=======
 + Updated HDR Profile 0 to use .96 gamma by default
 + Changed HDR Gamut Expansion to use D65 white instead of D60

23.8.21
=======
 + Updated HDR Profile 0 for new gamut unclamped HDR processing
     >> This profile targets 534 nits
 + Moved the old HDR Profile 0 defaults to Profile 1 (570 nits)
 + Disabled Raw Input caching because it breaks keyboard input in some games

23.8.19.1
=========
 + Fixed Baldur's Gate 3 game detection only testing the Vulkan executable
 + Fixed Baldur's Gate 3 alt-tab flakiness (do not use Multitasking On Top)

23.8.19
=======
 + Removed the Energy Efficiency section from the Framerate Limiter / Advanced
     control panel, unless the user has an AMD CPU.
 + Removed the experimental tuning knobs for busy-wait ratio; they are not
     needed on AMD CPUs and will be brought back in the future if Intel's
       equivalent MWAITX instruction is integrated into SK.

23.8.18.3
=========
 + Handle D3D11 implementations where ID3D11Device1::GetImmediateContext1 is
     not a vftable alias to ID3D11Device::GetImmediateContext
 + If a game raises multiple exceptions from the same address more than 3 times,
     it will stop being logged unless log level is >= 1.
 + Removed log spam for shader cache collisions due to games compiling the same
     shader on multiple threads unless log level is >= 1.

23.8.18.2
=========
 + Decreased color gamut on SK's HDR UI slightly

23.8.18.1
=========
 + Assign *pcbSize the same value as GetRawInputData returns to fix Fallout 4

23.8.18
=======
 + Optimized Unreal Engine's use of Raw Input (2 calls per-data polled)
 + Removed black point compensation from SK's HDR UI since EDID info is wrong
 + Increased color gamut on SK's HDR UI

23.8.17.2
=========
 + Disable PreventEnumDevices option by default in NieR Replicant
 + Destroy framerate limiter and stats when a tracked SwapChain is destroyed
 + Shutdown framepacing statistics thread when framerate limiter is destroyed

23.8.17.1
=========
 + Optimized NVIDIA's Vulkan/DXGI interop to use a single ID3D11Device rather
     than destroying it and creating a new one every time a window is resized.

    >> This is _necessary_ in 32-bit Vulkan games (i.e. DXVK) to prevent running
         out of memory during resolution changes.

     * It also ensures that switching games in Yuzu works without having to
         completely restart the emulator when using NVIDIA's interop.

23.8.17
=======
 + Implicitly force windowed mode if "Render in Background" is configured, to
     prevent Fullscreen Exclusive games from not responding when Alt-Tabbing
       back in.

23.8.16.2
=========
 + Fixed mouse input not tracking in Yuzu's multi-window mode and in some
     Fullscreen Exclusive games

23.8.16.1
=========
 + Avoid calling ID3D11DeviceContext::UpdateSubresource (...) twice sometimes
 + Forward the return address to SK_D3D11_UpdateSubresource_Impl so that texture
     cache invalidation is attributed to the correct DLL in log files

23.8.16
=======
 + SK::Diagnostics::CrashHandler::InitSyms (...) no longer implicitly installs
     SK's unhandled exception filter if handle_crashes is set to false

23.8.15.3
=========
 + Properly handle API name change on AMD Vk interop (D3D12 SwapChain)

23.8.15.2
=========
 + Do not cache D3D12 SwapChains when AMD's Vulkan interop is detected
 + Change API name to Vulkan instead of D3D12 when using AMD's Vulkan interop

23.8.15.1
=========
 + Disable SwapDeviceContextState because it causes the Steam Overlay to crash

23.8.15
=======
 + Fixed handling of WM_NCACTIVATE when borderless is enabled causing WatchDogs2
     to think its window is always in the background
 + Added nullptr checks to various ID3D11DeviceContext hooks
 + Switched D3D11 stateblock code to use SwapDeviceContextState (...) for
     immediate contexts when supported by the driver

23.8.14.3
=========
 + Game window is back to being considered active by default, because otherwise
     SDL2 thinks no input devices are attached

23.8.14.2
=========
 + Game window is initially considered inactive to prevent things like
     confining the mouse cursor to the game window from applying at startup
       when the game window is not in the foreground
 + Fixed D3D11 Immediate Device Contexts being wrapped twice in some cases

23.8.14.1
=========
 + Always wrap D3D11 Immediate Device Contexts, because NV's DXGI/Vk interop
     breaks during window resize if there is no immediate context to flush
 + Improved thread safety when reporting unexpected COM QueryInterface IIDs

23.8.14
=======
 + Moved saturation back to applying after Perceptual Boost to fix hue shift
 + Fixed incorrect HDR gamut overshoot visualization due to unnormalized xyY color

23.8.13.3
=========
 + Changed Perceptual Boost back to Rec709; accidentally left in 2020 in .2
 + Fixed potential crash in PresentMon if presentation stalls long enough and
     pLast is nullptr

23.8.13.2
=========
 + Added GDeflate support and usage tracking for DirectStorage titles

23.8.13.1
=========
 + Apply saturation and gamma before Perceptual Boost

     >> Default presets have been changed to 100% saturation to compensate for
          MASSIVE loss in color gamut

23.8.13
=======
 + Tales of Vesperia defaults to D3D11 Deferred Mode for DoF disable to work

23.8.12.3
=========
 + Added HDR "Import" button to HDR widget and changed behavior of "Reset"
 + Reload Global\hdr.ini whenever "Import" is used to allow manual changes

23.8.12.2
========= 
 + Fixed various D3D11 render state tracking related features not working in
     Tales of Vesperia and Yakuza 0

23.8.12.1
=========
 + Minor tweak to implicit window focus on foreground status
 + Fixed Perceptual Boost not being enabled by default in HDR Profile 1

23.8.12
=======
 + Optimized D3D11 render state tracker code for wrapped/hooked D3D11 device
     interfaces.

23.8.11.3
=========
 + Optimized D3D11 HDR processing pipeline by eliminating an extra texture copy
     when previous frame images are not needed to mitigate NaN (99% of games).

23.8.11.2
=========
 + Fix Alt-Tab problem in Baldur's Gate 3 and any other game that ignores
     WM_SETFOCUS when alt-tabbing back in.

23.8.11.1
=========
 + Optimized HDR shader slightly by skipping NaN / Infinity removal on the input
     image, and only performing it before clamping the output to Rec 2020.

23.8.11
=======
 + Added HDR processing time (GPU execution) to HDR widget in D3D11-based modes
 + Added new Profile 1 default values, this profile has less black crush and
     improves UI/midtone visibility BUT the value on the luminance slider is
       not accurate.
       
    >> If you want to adjust Profile 1, familiarize yourself with using the
         tonemap visualization mode (after profiling display).
         
      * The luminance slider can't calculate the light output for this profile.

23.8.10.1
=========
 + Allow games to use dxdiagn.dll at startup as default policy, the ones that
     do (mostly Ubisoft) will take a good minute or two to start because they're
       collecting your hardware info using dxdiag EVERY TIME you start the game.

23.8.10
=======
 + Fixed potential crashes in newer Unity engine games that use
     Buffered Raw Input.

23.8.9.2
========
 + Fixed mouse input not working in control panel when Disabled to Game.

23.8.9.1
========
 + Fixed mouse input not working in control panel in emulators like Yuzu

23.8.9
======
 + Added keybinding to use the previously gamepad-only "hide all widgets"

    * NOTE: This is actually a toggle and hidden widgets will be restored
              by pressing the keybind a second time.

 + If users has "hide all widgets" (LT+RT while control panel is open)
     active and then uses a widget toggle keybind, "hide all widgets" will
       now disengage to make things less confusing.

23.8.8
======
 + Perceptual Boost is now performed in LMS color space
 + Changed handling of NaN/Infinity in sRGB <--> Linear conversion shader
 + Updated HDR screenshot tonemapping code to work with wide gamut colors,
     it's not great but at least produces sensible colors now.

23.8.7.4
========
 + Fixed Middle Gray Slider to work in unclamped color.

    >> Any existing HDR profiles that used a non-zero middle gray value
         will need to be re-calibrated.

23.8.7.2
========
 + Cursor auto-hide works when mouse input is set to "Disabled to Game"
 + ImGui cursor is removed from screen when other windows have focus

23.8.7.1
========
 + Fixed potential crash in Baldur's Gate 3 due to mouse Raw Input data
 + Fixed mouse cursor not centering on control panel when first opening it
 + Fixed mouse anti-warp settings related to control panel state applying
     even when control panel is not open
 + Set default preference for anti-warp when windows cursor is visible to off

23.8.7
======
 + Fix potential black screen issues in Yuzu using Vulkan
 + Changed HDR Perceptual Boost to run in Rec 2020 colorspace, the final
     image should have less aggressive red saturation.

23.8.6.3
========
 + Improved compatibility with Vulkan/DXGI interop when the Steam overlay
     is not disabled (D3D11 texture cache needs to be cleared if enabled)

   >> It is still HIGHLY recommended that you disable the Steam overlay when
        using Special K in Vk games, because it hooks both Vulkan and D3D11!

23.8.6.2
========
 + Add locks back around shader cache management code to fix God of War

23.8.6.1
========
 + Fixed rare XInput crash if game calls on XInput during initialization
 + Raised minimum HDR light level (above pure black) to fix artifacts on
     colors outside of Rec 709

23.8.6
======
 + Added separate options for HDR Render Pass and HDR Compute Pass remastering,
     use the "Experimental" tab to access the new setting.

    >> Previous versions included Compute Passes under the Render Pass setting.
       
    Since compute shaders are the most likely cause of glitches when using HDR
      remastering, the settings are stored separately now.

23.8.4.5
========
 + Optimized Raw Input hooks for better performance when SK's UI is NOT
     blocking input to the game.
 + Added (hidden) INI option to turn off RawInput hooks:

     [Input.Gamepad]
     EnableRawInput={true|false}

   * You may manually add this to INI files for debugging; discouraged

23.8.4.4
========
 + Fixed potential crashes in SDL-based games if they read gamepad input
     using Raw Input and "Continue Rendering" is enabled.
 + Disabled gamepad input to SK while games are in the background unless
     "Continue Rendering" is enabled and Gamepad Input is not set to
       "Disabled in Background".

23.8.4.3
========
 + Fixed potential crash when launching Elden Ring
 + Optimized HDR processing shader slightly for NaN / Infinity color stripping

23.8.4.2
========
 + Raised default HDR Preset 0 saturation to 98% since increased saturation
     is less of a problem when there's left over space in the output gamut.

23.8.4.1
========
 + Fix artifacts on colors with very small negative values at the edge
     between Rec 709 and DCI-P3 that were turned completely black by
       the original attempt to unclamp HDR color.

23.8.4
======
 + Removed internal Rec 709 gamut clamp from SK's HDR color processing (scRGB).

     >> Colors are now clamped to Rec 2020; anything beyond Rec 2020 cannot be
          displayed on Windows or for that matter on actual displays :)

23.8.3.7
========
 + Added XInput Slot Disable option to fix Baldur's Gate 3 thinking that multiple
     controllers are connected and forcing you to restart the game.

     [Input.XInput]
     DisableSlots=1,2,3 (Comma separated from 0 to 4) - Blank: Nothing Disabled

   >> BG3 suggested setting: 1,2,3 assuming you are not using local multiplayer

23.8.3.6
========
 + Cleanup various window message pump code in SK so that only the game's
     message pump(s) go through SK's hooked functions and not SK's own messages.

23.8.3.5
========
 + Fixed ActivateAtStart option not working correctly when used with SK's
     "Continue Rendering" window management feature.

23.8.3.4
========
 + Fixed potential black screen in some multi-window applications such as VLC

23.8.3.3
========
 + Enable PreventEnumDevices by default in Baldur's Gate 3; it does not prevent
     Steam Input from working, only disables the part of it that hurts perf.
 + Activate Baldur's Gate 3's window after 15 frames are drawn so that it does
     not think the game is in the background and draw at 30 FPS constantly.
 + Added INI option to activate a game's window when it starts (see above)

     [Window.System]
     ActivateAtStart={true|false};  Default: false

23.8.3.2
========
 + Added INI option to keep Steam Input from murdering performance by
     enumerating devices every frame

    [Input.DInput]
    PreventEnumDevices={true|false}

   * Fixes most of Steam Input's performance issues in Baldur's Gate 3 and
       NieR: Replicant. Sure would be nice if Valve would fix this... :-\

23.8.3.1
========
 + Yet more fixes for Baldur's Gate 3's screwed up gamepad code, yikes!

23.8.3
======
 + Add code to prevent dereferencing a NULL lpMsg when Baldur's Gate 3 calls
     GetMessageW (...) on its SDL_joystick thread.
 + Turned default HDR Saturation on Preset 0 down to 95%, since Perceptual Boost
     massively increases saturation to begin with.

    >> If the new desaturated values are not to your liking, it is suggested you
         try the gamut expansion slider before the adjusting saturation. Gamut
           expansion is more subtle and less "deep fried" color.

23.8.2.3
========
 + Add support for 8-bit HDR remastering in Baldur's Gate 3 (D3D11)

23.8.2.2
========
 + Fixed attempting to copy DXGI_FORMAT_R16_UNORM to DXGI_FORMAT_D16_UNORM using
     BltSurfaceCopy in Baldur's Gate 3 -- formats are direct copy compatible

23.8.2.1
========
 + Changed VRR optimized framerate formula from 95% of Refresh to:

     dVRROptimalFPS =
       dRefreshRate - (dRefreshRate * dRefreshRate) / (60.0 * 60.0) - 0.1

 + Filter out Exceptions from logs if they originate in NVIDIA MessageBus.dll

23.8.2
======
 + Restore compatibility with NVIDIA's Vulkan / DXGI interop layer, broken by
     various code changes to try and make Streamline work :sigh:

23.8.1.4
========
 + Partial workaround for ID3D11Resource reference count underflow in ReShade 5.9.0
     >> Please do not use 5.9.0, SK cannot fix it and will crash eventually.
 + Delay load comctl32.dll to reduce likelihood of SK's injected DLL becoming
     stuck in UWP processes such as Widgets.exe

23.8.1.3
========
 + Replaced forum link in control panel's Help menu with a Discord link
 + Removed option to restart NVIDIA driver from Help menu; SKIF can do it now
 + Fixed Yakuza 0 crashing at startup

     >> Using Special K in Yakuza 0 requires setting Borderless mode to work,
          game is Fullscreen by default (ugh).

23.8.1.2
========
 + Disabled 11-bit HDR remastering in all Yakuza games because it causes crashing
 + Added an option to disable XInput (and only XInput) devices to the current game

     [Input.XInput]
     HideAllDevices={true|false}

   >> Intended use-case is games with native DualShock / DualSense + XInput that
        break if they see both controllers at once (i.e. Nixxes games)

23.8.1.1
========
 + Re-enabled memory management workaround code for Yakuza games, I thought by
     now the bugs had been fixed... I was wrong

23.8.1
======
 + Added Streamline DRM bypass for "slSecureLoadLibrary"
 + Added option to automatically delete DLSS3 Frame Generation DLL from games

     [NVIDIA.Bugs]
     AutoDeleteDLSSG={true|false}

    * Default is false; recommended is to set true in Global\master_SpecialK.ini

     >> When "deleted", sl.dlss_g.dll will be renamed sl.dlss_g.dll-bak

23.7.31.4
=========
 + Added option to bypass DLSS3 Frame Generation DLL check so that if NVIDIA
     ever fixes their crap, users can turn it on and hopefully not crash.

     [NVIDIA.Bugs]
     AllowDLSSG={true|false}

23.7.31.3
=========
 + More DXVK fixes, should be the final fix needed

23.7.31.2
=========
 + Fix potential DXVK incompatibility introduced in 23.7.31.1, given that
     DXVK exports D3D11CoreCreateDevice but has the wrong interface.

    * D3D11CoreCreateDevice will be skipped if DXVK is detected.

23.7.31.1
=========
 + Hooked D3D11CoreCreateDevice and routed all calls to D3D11CreateDevice and
     D3D11CreateDeviceAndSwapChain through it to maximize code reuse
 + Initialize SK's D3D11 render hooks using D3D11CoreCreateDevice because it
     is not hooked by ReShade and this allows SK's UI and HDR image processing
       to reliably run -after- ReShade's post-processing.

    >> Some games may no longer work with ReShade loaded as a plug-in, or may
         require changing the load order (i.e. from PlugIn to Lazy).

    Traditional ReShade installs using dxgi.dll should work, however, installing
      as d3d11.dll will not work; ReShade does not export D3D11CoreCreateDevice

23.7.31
=======
 + Fixed potential stutter when framerate limiter uses AMD MWAITX on high-end CPUs

23.7.30
=======
 + Special K is no longer compatible with DLSS3 Frame Generation in any way.

     >> Previously, you could use DLSS3 Frame Gen with local injection provided you
          did not use HDR (since it is incompatible with scRGB).

        However, because of many Nixxes games unusual implementations, even if you
          run games with DLSS3 turned off (or your hardware does not support it),
            NVIDIA Streamline will still crash.

     * Users will be told to remove sl.dlss_g.dll if it is detected, and there are
         no plans to make Special K compatible with DLSS3, NVIDIA needs to fix this.

 + 20C AMD Zen temperature offset now applied to ALL AMD models, not just X

23.7.29.2
=========
 + Added 20C to various AMD Ryzen MSR thermal sensors that previously had no offset

23.7.29.1
=========
 + More Streamline crap -- if you delete sl.dlss_g.dll (framegen), you won't have to
     deal with Interposer warnings and global injection will be very reliable.
 + Added default DirectStorage tuning values for Ratchet and Clank:

     BulkPriority:    Normal   LooseReadPriority:      High
     TexturePriority: Low      NxStorageIndexPriority: Realtime

23.7.29
=======
 + Added NVIDIA Streamline warning back to codebase, since new versions of Streamline
     are even less stable than the old ones!
 + Users on SteamOS will not be shown Streamline warnings, since Streamline does not
     break SteamOS (lucky!)

23.7.28.3
=========
 + Added even more experimental DirectStorage queue priority overrides for
     Ratchet and Clank Rift Apart. Lowering priority may help to slow streaming
       down and reduce texture streaming hysteresis issues.

23.7.28.2
=========
 + Changed DirectStorage detection code to make it compatible with DirectStorage
     SDK sample applications (i.e. BulkLoadDemo)

23.7.28.1
=========
 + Added experimental DirectStorage overrides for D3D12/DStorage games

    >> All settings require a full game restart to take effect, current overrides:

     * Telemetry, BypassIO, GPU Decompression
     * File Buffering (cache disk I/O)

23.7.28
=======
 + Changed GPU voltage units from mV to V on text OSD to save space.

23.7.27
=======
 + Add support for AMD Ryzen Model 04h chips to SK's CPU sensor driver, these are
     certain new laptop chips.

23.7.26.2
=========
 + Add CreateDXGIFactory1@8 hack to workaround DXVK bug and support 32-bit versions
     of dxgi.dll on Wine.
     
    This symbol is not supposed to be DLL exported, but to ensure compatibility
      with buggy versions of Proton, SK will alias it to CreateDXGIFactory1.

23.7.26.1
=========
 + Add hack to fix SteamInput problems on Steam Deck.

     >> Using SK's control panel in SteamInput-native games will cause undefined
          behavior on Linux, but the Steam client will be less broken.

23.7.26
=======
 + Restore validation code lost during a refactor that ensures Proxy DLL plug-ins
     have matching CPU architectures and will not prevent a game from launching.

23.7.23
=======
 + Add error message if user attempts to use Special K as dxgi.dll in 32-bit games
     on SteamOS; rename DLL to d3d11.dll or Wine will crash in an endless loop.

     >> There is currently a bug in DXVK that makes this impossible because it
          will attempt to load CreateDXGIFactory1@8 instead of CreateDXGIFactory1

23.7.21
=======
 + Enable DXGI Budget tracking in WINE because it is implemented by DXVK now
 + Disable WASAPI-related features in WINE because it would spam logs otherwise
 + Change status line for Frame Pacing widget's Presentation Model to "Steam Deck"
     instead of telling users to install Special K

23.7.20
=======
 + If a user already has ReShade.ini in a game's directory when loading ReShade as
     a plug-in, SK will use ReShade's default config path instead of rebasing it.

23.7.18
=======
 + Transitioned codebase to support QPC or TSC-based timestamps for framerate
     limiting depending on CPU capabilities (namely CPU supports invariant rdtsc?)
 
     >> TSC-based code is currently disabled because it has unfinished timing
          issues in Latent Sync mode, but should be enabled soon.

 + AMD MWAITX Instructions are Enabled by Default for AMD Users

     >> They are now a stored config preference, you can turn them off
          for a marginal boost to framerate consistency, but a loss of
            energy efficiency on Ryzen CPUs.

23.7.14
=======
 + AMD Ryzen power-saving features are completely automated now, and simply on/off
 + AMD Ryzen power-saving features do not require WinRing0 anymore, but it still
     helps if you intend to monitor the impact of the option in real-time
 + Added CPU temperature and power consumption to Framerate Limiter | Efficiency
     section for Ryzen users w/ WinRing0 installed

23.7.13.2
=========
 + Prevent users from forcing a waitable SwapChain in games that already use it
 + Added Efficiency section to Framerate Limiter | Advanced

23.7.13.1
=========
 + Added tooltips to framepacing widget's Presentation Model status line

23.7.13
=======
 + Added experimental AMD Ryzen power saving feature to Latent Sync config,
     settings are not saved anywhere and the feature only activatesd when
       opening the Latent Sync config in its current experimental state.

 + AutoVRR Mode turns green and unchecks itself after it activates
     >> Users with previous config files who activated AutoVRR will not
          see it in green until they click the checkbox one time.

23.7.12.4
========= 
 + Added fallback if NvAPI_GPU_ClientRegisterForUtilizationSampleUpdates fails
 + Added D3DKMT option to SK's Control Panel under Compatibility | HW Monitoring
 + AutoVRR mode's non-Ultra Low Latency option will not turn off Reflex Boost
     mode when it activates if a user already had Boost mode configured on

23.7.12.3
=========
 + Add option to disable D3DKMT perfdata, since on some systems it causes driver
     performance issues.

      [Microsoft.D3DKMT]
      DisablePerfData={true|false}

        ( This may cause loss of fan speed, temperature, and voltage statistics
            depending on hardware vendor... Intel and AMD especially )

 + Only run GPU stats code for the text OSD if the text OSD is actually visible

23.7.12.2
=========
 + Init sensor data storage for DXGI memory budget tracking if GPU monitoring is
     not enabled. (Fixes 0 values on VRAM gauge if CPU/GPU Load% is not enabled)

23.7.12.1
=========
 + Add system to move SK's DXGI Memory Budget Monitoring thread to a different
     DXGI adapter if the game is running on a different adapter than expected,
       (i.e. NVIDIA Optimus moves game from iGPU to dGPU).

23.7.12
=======
 + Reduced D3DKMT overhead on GPU stats thread if nothing is currently
     displaying GPU clock rate / temperature / fan speed.
 + Added NvAPI_GPU_ClientRegisterForUtilizationSampleUpdates-based
     method for collecting GPU utilization % data on NVIDIA GPUs.

   >> This is lower-latency and higher precision than the traditional
        NvAPI_GPU_GetDynamicPstatesInfoEx-based load %, so it is more
          suitable for the GPU load % meter on the framepacing graph.

23.7.11
=======
 + Optimized VRR checks; redundant NvAPI_DISP_GetMonitorCapabilities calls
 + Removed scoped thread priority boost on framerate limiter wait, because
     when the function returns it could cause the thread to be rescheduled

23.7.10.3
=========
 + Added code to reset temporary display mode overrides when a game's active
     window is destroyed to cleanup for games that use non-standard exit.

23.7.10.2
=========
 + Rate-limit GPU stats thread to 150 ms to lower D3DKMT overhead

23.7.10.1
=========
 + Fixed awkward HDR widget minimum size when HDR is not active
 + Cleaned up GPU stats thread code

23.7.10
=======
 + Reset various framepacing statistics when games create new SwapChains,
     or more likely when NVIDIA's DXGI/Vulkan interop does (i.e. resize).
 + Fixed long-term (1000 frame snapshot) percentile data not updating
 + Stop showing latency statistics temporarily while average >= 1000 ms

23.7.9.6
========
 + Fixed wrong path when using local injection w/ user-defined screenshot path

23.7.9.5
========
 + Added User-Defined Screenshot Path; Manually edit Global\osd.ini

    [Screenshot.System]
    OverridePath=

   * Path must exist, or Special K will use the default per-profile path

23.7.9.4
========
 + Right-align current sensor readings in GPU widget
 + Added optional disk activity meter to framepacing widget
 + Renamed framepacing widget preference INI section in osd.ini
 + Improved GPU load % smoothing when using Pdh instead of ADL or NvAPI

23.7.9.3
========
 + Fixed Reflex settings not applying when new D3D11 SwapChains / Devices
     are created (i.e. for NVIDIA's Vulkan/DXGI Layered Present).

23.7.9.2
========
 + Fixed incorrect DLL used to hook nvapi_QueryInterface in 32-bit builds.

23.7.9.1
========
 + Fixed potential problems if PdhGetFormattedCounterValue (...) fails between
     GPU state polling intervals.

23.7.9
======
 + Improved auto-sizing of all widgets

23.7.8.7
========
 + Apply smoothing to GPU load% and temperature
 + Increased minimum width of D3D11 pipeline stats window
 + Enforce minimum width on GPU widget when auto-sizing

23.7.8.6
========
 + Smooth Fan RPM updates to avoid 0.0 for a single sensor sample interval
 + Change GPU widget to only hide fan graph when average RPM is 0, not
     when minimum RPM is 0.

23.7.8.5
========
 + Increased default minimum horizontal size on GPU widget (450 pixels)
 + Fixed border on CPU/GPU load meter not sizing correctly when scrolling down

23.7.8.4
========
 + Favor D3DKMT collected GPU temperature over ADL or NVAPI when available.
 + Change GPU load % to include fractional percentages for data collected from
     APIs that support it.

23.7.8.3
========
 + On NVIDIA GPUs that no longer report voltage or fan RPM, use D3DKMT to
     get this data.

23.7.8.2
========
 + Add 15 frame delay before attempting to initialize Pdh counters, so they
     have actual data.

23.7.8.1
========
 + Add luid to Pdh counter name:
 
     "\GPU Engine(*luid_0x%08X_0x%08X*engtype_3D)\Utilization Percentage"

   to correctly handle GPU load% on systems with multiple GPUs.

23.7.8
======
 + Added Pdh / D3DKMT fallback paths to collect GPU statistics if ADL or NVAPI
     are unavailable (i.e. Intel GPUs) or not working

23.7.7.4
========
 + Remove AMD GPU statistics from framepacing widget if user's system has a
     broken version of ADL

23.7.7.3
========
 + Don't show partial Reflex config options in D3D9 or on non-NVIDIA GPUs
 + Improved framepacing widget size calculation to eliminate scrollbar
 + Increase GPU polling frequency when framepacing widget is visible

23.7.7.2
========
 + Poll GPU statistics while framepacing widget is visible, instead of only
     GPU widget / text OSD.

23.7.7.1
========
 + Fix exit notification check for number of frames drawn; broken by 23.7.7

23.7.7
======
 + Added extra thread-safety measures to NvAPI display management functions
 + Simulate successful inject/exit when (un)installing local DLL using the
     compatibility menu

23.7.5.2
========
 + CPU load % counters changed to include fractions of percents
 + Added the ability to turn Reflex's Nothing but Boost option on in Vulkan
 + Removed various meaningless options from the Direct3D 11 settings in Vulkan

23.7.5.1
========
 + Fixed potential crash due to NVAPI_Disp_GetVRRInfo (...) thread (un)safety
 + Added CPU/GPU Load% meters to Framepacing Graph, they can be turned off by
     right-clicking the framepacing widget.

23.7.5
======
 + Bypass ReShade 5.x's ReShade.ini file check when loading plug-ins
 + Changed plug-in loader to set ReShade's base path for config and logs to
     comply with SK's own conventions:
     
       (i.e. per-game data in SpecialK/Profiles/<game>/... if globally injected)

 + Hide Reflex Latency Analysis-related stuff on DXGI/Vulkan Interop SwapChains
 + Stop drawing HDR widget if it is turned on but HDR is not supported

23.7.4.1
========
 + Added Minimum Available VRAM and Maximum VRAM Load% statistics to end-game
     memory statistics in logs/dxgi_budget.log

23.7.4
======
 + Added option to show VRAM gauge underneath framepacing widget, right-click
     the framepacing widget to access this setting.
 + Added command console variable Display.RefreshRate to change the refresh
     rate of the monitor the game's window is on using keyboard macros.

23.7.3.3
========
 + Added Auto VRR Mode default policy to its right-click menu;
     initial default policy is enable.

23.7.3.2
========
 + Added "Ultra Low Latency" option to Auto VRR Mode (NVIDIA only)

  >> Right-click the Auto VRR Mode option in Framerate Limiter | Advanced

   * This is a globally stored preference.

23.7.3.1
========
 + Changed the IAudioClient3 instance used to set mixing latency to keep-alive,
     rather than destroying the COM object when it goes out of scope.

    * This prevents latency from periodically resetting to default.

23.7.3
======
 + Added a lengthy technical explanation of SK's VRAM gauge to its tooltip
 + Added msedgewebview2.exe to internal injection blacklist
 + Renamed "Volume Management" to "Audio Management"
 + Added Audio Latency Minimization:

  >> The Audio Management section of the control panel has a new button to
       set the game's latency to the lowest supported by your hardware driver
         if the current latency is higher than minimum.

   * This latency reduction will be applied to the game every time it starts.

  You can manually enable this feature by setting:

    [Sound.Mixing]
    MinimizeLatency=true

  If you want this as a global policy, add it to Global\master_SpecialK.ini

23.7.2.1
========
 + Removed VRR activation message from auto low-latency
 + Bypassed Hatsune Miku Project Diva hanging at shutdown when it crashes.

23.7.2
======
 + Auto Low-Latency Mode uses Normal framerate limiter mode now
    >> The API needed to check for VRR is NVIDIA-only, and so is Reflex.
       As such, it's more sensible to leverage Reflex + SK's Normal Mode.

23.7.1.3
========
 + Added option for Auto Low-Latency Mode under Framerate Limiter | Advanced
 + Enhanced Auto Low-Latency Mode (VRR optimization) to do the following:

    1. Set Framerate Limiter to 95% Refresh (if it is Off or > 95%)
    2. Activate without opening the control panel
    3. Enable Reflex and turn on Low Latency mode
    4. Prevent games from using 1/2, 1/3 or 1/4 Refresh VSYNC

23.7.1.2
========
 + Fixed missing D3D11CreateDevice (...) hook execution when D3D11 debug
     layer is not turned on.

23.7.1.1
========
 + Report Supported + Inactive for VRR status instead of Unsupported when VRR
     is not engaged because the game is not in the foreground (D3D12).
 + Fixed premature CloseHandle (...) when logging loaded DLLs

23.7.1
======
 + Distinguish between NVCPL disabling G-Sync completely, and application
     profiles disabling it, because some new R530 NvAPI functions do not...

23.6.30
=======
 + Suppress warnings in Hatsune Miku Project Diva Megamix+ when it attempts
     to create an R8_UNORM RenderTargetView of the SwapChain backbuffer.

23.6.29.2
=========
 + Improved consistency of D3D12 G-Sync indicator vs. D3D11

23.6.29.1
=========
 + Implemented G-Sync Status detection for D3D12, Vulkan and OpenGL
     >> Requires working PresentMon (i.e. full install of Special K)
 + Hide Reflex Latency Flash button if attached display doesn't support RLA

23.6.29
=======
 + Removed restrictions on "Continue Rendering" in Fullscreen Exclusive mode
 + Fixed haptic UI continuing to rumble sometimes after control panel is closed

23.6.28.3
=========
 + Lowered HDR profile 0's default gamma to 0.92 to improve shadow detail
 + Added button/titlebar to close widgets if the control panel is open

23.6.28.2
=========
 + Poll DXGI Budget statistics once every 250 ms if the GPU widget or GPU text
     overlay are not active.

23.6.28.1
=========
 + Added VRAM usage gauge to the control panel for OpenGL/Vulkan/D3D11/D3D12
 + VRAM quotas are now configurable by right-clicking the VRAM gauge
 + VRAM quota warnings can be reset so users can try changing game settings,
     or the quota itself and test for VRAM shortages using the new settings.

23.6.28
=======
 + Added warning if VRAM used exceeds a configurable % of -available- VRAM

     [Render.DXGI]
     WarnIfUsedVRAMPercentExceeds= (Some % value; 95 by default)

   This is also configurable in the D3D11/D3D12 section of the control panel

     >> Set to 0.0 to disable the warning.

23.6.27.4
=========
 + Fixed libScePad hooks on disconnected controllers disabling XInput
 + Blacklisted CefSharp.BrowserSubprocess and LariLauncher (Baldur's Gate 3)
 + Enable Vulkan Bridge in Baldur's Gate 3 by default
 + Removed unused INI options: "Ignore RTSS Delay" and "Adaptive Sync"

23.6.27.3
=========
 + Fixed SKIF's new signal not being set when used in local injection

23.6.27.2
=========
 + Added support for SKIF's new signal-based Minimize on Inject feature

23.6.27.1
=========
 + Fixed SkipRedundantModeChanges=false always skipping SwapChain resizes (!)
 + Added extra detection for wrapped D3D11 devices (i.e. ReShade) when checking
     device-resource ownership during device context hooks.

23.6.27
=======
 + Fixed black screens in D3D11 when Special K and ReShade are used together
 + Fixed ReShade disabling HDR in D3D11 games

23.6.26.3
=========
 + Automatically load ReShade{32|64}.dll if it is in a game's directory, and
     create the necessary INI for version 5.x to load this way.

     >> This is equivalent to manually adding it as a Lazy plug-in

 + Added ReShade luminance control for its menus when used in native HDR games.

     >> This fixes Rec 2020 / Rec 709 colorspace mismatches in HDR10 games and
          80 nits brightness in scRGB games, so ReShade's UI works correctly.

 + Hook ExitProcess and TerminateProcess even if debug features are turned off.

23.6.26.2
=========
 + Merge pull request #71 from Nustat0/dgvoodoo-d3d12
    * Enabled 32-bit D3D12 for use with dgVoodoo. 

23.6.26.1
=========
 + Added per-game refresh setting to complement existing per-game resolution

     [Display.Monitor]
     RefreshRateForMonitor= (Current implementation rounds to nearest integer)

   >> This refresh rate will be applied when a game starts, and restored when
        the game exits. It uses the Refresh setting from the Display menu.

23.6.26
=======
 + Re-enabled ExitProcess hook to handle games that crash at exit

23.6.25
=======
 + Fixed Fullscreen Exclusive incompatibilities in many games
 + Enabled Rendundant DXGI Mode Change elimination by default
 + Enabled Fullscreen Exclusive in NieR: Automata

   >> If you intend to run games in Fullscreen Exclusive (why?), be sure to
        reset a game's INI first because the redundant mode change setting
          has a different default value now.

23.6.24.3
=========
 + Added warning text if a user tries to enable HDR in a Streamline game

23.6.24.2
=========
 + Fixed potential double-shutdown of Reflex PCL thread
 + Only apply the NoWrap hack for Streamline to Global Injection

23.6.24.1
=========
 + Fixed compatibility with NVIDIA Streamline in D3D11/12 games by not wrapping
     the DXGI SwapChain.

    * It is assumed they are all Flip Model anyway, and do not need wrapping.

     >> HDR is still hit-or-miss; DLSS3 Frame Gen is not compatible with SK HDR

   (HDR users should consider replacing the Streamline Interposer DLL still...)

23.6.24
=======
 + Optimized post-processing passes to use a single triangle

23.6.23
=======
 + Replaced NvAPI Reflex hooks with a stub if NvAPI does not initialize
     correctly.

23.6.22
=======
 + Improved Reflex override restore if game initializes Reflex before SK has
     the appropriate NvAPI functions hooked.

23.6.21.2
=========
 + A game's native Reflex setup (i.e. Low Latency or Low Latency + Boost) is
     restored when turning off SK's override.

23.6.21.1
=========
 + Changed minimum number of frames before determining if a game is Reflex
     native to 150 (because Unreal Engine).
 + Changing the override state of Reflex without changing modes will now
     apply immediately.

23.6.21
=======
 + Added option to override a game's native Reflex implementation

     >> Low Latency + Boost w/ Latency Marker Optimization can significantly
          reduce latency in native Reflex games with the bare minimal Reflex
            integration (nearly all of them).

23.6.17
=======
 + Removed MMCSS check-box from framerate limiter advanced section
 + Added render thread priority to framerate limiter advanced section

23.6.15.2
=========
 + Give games 15 frames to call a Reflex API function before SK decides whether
     to initialize its own Reflex implementation or not.

23.6.15.1
=========
 + Enable mouse/keyboard input while Steam overlay is active, even if the
     user is blocking mouse/keyboard to the game.

23.6.15
=======
 + Removed Reflex Input trigger mode
 + Removed Latent Sync "Adaptive Sync" option, the tearing option replaces it.
 + Added support for names assigned before SK initialized to the thread widget

23.6.14.3
=========
 + Fixed Thread Widget not showing correct names for re-named threads
 + Changed default minimum render thread priority to Above Normal (1)

     >> This used to be the default behavior in SK before it was configurable

23.6.14.2
=========
 + Allow user-requested Reflex flashes even in Reflex-native games
 + Handle PCL ping before Reflex simulation start marker

23.6.14.1
=========
 + Added minimum render thread priority:

    [Scheduler.Boost]
    MinimumRenderThreadPriority { -15=Idle, 0=Normal, 15=Time Critical }

 + Shutdown internal PCL Stats thread if native Reflex is detected

23.6.14
=======
 + Reworded Adaptive Sync option in Latent Sync control panel
 + Added "Enable Tearing" checkbox to Latent Sync control panel

23.6.13.3
=========
 + Added Reflex Flash trigger button
 + Added NvAPI PCL Init/Shutdown to logs

23.6.13.2
=========
 + Replaced deprecated NvAPI calls w/ new ones (only available in Windows 10+)
    >> Hopefully you have upgraded to 10, because NVIDIA does not support 8 :)

23.6.13.1
=========
 + Fixed not being able to disable SK's Reflex in games that aren't native Reflex

23.6.13
=======
 + Added detection for games that are natively using Reflex, so users cannot
     enable SK's implementation of Reflex at the same time.
 + Added PCL (PC Latency) ping event every 100 ms to enable PC latency readings
     on the GeForce Experience overlay.
 + Updated NvAPI to R525

23.6.12.3
=========
 + Added keybinds to Volume Management section of SK's control panel.
 + Fixed Allow Tearing not respecting system default value.

23.6.12.2
=========
 + Fixed mouse activation of game window not working when blocking Mouse Input.

23.6.12.1
=========
 + Added command console variables for sound volume/mute (applies only to game)

     Sound.Volume [0.0-100.0]
     Sound.Mute   {true|false}

    Intended use is keyboard macros (i.e. Ctrl+Shift+Insert=Sound.Volume ++)

23.6.12
=======
 + Changing Latent Sync on/off will restore original limiter mode preference

23.6.11.3
=========
 + Removed auto-low latency mode

23.6.11.2
=========
 + Fixed Latent Sync's Delay Bias setting applying to other limiter modes.
 + Fixed MPO warning showing up even if user did not have it enabled.

23.6.11.1
=========
 + Multiplane Overlay support in-game only counts RGB planes now.
 + Added INI option to warn if MPO support is broken.

     [Display.Monitor]
     WarnIfNoOverlayPlanes={true|false} (default: false)

    * If you want this feature, you should set it in master_SpecialK.ini

23.6.11
=======
 + The "Enable Tearing" SwapChain flag now controls the game's use of tearing
     as well...

    >> It will turn a game's VSYNC off setting into vendor-independent FastSync.

    This also allows for a gimped form of Latent Sync:

     * 1 frame higher latency with "Enable Tearing" disabled, but... NO tearing :)

23.6.10
=======
 + Special K's HDR is disabled at application start in Diablo IV because it
     would freeze up at the game's splash screen otherwise.

 + Added console variable to enable SK's HDR:

     HDR.Enable {true|false}

       (This performs the same action as clicking scRGB on the HDR widget)

     You can assign a keybind to turn HDR on/off like so (add to SK's INI):

       [Macro.HDR]
       Ctrl+Shift+H=HDR.Enable toggle

     Keep in mind, in most games after doing this you need to press Alt+Enter

23.6.9.2
========
 + Stop logging IDXGIFactory::EnumAdapters1 (...) if a game spams it every frame

23.6.9.1
========
 + Fixed bug where forced 10-bpc would be enabled for games with vulkan-1.dll
     loaded, but Vulkan Bridge disabled.

23.6.9
======
 + If user has a 1 second global injection delay configured, Streamline warning
     will now be disabled without requiring interposer replacement.

     >> SK's HDR is not compatible with Streamline, but for non-HDR users this
          could be an acceptable compromise.

23.6.7
======
 + Disable D3D9 hooking in Call of Duty to make it use OpenGL-IK
 + Handle edge-case preventing OpenGL Fullscreen Exclusive bypass if the game
     called ChangeDisplaySettingsExA instead of ChangeDisplaySettingsExW

23.6.5
======
 + Removed warning when games try to use OpenGL Fullscreen Exclusive; SK can
     now completely bypass it with OpenGL-IK.

 + Implemented SK_D3D11_CopySubresourceRegion helper for HDR <--> SDR copies
     when the subresource region requires scissor/clipping.

       (Gets rid of a rare assertion in HDR games)

23.6.4
======
 + Add tooltips explaining to set a game to its Windowed mode (not Borderless)
     if using SK's Borderless / Borderless Fullscreen overrides.
 + Fixed wrong Epic Game Store application name detection for games with DLC

23.6.3.2
========
 + Return SCE_ERROR_BUSY instead of SCE_ERROR_OK when filtering libScePad input

23.6.3.1
========
 + Fixed Steam Input breaking gamepad input in non-Steam games when
     opening SK's control panel.

23.6.3
======
 + Fix potentially incorrect SwapChain buffer resize redundancy check

23.6.2.2
========
 + Add warning message when launching Diablo IV

23.6.2.1
========
 + Prevent Bethesda games from turning off legacy input APIs during
     RawInput device registration (fixes Fallout New Vegas issues)
 + Enable Vulkan Bridge in No Man's Sky by default

23.6.2
======
 + Removed "regular" Font Awesome Icons in favor of solid
 + Added a splash of color to the Plug-In file selector dialog

23.6.1
======
 + Eliminate overly aggressive framepacing defaults in NieR: Automata

23.5.31
=======
 + Improved automatic detection of WINE to disable low-level Windows-specific
     features of SK that have no purpose on other platforms and crash WINE.

23.5.30.2
=========
 + Disable hook caching in Yuzu so HDR works in Vulkan

23.5.30.1
=========
 + Revert SetForegroundWindow / BringWindowToTop changes from 23.5.28.3
 + Updated internal fonts to Font Awesome Free v6.2.1

23.5.30
=======
 + Merge pull request #64 from WallSoGB/SilentCrashHandler
    * Silent crash handler + Y-m-d for crash timestamps

 + Fixed hook address caching not respecting Enable{Local|Global}Cache setting
 + Removed Unicode formatting direction characters from locale timestamps

23.5.29.2
=========
 + Fixed deadlock in games that raise Thread Name exceptions without a string
 + Fixed HDR gamut expansion not applying

23.5.29
=======
 + Fixed incorrect structure size on NV_GPU_DITHER_CONTROL_V1, which was
     causing the dithering setting on NVIDIA GPUs to read as "Default".

     >> HDR users should test the dithering setting using the HDR widget's
          HDR Visualization: "Tonemap Curve and Grayscale".

        ( 10-bit Temporal is ideal for HDR on 12-bpc displays )

 + Increased HDR visualization list size so Grayscale shows without scrolling

23.5.28.3
=========
 + Various fixes for games with splash screens that are Win32 dialogs

23.5.28.2
=========
 + Steam Overlay's Vulkan layer cannot be disabled -- its D3D11 Overlay will
     not cleanup resources correctly on NVIDIA's DXGI Layer and will deadlock.

23.5.28.1
=========
 + Replaced AsyncInit workaround with Env. Variables to disable Vk layers

23.5.28
=======
 + Improved global injection compatibility with Yuzu
 + Disabled AsyncInit for games using Vulkan Bridge to ensure that third-party
     layer disablement code works as intended

23.5.27.3
=========
 + Automatically disable OBS's Vulkan layer if SK's Vulkan Bridge is active
 + Automatically disable Steam's Vulkan layer if SK's Vulkan Bridge is active
 + Automatically disable RTSS's Vulkan layer if SK's Vulkan Bridge is active

23.5.27.2
=========
 + Add 5 frame delay before centering mouse cursor over exit confirmation
 + Add error when launching Yuzu without SK's injection service running

23.5.27
=======
 + Auto-close Audio Session Selector pop-up if there are no sessions
 + Increased the minimum size of the Audio Session Selector pop-up in
     the Volume Management section of the control panel for low-res users

23.5.26.1
=========
 + Add support for ++ and -- to floating-point cvars

23.5.26
=======
 + Add "Num Plus" (for Numberpad +) as a possible keybinding
 + All D3D9 games running in DXVK will be forced into windowed mode
 + FFXIV is forced into windowed mode by default

23.5.24
=======
 + NOP all calls to ChangeDisplaySettings{Ex}(A|W) when forcing windowed mode

23.5.19
=======
 + Add check for PresentMon user permissions before attempting to enable

23.5.18
=======
 + For NVIDIA GPU users, if DXVK (D3D9) is detected, a prompt to enable native
     Vulkan support will be presented when first launching a game.

23.5.17.6
=========
 + Fixed potential deadlock in Yuzu at start during Streamline Interposer check

23.5.17.5
=========
              -[ Vulkan no longer sucks on Windows! ]-

 VulkanBridge grants high-performance Borderless Window mode (w/ G-SYNC),
   HDR, Latent Sync, Multiplane Overlays, etc. to NVIDIA GPU owners.

  (*) All of those features are normally D3D exclusive.

                                  (NVIDIA Driver Version 526.98+ Required)

 + Enabled VulkanBridge by default in cemu and RPCS3

23.5.17.4
=========
 + Enable VulkanBridge by default in Ryujinx and Yuzu
 + RunDLL_NvAPI_SetDWORD will create new NV driver profiles if necessary
 + Workaround SteamAPI crash if DLL is too old to implement ISteamScreenshots
 + Renamed EnableRTXRemix setting to EnableVulkanBridge
           --------------            ------------------
 + Eliminate an unnecessary extra game restart when first enabling RTX Remix
 + Fixed parsing executable names with spaces in RunDLL_NvAPI_SetDWORD

23.5.17
=======
 + Added INI option to enable DXVK + DXGI Layered Present (RTX Remix)
 
     [NVIDIA.API]
     EnableRTXRemix :: 0=Disable, 1=Enable, -1=Don't Care

    * The game will restart itself to apply these changes.

 + Added RunDLL_NvAPI_SetDWORD to apply NVIDIA Profile Settings:

     Example:  (Setup RTX Remix for Dragon's Dogma (ddda.exe))

                                                     
       rundll32 SpecialK64.dll,RunDLL_NvAPI_SetDWORD 0x20324987 0x80001 ddda.exe
                                                     {Setting}  {Value} {EXE}

     NOTE: Some settings (i.e. the one above) require Admin privileges to set.

23.5.16.3
=========
 + Prevent NV's Vulkan/DXGI Layered SwapChain from loading Ansel
 + Disable HDR widget if 10-bpc SDR is active
 + Promote NV's Vulkan/DXGI Layered SwapChain to 10-bpc in SDR
 + Disabled assertion if game window changes, unless log level >= 1

23.5.16
=======
 + Fixed NV Vulkan/DXGI SwapChain cleanup that could cause games to freeze
 + Renamed "Maximum Frame Interval" to "Minimum Refresh" in Reflex widget

23.5.13.1
=========
 + Add extra Wallpaper Engine executables to blacklist
 + Disable OpenGL Scissor Test during glBlitFramebuffer for OpenGL-IK

23.5.8
======
 + Changed the "Prevent Always-On-Top" option to check the state once per-frame
     and remove a game window's Always-On-Top state if needed.

       (The old behavior only did this following window (de)activation).

23.5.7
======
 + Merge pull request #63 from Aemony/D3D9-IK
    * Restores Windows 7 compatibility (just don't ask for support)

 + Merge pull request #59 from SpecialKO/Aemony-patch-1
    * Added build.bat to automate build process further

 + Merge pull request #34 from Trass3r/D3D9-IK
    * Add Continuous Integration

23.5.6.3
========
 + Disable SK's internal debugger in Honkai: Star Rail to workaround anti-cheat
 + Added compat hacks to non-Steam version of Path of Exile as well
 + Export/Reset Profiles in HDR widget also store their INI values as
     described in 23.5.6'

23.5.6
======
 + Changed HDR widget to store profiled display data using monitor GUID instead
     of the full GDI device path (since parts of it are not invariant).

  * New INI Key Name:            GSMC0A0.{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
  * Old INI Key Name:
   DISPLAY#GSMC0A0#5&2dafe0a1&5&UID45314#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}

     >> Old Global\hdr.ini files will have invalid entries; consider deleting.

         @ Re-run "Profile Display Capabilities" after deleting...

23.5.5
======
 + Only display Effective Power Mode in control panel if game is foreground
 + Clicking the Aspect Ratio Stretch background will activate the game window
 + Prevent Aspect Ratio Stretch background window from becoming foreground

23.5.4.2
========
 + Do not attempt to register for Effective Power Mode change notifications
     on WINE, since it will just crash the game and complain about a stub.

23.5.4.1
========
 + Added Effective Power Mode to SK's Control Panel.

    >> If it does not say Game Mode (while the game is in the foreground),
         then check the Windows Game Bar with the game is running...

      * Ensure the Game Bar has 'Remember this is a Game' checked.

23.5.4
======
 + Fixed aspect ratio stretch background window stealing focus from the game
     window when Aspect Ratio Stretch is enabled.

23.5.3
======
 + Remove leading and trailing spaces from config profile directory names if
     the Steam manifest uses them in the game name...

       (i.e. " Dead Space" and "Star Wars: Jedi Fallen Order™ ")

23.5.2
======
 + RunDLL_DisableGFEForSKIF also disables VRR for SKIF

23.5.1.1
========
 + Added [Scheduler.Boost] DenyForeignChange option to prevent Game Mode from
     lowering process priority when certain combinations of scheduler boost
       are active.

23.5.1
======
 + Disable GeForce Experience Overlay for SKIF the first time SK is injected

     >> Game has to be run as Admin for this to happen automatically

      * To do manually (from an Admin command prompt):

         rundll32 SpecialK64.dll,RunDLL_DisableGFEForSKIF

23.4.30.4
=========
 + Disable warning about "Continue Rendering" if a game tries to engage
     Fullscreen Exclusive and SK is overriding it to Borderless Fullscreen.
 + Blacklisted processes no longer signal SKIF's OnExit event when exiting
 + Added EASteamProxy.exe to internal injection blacklist
 + Added Link2EA.exe to internal injection blacklist (EA, stop dammit!)
 + Added dsx.exe to internal injection blacklist

23.4.29
=======
 + Added internal list of executables that acquire multiple references
     to SK's DLL during injection shutdown.

23.4.28
=======
 + Added check if Microsoft's GLOn12 layer is active before using OpenGL-IK

23.4.27
=======
 + Added SteamAPI workaround for CRAPCOM anti-piracy shenanigans in
     Megaman Battle Network Legacy Collection (no more dimming screen).

23.4.26
=======
 + Added button to HDR menu to disable a game's native HDR

     >> Intended for games that force HDR on; requires game restart.

 + Removed streaming_client.exe (Steam streaming) from internal blacklist.

   >> Using SK for streamed games requires placing SpecialK.dxgi in the
        same directory as streaming_client.exe.

23.4.25
=======
 + Renamed HDR Presets 2 and 3 to scRGB Native and HDR10 Native
     >> Use these for HDR native games; ignore luminance slider
 + Disabled color saturation and gamma control in HDR10 mode

23.4.24
=======
 + Added horizontal tear bars to Latent Sync for Steam Deck's derpy display
 + Raised SDR->HDR gamma for profile 0 to 0.933 (from 0.925)
 + Added peak luminance estimate when using profile 0's Perceptual Boost
 + Lowered the slider range for Perceptual Boost to ~285 - 2000 nits

23.4.23
=======
 + Renamed HDR Peak White Luminance slider when Perceptual Boost is enabled
 + Tweaked default HDR profile 0 to target 575 nits w/ PB

23.4.14
=======
 + Fixed achievement unlock ratios for games with > 50 achievements

23.4.12
=======
 + Fixed incorrect CPU load % on Windows 11 as a result of invalid
     idle time accumulation in SystemProcessorPerformanceInformation

 + Amended 'Disable Transparency' changes so that HDR display profiling
     is not broken by 10k nits transparency blending

23.4.11.1
=========
 + Improved HDR near-black and out-of-gamut color processing

23.4.11
=======
 + Added current values (top-left) to GPU monitoring widget graphs
 + Removed Windows.UI.dll from auto-exclusion during global injection

23.4.10.2
=========
 + Fixed SwapChain settings in Control Panel not UI-scaling correctly
 + Added tip on configuring the OSD's Startup Banner, to the banner...

23.4.10.1
=========
 + Fixed potential creation of 'Profiles' directory at the root of disks
 + Merged fix for 'Disable Transparency' option in UI settings
 + Merged fix for building with newer Visual Studio toolchains

23.4.10
=======
 + Merge pull request #71 from Nustat0/D3D12 x32 #71
 + Merge pull request #58 from Nustat0/D3D9-IK
    * Fix dgVoodoo plugin detection for local ddraw/d3d8
 + Merge pull request #52 from cathyjf/fix-get-file-size-for-symlinks
    * Fix SK_File_GetSize for symlinks

 + Added Plug-In file selector to the Control Panel's Plug-Ins section
 + Added Multiplane Overlay plane count to Display menu.

 + Automatically disable Window Proc hooks and SteamAPI integration in CRAPCOM
     games to avoid angering their abhorrent DLC anti-piracy

 + Fixed missing PresentMon info in windowed mode D3D9 (NOT D3D9Ex) games
 + Fixed MGS V compatability when it requests non-0 DXGI SwapChain buffers

 + "Continue Rendering" Window Management mode is disabled automatically if a
     DXGI-based (D3D10/11/12) game attempts to use Fullscreen Exclusive

 + Changed message on DPI Scaling AppCompat Fix when games cannot be restarted
     automatically:

   "A one-time game restart is required to fix DPI Scaling issues in this game"

 + Added "Aspect Ratio Stretch" mode to the Display menu in SK's Control Panel.
 
    * Run (borderless windowed) games at custom aspect ratios properly centered
        with letter/pillar-boxing without changing display modes.

 + Improved HDR -> SDR screenshot tonemapping in D3D11 and D3D12 games
 + Added NVIDIA Streamline workarounds, including an optional replacement
     Interposer DLL compatible with Global Injection and HDR.

       (see: Wiki Compatibility; note some new DLSS features may not work.)

 + Added HDR gamut expansion feature to increase saturation on HDR highlights
 + Renamed "DWM Tearing" to simply "Tearing" in SwapChain settings, since it
     has nothing to do with the DWM and requires Flip Model bypass the DWM.
 + Updated Chrono Cross and Hatsune Miku Project Diva plug-ins for new patches.
 + Implemented achievement popup location setting and removed animated option.

 + Made ieframe.dll pinned (not unloadable) to workaround Steam crash.
 + Exempt explicitly whitelisted games from internal libcef.dll blacklist
 + No longer return processes that are not running in SKX_GetInjectedPIDs (...)

22.9.26
=======
 + Fixed PresentMon performance in Windows 11 22H2 without disabling it
 + Replaced 'Low-Latency' checkbox with 'Mode' option in control panel's
     'Framerate Limiter | Advanced' section

22.9.25 (HOTFIX)
=======
 + Added option to disable PresentMon to address Windows 11 22H2 performance

    [Render.FrameRate]
    EnableETWTracing=false

 + Fixed HUDless screenshots if D3D11 state tracking is disabled

22.9.19
=======
 + Re-enabled friend achievement unlock statistic fetch by default
 + Fixed achievement unlock-triggered screenshots snapping twice
 + Disabled screenshot sound for achievement unlocks
     >> The Steam overlay may still play a sound

22.9.18
=======
 + Stabalized NV hardware stats (load %, temp., clocks) that are not sampled
     every polling interval

22.9.17
=======
 + Disabled ImGui assertions if log level < 1 to avoid achievement popup issues
     while SK's control panel is visible

22.9.16
=======
 + Merge pull request #24 from Aemony/D3D9-IK
    * Added separation between swapchain mgnt sections
 + Added Soul Hackers 2 HUD vertex shaders to built-in HUD database

22.9.15
=======
 + Added MyDockFinder to injection blacklist to keep SK's OSD out of the Windows shell
 + Added option to disable Steam Input

22.9.8-D3D9-IK
==============
 + Added error if Global Injection is attempted in software using NVIDIA Streamline
 + Silenced API call tracing for NtSetTimerResolution (...) when log level < 1

22.9.6-D3D9-IK
==============
 + Fixed Reflex latency statistics in D3D12

22.8.18-D3D9-IK
===============
 + Fixed memory leak in achievement icon loader
 + Added Global / Friend unlock % to achievement popups
 + Centered description and established consistent aspect ratio for achievements

22.8.17.2-D3D9-IK
=================
 + Partial re-implementation of achievement unlock popups

     >> Duration is the only setting currently implemented, and achievement
           icons are only loaded in D3D9/D3D11/GL at the moment.

 + Optimized D3D11 texture cache for games with many small textures

22.8.17.1-D3D9-IK
=================
 + Switched debug symbol loader back to deferred to speed up init
 + Empty crash/steam/debug out/eos logs are deleted at exit
 + steam_api.log is renamed platform.log in non-Steam games
 + Added extra checks to avoid loading SteamAPI DLL in non-Steam games

22.8.17-D3D9-IK
===============
 + Changed SK's Plug-In based SteamAPI DLLs to use steam_api_sk{64}.dll instead
     of the traditional steam_api{64}.dll to avoid collisions with software that
       loads SteamAPI DLLs using incomplete paths.
 + Fixed API auto-detect prioritization issues introduced in 22.8.7

22.8.16.4-D3D9-IK
=================
 + Fixed various issues with local installs of ReShade
 + Clear DXGI/D3D11 hook cache when installing plug-ins from control panel
 + Disabled crash sound when games crash -after- SK's DLL has cleanly unloaded

22.8.16.3-D3D9-IK
=================
 + Improved ReShade Plug-In support, Unreal and most other engines work reliably
     w/ Lazy load order when using Global Injection.

   >> Unity almost never works loading ReShade this way... big surprise.

 + Clicking "Disable All But the Active API" in Compatibility | Render Backends
     will no longer disable OpenGL when a game is using OpenGL-IK (D3D11).
 + Blacklisted CrashReportClient.exe so SK will no longer render an overlay on
     top of fancy Unreal Engine crash dialogs :)

22.8.16.2-D3D9-IK
=================
 + Cleaned up Input Management control panel section
 + Fixed incorrect gamma on SDR thumbnails and HDR->SDR tonemapped screenshots

22.8.16.1-D3D9-IK
=================
 + Fixed SDR screenshot (lossy / Steam Import) brightness in D3D11/D3D12
 + Large Address Aware patch only applies once now and then turns itself off

22.8.16-D3D9-IK
===============
 + Fixed potential deadlocks during debug symbol load
 + Fixed incorrect texture cache eviction rules for uncompressed textures (Unity fix)
 + Added support for SPECIALK_PATH environment variable to define the install path
     (i.e. profile directories) for Global Injection
   >> Takes precedent over the registry key (HKCU\Software\Kaldaien\SpecialK\Path).

22.8.15.3-D3D9-IK
=================
 + Added checks to make sure (D3D11) resource views are created using the same device
     as their resource.
 + Eliminated mipmap-related assertion failure when starting Genshin Impact

22.8.15.2-D3D9-IK
=================
 + Added conditional device input blocking:

    ( Enabled / Disabled (Always) / Disabled (in Background) )

    Keyboard input defaults to Disabled (in Background) for new INI files generated;
      for existing INI files, preference will be assigned Enabled or Disabled (Always).

 + Added mipmap support to SK_D3D11_BltCopySurface (format conversion (HDR<-->SDR))
     * This properly fixes character portraits in Pillars of Eternity 2

22.8.15.1-D3D9-IK
=================
 + Fixed rare crash in ImGui when opening control panel at the same time as game
     polls cursor position
 + Improved handling of cursor clipping and window activation when game window is
     in the background
 + Removed texture caching auto-disable in Unity engine games

22.8.15-D3D9-IK
===============
 + Worked-around bug in Martha is Dead that causes crashing at startup
 + Re-enabled texture injection in games using D3D11 UpdateSubresource (...)
     (i.e. NieR: Replicant)

22.8.14-D3D9-IK
===============
 + Added configurable debug layer settings (i.e. mute/break-on error) for D3D11 games
 + Fixed compatibility with Spider-Man Remastered when Special K HDR is enabled

22.8.13.2-D3D9-IK
=================
 + Fixed D3D9 window hooks not being installed correctly

22.8.13.1-D3D9-IK
=================
 + Fixed potential deadlock in Unity engine games when window focus changes

22.8.13-D3D9-IK
===============
 + Fixed mouse input not being blocked when render in background is enabled
 + Fixed character portraits not displaying in Pillars of Eternity 2

22.8.11-D3D9-IK
===============
 + HDR toggle in OpenGL is real-time now in all games and does not require Alt+Enter
 + Additional mouse input tweaks for emulators to prevent cursor auto-hide when cursor
     is not even in the game window.

22.8.10.2-D3D9-IK
=================
 + Alt menus no longer blocked while SK's control panel is open
 + No longer display Alt+F4 confirmation dialog in SK's control panel when closing
     child dialog boxes in emulators :)
 + Improved support for switching between detached and single-window mode in Yuzu
 + Removed assertion message when an application's root window changes

22.8.10.1-D3D9-IK
=================
 + Added luminance tilemap output from adaptive tonemapper to HDR widget
 + Fixed shadowmap issues in certain games introduced in 22.8.9.1
 + Fixed shader profiler timer query reference leak in D3D11 render mod tools

22.8.10-D3D9-IK
===============
 + Added new initialization option for Global Injection to hook D3D synchronously,
     this allows Global Injection to work ~the same as Local in some games that
       otherwise wouldn't be compatible with ReShade and SK simultaneously.

    [Compatibility.General]
    AsyncInit=false

  This also affects D3D9, and may allow D3D9Ex + FlipEx in some games using Global.

 + More ReShade compatibility work; early load-order should no longer crash
 + Fixed HDR in Crash Bandicoot so that it does not require 8-bit remastering

22.8.9.1-D3D9-IK
================
 + Merge pull request #21 from Braasileiro/megamixplus-1.02,
    * Updated framerate unlock and Windows version check bypass for Project Diva 1.02

 + Improved compatibility with recent ReShade releases
 + Added logging/fix if games try to create typeless Shader Resource Views for
     Depth/Stencil surfaces that Special K is not managing
 + Fixed black screens and missing visual effects in Final Fantasy XIV and YS IX

22.8.8-D3D9-IK
==============
 + Fixed MSAA while HDR remastering is enabled in many Unity engine games
 + Fixed resolution mismatches in Disgaea 5 leading to black screens at startup

22.8.7-D3D9-IK
==============
 + sRGB Passthrough (for SDR users) is automated now, Passthrough/Strip is the correct
     setting in 99.9% of cases. The warning has been removed and the option is pending
       removal.

    >> For HDR, this cannot be automated and the sRGB Bypass option in the calibration
         widget will remain, even after SDR Passthrough/Strip/Apply options are removed.


 + Added experimental D3D11 Debug Layer integration in the D3D11 | Advanced (Debug) tab

    - Unreal Engine games are not compatible with this, and you must force the layer on
        using dxcpl if you want to use it in SK.

     @ This is a developer-centric feature, if you don't know what the Debug Layer is,
         then turning it on is probably going to utterly destroy performance for you :)

22.8.6-D3D9-IK
==============
 + Still more sRGB and MSAA optimization for D3D11 games :)
    >> sRGB Passthrough / Strip / Apply work as designed and usually apply immediately
 + Fixed gamma regression in SDR mode in The Witness

22.8.5.2-D3D9-IK
================
 + Fixed issue in EOS integration w/ repeating screenshots triggered when callbacks
     for achievements that are already unlocked are sent by Epic
 + Improved sRGB compatibility in Flip Model, removed some forms of MSAA support
 + Removed assertion when games try to set HDR metadata in windowed mode and are not
     natively DXGI Flip Model.

22.8.5-D3D9-IK
==============
 + Added option to disable DxDiagn.dll from loading into games.
    $ DxDiag probes all available versions of DirectX and leads to problems
        (especially in 32-bit software)
 + Added option to disable Large Address Aware auto-patching on affected 32-bit games

    [Compatibility.General]
    AllowDxDiagn=false
    AutoLargeAddressPatch=true

 + Corrected 'SoundFile' option in Global\platform.ini and local INI files not loading
     because it was blank and the INI parser was accidentally set to remove blank keys

22.8.4.3-D3D9-IK
================
 + Added support for mouse cursor auto-hide when using 'Block Mouse Input to Game'
 + Fixed incorrect mouse activation behavior when background render is enabled and
     the game window is activated by clicking on SK's UI
 + Remove spurious calls to glClampColor (...) to clamp vertex/fragment colors,
     that feature is deprecated in GL3 core profiles

22.8.4.2-D3D9-IK
================
 + Cleaned up D3D11 texture mod UI slightly and include additional sources
     (i.e. SRV + Resource) for deducing texture and RenderTarget debug names
 + Fixed potential crash dumping D3D11 textures w/ engine-assigned debug names
 + Optimized MSAA and copies between surfaces with incompatible direct copy
     formats (e.g. for HDR MSAA Resolve from FP16 to R8G8B8A8).

    VRAM usage may increase slightly, but framerate increases significantly :)

      *) This only affects HDR users, and only D3D11 performance
           (and primarily games with MSAA support).

22.8.4.1-D3D9-IK
================
 + HDR can now be turned on/off without restarting D3D11 games(*)!
     (*): ...usually
 + Added 'Lazy' load order as an option to Plug-Ins in the control panel, this is
     not a new feature but the config UI has never shown it before...

22.8.4-D3D9-IK
==============
 + For games that use SteamAPI Manual Callback Dispatch (i.e. new Unity games),
     Special K will load its own SteamAPI DLL that ships in the Plug-Ins directory
       and isolate itself to prevent Steamworks features from failing to work.

22.8.3.1-D3D9-IK
================
 + Improved Steam Overlay compatibility with D3D9Ex overrides
 + Fixed D3DX9_43 texture hooks calling into SK's texture manager uninitialized
 + Removed sRGB warning from Genshin Impact (auto-applies Passthrough)

22.8.3-D3D9-IK
==============
 + Fixed The Witness for SDR users with MSAA enabled
 + Fixed MSAA in many Unity engine games when flip model is enabled
 + Re-introduced sRGB warning because Genshin Impact is broken and does not handle
     input/output colorspace correctly

    >> Other Unity engine games will start banding in sRGB mode as a result of this,
         so set them to 'Strip' and leave Genshin Impact on 'Passthrough'

22.8.2.1-D3D9-IK
================
 + Fixed D3D11On12 overlay compatibility (e.g. Steam/EGS/RTSS)

22.8.2-D3D9-IK
==============
 + Added automatic Large Address Aware .exe patch when 32-bit non-LAA games crash
 + Fixed rare issue with control panel sliding to the left when scaling is active

22.8.1.1-D3D9-IK
================
 + Fixed jittery text on latency analysis widget
 + Fixed framepacing widget debug view crashing in non-DXGI graphics APIs
 + Added automatic global injection delay for .NET software
 + SteamAPI integration is auto-disabled in games that use Manual Callback Dispatch
     in order to prevent deadlock (fixes Tererria / Lords of Xulima)

22.8.1-NOCEGUI
==============
 + Split D3D9Ex override INI cfg into ForceD3D9Ex and EnableFlipEx (D3D9 Flip Model)
 + Fixed SteamAPI process abort in Control during achievement user statistics fetch
 + Added texture name to dumped texture metadata file for D3D11 engines that include
     debug names in retail games (i.e. Unity)

22.7.31-NOCEGUI
===============
 + Added D3D9 texture injection support for engines that use LockRect/UnlockRect
 + Added D3D9 Managed Pool -> D3D9Ex Default Pool memory mgmt. to support D3D9Ex
 + Fixed D3D9 texture dumping for certain DXT1-5 texture allocations

22.7.29-NOCEGUI
===============
 + Added 10 second global injection delay to executables with "Launcher" in name
     (Fixes Final Fantasy 8)
 + Fixed screenshots in D3D12 software with third-party resolution overrides
 + Fixed local injection as "dxgi.dll" if VBLANK Virtualization bypass is enabled

22.7.25-NOCEGUI
===============
 + Added DXGI 1.6 Dynamic Refresh Rate (VBLANK Virtualization) Bypass

   >> This bypass is applied by default on Windows 11 systems

    * Think of DRR as DPI Scaling for Refresh Rate
     
   Software has to declare itself Dynamic Refresh Aware effectively, or Windows
     is going to hide VSYNC timing information from the software and give it a
       fake, floaty VSYNC instead

    The bypass can be turned off in SK's INI using the following new setting:

      [Render.DXGI]
      DisableVirtualizedBlanking=false

  + Improved HDR -> SDR tonemap quality in Screenshots

22.7.19-NOCEGUI
===============
 + Fixed HDR screenshots for D3D12 resolutions not aligned to 32-pixel bounds

22.7.18-NOCEGUI
===============
 + Fixed potential unaligned memory load/store in D3D9/12 screenshot capture
 + Fixed MSAA sample count override in D3D11 BitBlt SwapChains

22.6.30.1-NOCEGUI
=================
 + Removed Unordered Access View flag from D3D12 SwapChains when using HDR

22.6.30-NOCEGUI
===============
 + Completely fixed HDR problems in Tales of Arise
 + Eliminated potential graphics memory leaks in sRGB and HDR games

22.6.29.1-NOCEGUI
=================
 + Fixed HDR compatibility in Days Gone
 + Fixed an issue that prevented some Unreal Engine games (i.e. The Quarry)
     from starting
 + Blacklisted Days Gone's launcher and error reporter utility

22.6.28.1-NOCEGUI
=================
 + Fixed D3D11 games lacking support for Unordered Access Views on their
     SwapChain from crashing in HDR

22.6.28-NOCEGUI
===============
 + Fixed / reduced HDR issues in Tales of Arise (turn off 11-bit Remastering)
 + Semi-broken Adaptive Tonemap mode...
 + Added color gamut visualizer to HDR widget (D3D11 only)
 + Fixed issues with HDR in D3D12, crashing and missing widget options

22.6.26-NOCEGUI
===============
 + Added new experimental 128-bit color remastering option, cause why not?
 + Optimized luminance analysis compute shaders, feel free to keep
     adaptive tonemapping enabled
 - ACES tonemap is currently broken, don't use it :)

22.6.25-NOCEGUI
===============
 + Added optional 'Adaptive Tonemap' mode to handle scenes too bright for HGIG

   >> This adds a Compute Shader stage that may use 1-2% extra GPU, so leave it
        off if performance is already tight in a game.

 - ACES tonemap is currently broken, don't use it :)

22.6.24-NOCEGUI
===============
 + Fixed HDR gamut clamp on scRGB Passthrough Mode
 - ACES tonemap is currently broken, don't use it :)

22.6.22-NOCEGUI
===============
 + Added new tooltips to the HDR Widget and Display Profiler to explain calibration
 + Fixed incorrect number of 32-bit values in D3D12 Root Signature for HDR processing
 + Re-implemented HDR color saturation slider in ACEScg colorspace
 + Fixed D3D11 render state leaks (depth buffer / tessellation) in HDR image processing

22.6.20.2-NOCEGUI
=================
 + Added "Export" button to the HDR widget to export the currently selected preset for
     use in other games.

    >> Load exported presets using the "Reset" button.

22.6.20.1-NOCEGUI
=================
 + Added HDR peak white clipping configuration for displays that do not have valid EDID

    >> See the "Profile Display Capabilities" button in the HDR widget for more info,
         the goal is to find the smallest value that turns the test patterns pure white

     Once saved, the new maximum luminance will be used for HDR range visualizations
       (i.e. HDR vs. Max Local Luminance) to indicate when an image is too bright.

22.6.20-NOCEGUI
===============
 + Fixed Windows Version check in Project Diva's first patch
 + Fixed >60 FPS mod for Project Diva


22.6.18.1-NOCEGUI
=================
 + Fixed accidental pre-multiplied alpha blending on HDR image process in D3D12

22.6.18-NOCEGUI
===============
 + Fixed black-point compensation causing HDR full white to clip in HGIG
 + Fixed Steam Overlay HDR luminance control if D3D11 State Tracking is disabled

22.6.17.1-NOCEGUI
=================
 + Hid the HDR Perceptual Boost sliders in an "Experimental" tab
 + Added Tonemap Curve / Grayscale Visualization mode to HDR widget

    >> The goal when tuning things using this new visualization is to
         get the end-point as near as possible to the top-right.

   ( SK comes pre-tuned (preset 0) for LG OLEDS - 800 nits (HGIG) clipping )

     * LG OLEDs do not have valid EDID values for max/avg. luminance, so
         it is not possible to correctly tune the tonemap curve yet.

    >> A tool to find your display's -actual- HDR clipping points will be
         added in a later build; this is more for TVs than monitors.

22.6.17-NOCEGUI
===============
  + Merge pull request #8 from WallSoGB:
     "R and B color switch fix for D3D9 ImGUI when alpha is disabled"
  + Improved WinRing0 Driver Management

22.6.16-NOCEGUI
===============
 + "Reset" now resets the active preset's perceptual parameters
 + Perceptual Boost HDR mode is on by default for HDR preset #0
 + Perceptual Boost parameters are now stored per-preset
 + Fixed a problem with Yakuza engine games destroying DXGI adapters
     SK is holding references to so the busted engine will not crash

22.6.15.3-NOCEGUI
=================
 + Standard logging is now silent when loaded via SKIF or RunDLL32, to prevent deadlock

22.6.15.2-NOCEGUI
=================
 + Prevent SKIF from recursively spawning driver install if not elevated to Admin
 + Merge pull request #4 from cathyjf   [ SK_LoadImportModule: Expand environment variables ]
 + Merge pull request #7 from WallSoGB  [ Fix "Show OSD in Video Capture" in OGL-IK         ]

22.6.15.1-NOCEGUI
=================
 + Fallback to Documents\My Mods\SpecialK if path is unreadable or
     if it cannot be created.
 + Special K now uses "HKCU\Software\Kaldaien\Special K\Path" to find
     the shared centralized directory for profiles, plug-ins, etc.

22.6.14.4-NOCEGUI
=================
 + Perceptual Boost HDR mode now works in D3D12 titles
 + Added HUD shader definitions for The Quarry for HUDless screenshots
 + Fixed audio stutter in The Quarry due to wrong thread priorities
 + Fixed multiple calls issued per-ID3D11DeviceContext::UpdateSubresource (...) when hooked and wrapped
 + Added protection for games that change thread priority while an SK thread priority override is active
 + Merge pull request #6 from WallSoGB  [ Corrected Intel CPU power and clock readings ]

22.6.12.1-NOCEGUI
=================
 + Changed SK's ResizeBuffers skip to issue unsynchronized Presents as many times as necessary to get
     the SwapChain backbuffer index to wrap-around to 0 before the function returns.
     
     This reproduces the side-effects of a successful D3D12 IDXGISwapChain3::ResizeBuffers (...) call
 
   -> Fixes compat. with The Quarry in D3D12

22.6.12-NOCEGUI
===============
 + Added support for middle-gray contrast and color saturation adjustment to Passthrough tonemap mode
 + Added range tests to prevent NaN (black pixels that bleed through UI) during tonemapping
 + Added sliders to the HDR widget to make tuning Perceptual Boost easier
 + Bumped the Color Saturation slider's maximum up to 140%

22.6.11-NOCEGUI
===============
 + Made Perceptual Boost into a mode rather than a Tonemap (refer to the new checkbox in HDR widget)
 + Extra tuning parameters have been added when PB is enabled.
 
   >> The first two control overall brightness and the second two can scale things back if
        mid-tone detail is being lost.

22.6.9-NOCEGUI
==============
 + Added ACES Filmic + Perceptual Boost Tonemap Mode to HDR Widget

    >> Increases perceptual brightness slightly, make sure to check the vs. Max Average Luminance
         visualization to ensure clipping is not taking place -- maximum luminance target may need
           to be lowered.

 + Fixed white/black objects in some D3D11 games that use Multisampled RenderTargets

22.6.8.1-NOCEGUI
================
 + Fixed brightness of ImGui UI in sRGB
 + Added sRGB framebuffer status when flip model override is active
 + Added locking to INI file write/parse to prevent rare crashes when opening SK's control panel

22.6.8-NOCEGUI
==============
 + Add support for ID3D11Resource and ID3D11Texture2D1 to SwapChain wrapper when DXGI Flip Model
     is being forced on
 + Added support for rendering ImGui into multisampled non-Flip SwapChain backbuffers
 + Improved MSAA resolve for sRGB games when flip model is active
 + Fixed various sRGB issues and removed confirmation dialog when forcing flip in an sRGB game

22.6.2-NOCEGUI
==============
 + Removed most default config overrides for Hatsune Miku, including the default 60 FPS limit
 + Hatsune Miku's framerate limiter is now completely disabled except in game menus,
     whether or not Special K has a framerate limit set.

   * VSYNC becomes the default framerate limiting mechanism; users are encouraged to turn
       SK's framerate limiter on in the control panel (it will auto-match refresh rate).

22.6.1-NOCEGUI
==============
 + Separate High FPS mod for Hatsune Miku no longer required, just set SK's framerate limit
     * Menus will be locked to 60 FPS or your limit (whichever is lowest) for proper gameplay
 + Installing Special K locally for Hatsune Miku disables its stutter inducing network code
     * This code is unrelated to leaderboards.

22.5.31-NOCEGUI
===============
 + Enabled SK's dynamic spinlock feature in Hatsune Miku to minimize audio/render desync 
 + Configured default settings for Hatsune Miku to minimize latency at 60 FPS w/o Latent Sync

     * If you did not read the original thread for this game, reset your config

    -- Thread explaining ideal configuration was deleted when Valve banned me.

      Summary of information lost thanks to Valve:

        > Setup 16-bit / 44.1 or 48 kHz Sample Rate in Windows
        > Setup a 60 FPS limit (game's averages 60.5 - 64)
        > Consider Latent Sync if your display is 60 Hz
        > Mod for >60 FPS: https://sk-data.special-k.info/misc/DivaModLoader_HighRefresh.zip

22.5.30-NOCEGUI
===============
 + Patched failure prone Windows (10+) version check code out of Hatsune Miku Project DIVA
   >> Game has been tested and works on Windows 8... might even work in 7 (SK will not! :P)

22.5.29-NOCEGUI
===============
 + Improved compatibility with Disgaea 5 (uses more than 128 D3D11 device contexts)
 + Fixed incorrect D3D11 Shader State Tracking introduced after 21.07.23
 + Set D3D11 "Low Spec Mode" by default (new config files only) to minimize
     state tracking performance overhead in high drawcall games

22.5.28-NOCEGUI
===============
 + Added Extended Model/Family to CPUID for Intel CPUs
 + Made D3D12 Feature Level 12_2 optional depending on build environment's WDK version

22.5.27-NOCEGUI
===============
 + Updated compiler requirements in README
 + Removed single-threaded limitations from Hatsune Miku Project DIVA Mega Mouthful+

22.5.15-NOCEGUI
===============
 + Removed EOS online warning; problem caused by incorrect critical section
     initialization in EOSSDK
 + Added Chrono Cross flicker fix when using unlocked framepacing

22.4.27-NOCEGUI
===============
 + Added warning message for EOS online games, since they do not work for some

22.4.20-NOCEGUI
===============
 + Removed a few texture scaling artifacts in Chrono Cross

22.4.19.2-NOCEGUI
=================
 + Improved 60 FPS functionality for Chrono Cross
 + Added 1440p / 4K resolution modes to Chrono Cross
 + Added protection against launchers clobbering actual game INI files

22.4.17-NOCEGUI
===============
 + Handle RTV/SRV destruction occurring while Render Mod Tools window is open

22.4.15.2-NOCEGUI
=================
 + Fixed initialization races in some widgets if drawn on frame 0
 + Fixed potential DXGI Do Not Sequence + Restart flags on first frame
 + Avoid calling ResizeTarget (...) on redundant Fullscreen mode changes
 + Added support for Multisample Resolve between UNORM and FP buffers
 + Improved HDR support (pipeline remaster w/o MSAA) in Chrono Cross

22.4.15.1-NOCEGUI
=================
 + Fixed Chrono Cross timing override not actually applying at game start
 + Added an event when games exit for SKIF to use to stop injection

22.4.15-NOCEGUI
===============
 + Added Large Address Aware patch functionality to Special K for 32-bit games
     that are not Large Address Aware  (see the File Menu in affected games)
 + Automatically apply Large Address Aware patch to Chrono Cross

22.4.14-NOCEGUI
===============
 + Added Frame Pacing Fixes for Chrono Cross
 + Added optional compressed fonts for Chrono Cross for users whose drivers
     cannot run the game and report "Out of Memory"

   *) See: https://sk-data.special-k.info/misc/SK_ChronoCross_FontFix.7z

        SK_Res\...

22.4.11.1-NOCEGUI
=================
 + Fixed calling the DLL import version of GetSystemCpuSetInformation (...)
 + Improved HDR black point compensation for less grayscale banding near-black

22.4.10.2-NOCEGUI
=================
 + Fixed OpenGL-IK displaying a black screen when flip model is enabled

22.4.10.1-NOCEGUI
=================
 + Fixed a number of issues related to fullscren refresh rate overrides in D3D11
 + Improved reliability of fullscreen mode transitions while using Flip Model

  >> Special K is now a virus... according to Discord.

    ] Uploads now have to be encrypted, or Discord deletes them and then replaces
        the original message with something stupid about cooking.

      * Password:  skummy   , as in that's a really scummy thing to do Discord.

22.4.10-NOCEGUI
===============
 + Fixed a few Structured Exception Handling stack unwinds
 + Added skeleton implementation of D3D9-IK, non-functional, just enough to test
     whether and where this will crash D3D9 games when finished.

22.4.9.2-NOCEGUI
================
 + Fixed a rare race to initialize framerate limiter that could result in an
     integer divide by zero.
 + Set the default AutoStopBehavior for SKIF to Auto-Stop On First Frame

     >> This option has lower compatibility than Stop When Game Exits, but
          will result in far fewer arguments

22.4.9.1-NOCEGUI
================
 + Added SKIF Auto-Stop Behavior Configuration to SK (belongs in SKIF, but whatever)

     Refer to "Documents\My Mods\SpecialK\Global\platform.ini"

       [SKIF.System]
       AutoStopBehavior={0|1|2|...}

         0: Auto-Stop Never
         1: Auto-Stop when a game first starts
         2: Auto-Stop when a game exits        [Default]

     Anything else:  Stop whenever SK feels like it, including if the game crashes


22.4.9-NOCEGUI
==============
 + Added support for SwapChain-based MSAA when using Flip Model / HDR

     (Chrono Cross is 8x MSAA by default, and works as intended now)

22.4.8.3-NOCEGUI
================
 + Changed SK's Injection Success Event to not signal if SKIF has explicitly
     been configured not to stop injection.
 + Added Chrono Cross's launcher to internal injection blacklist
 + Fixed Flip Discard emulation discarding the wrong surface in fullscreen mode

22.4.8.2-NOCEGUI
================
 + Added XInputGetKeystroke (...) hook to correctly block input while SK's control panel
     is active in games that use buffered-input for XInput rather than polling.

22.4.8.1-NOCEGUI
================
 + Changed behavior of Fullscreen + Borderless slightly, it now will always adjust both
     the window size and framebuffer resolution.

     * This is helpful for games that had odd-ball resolutions preventing flip model,
         such as Final Fantasy XIV. But it's also a departure from previous design.

     Because the Borderless + Fullscreen option now always matches window and framebuffer,
       it may cause problems with games that have options for sub-native resolution windows.

      >> You should turn SK's "Fullscreen" option off in those cases, or use SK's Display
           menu instead to select a desktop resolution to run Borderless+Fullscreen.

  + Corrected long-standing issue in Horizon Zero Dawn where its Fullscreen mode would add
      a window border rather than remove it when SK was used :)

22.4.8-NOCEGUI
==============
 + Created Plug-In for ELEX2 to speed file I/O (load screens) up by a factor of 100x

     >> Not joking, load screens go from 2 minutes to instant.

22.4.7.2-NOCEGUI
================
 + Added proxy backbuffer surfaces for non-flip (D3D11) games to support fullscreen

22.4.7.1-NOCEGUI
================
 + Fixed D3D12 "Fullscreen Mode" (lol) in some games after Alt+Tab

22.4.7-NOCEGUI
==============
 *** Portable Global Injection ***

   Global Injection supports installing to arbitrary paths now, profiles and all
     supporting assets will be loaded relative to the directory that SpecialK32.dll
       and SpecialK64.dll are in.

    You can keep entirely different installs of Special K if that's your thing, just
      put SKIF and Special K's DLLs in their own directory :)


22.4.6.1-NOCEGUI
================
 + Fixed resource management crash in Death Stranding Director's Cut (D3D12)
 + Added an options dialog to turn on 'Force Windowed' mode or disable Flip Model
     in games that fail to transition into / out of fullscreen exclusive (D3D11)

22.4.6-NOCEGUI
==============
 + Improved reliability of Fullscreen Exclusive workaround in D3D11.

     => Alt + Enter generally doesn't work for games that have had
          Flip Model forced on, but mode changes requested from the
            game's control panel should work.

22.4.4-NOCEGUI
==============
 + Added recovery mechanism for games that fail to correctly engage
     Fullscreen Exclusive while DXGI Flip Model is enabled (D3D11)
 + Fixed HDR paper white setting not scaling correctly for Rec 709 luminance

22.4.3.1-NOCEGUI
================
 + New performance logging rules prevent RTSS from flooding logs with timer
     resolution change messages
 + Changed initialization order for framerate limiter / scheduler to minimize
     timing interference from third-party software

22.4.3-NOCEGUI
==============
 + Special K's local copies of XInput and dbghelp DLLs from System32 are now
     checked to make sure they are the same version as the DLLs stored in System32,
       and will update themselves otherwise.

 + Bypass software that may be setting per-process timer resolution higher (worse)
     than intended via repeated calls to NtSetTimerResolution / timeBeginPeriod.

    >> This -seems- to be a bug in Windows, because it should not be possible for
         the timer resolution of a process to change while SK has these functions
           nop'd.

    * Fix is only applied while SK's framerate limiter is engaged, so always? ;)

22.4.2.2-NOCEGUI
================
 + Added a preference under the HDR Menu for SK's automatic HDR On/Off feature
 + HDR menu now shows in Control Panel for users with HDR capable displays running
     on SDR desktop (previously it only showed if desktop HDR was enabled)

22.4.2.1-NOCEGUI
================
 + Code cleanup and race condition removal
 + AVX2 DLL size reduced, offers marginal gains, but free performance is always nice

  >> Rename AVX2 DLL to simply SpecialK64.dll to use it instead of the normal SSE2 version.

22.4.2-NOCEGUI
==============
 + Slight improvements to 10-bpc SDR mode (D3D9/11/12)
 + Handle dummy window creation by third-party overlays and mods better,
     so that they don't trigger assertion failures when SK can't figure out
       which window is supposed to be handling input.
 + Added AVX2 version of Special K (64-bit), probably will not have much effect, but
     I am curious :)

22.4.1.2-NOCEGUI
================
 + Added option to force 10-bpc in SDR (D3D9/D3D11/D3D12), stability not guaranteed

     [Display.Output]
     Force10bpcSDR=true ; Possibly broken game, hurray! :)

    [ 10-bpc screenshots are not supported in D3D9 yet ]

 + Fixed a number of VSYNC related issues in D3D9 games

    * Tooltip in control panel now reports correct values
    * Forcing present interval 0 correctly turns off VSYNC (when fullscreen exclusive)
    * Resolution, Format and VSYNC Overrides are applied at D3D9 device creation instead
        of delaying them until the first device reset (Alt+Enter / Alt-Tab)

22.4.1.1-NOCEGUI
================
 + Fixed potential crash during shutdown in Tales of Arise

22.4.1-NOCEGUI
==============
 + Added additional device (integrated/discrete) GPU selection info to OpenGL-IK logs
 + Disable logging for deferred D3D11 contexts Twitch's overlay constantly creates
 + Fixed assertion failure triggered by some overlays when passing invalid shaders
 + Added CD Projekt launchers to internal blacklist

22.3.25.1-NOCEGUI
=================
 + Fixed HDR-related crash in Ghostwire: Tokyo (D3D12) from SwapChain readback

  >> This game has non-defeatable HDR settings, you can bypass the game's HDR:

      [Render.DXGI]
      HideHDRSupport=true

22.3.25-NOCEGUI
===============
 + Added Epic Overlay HDR Color Correction and Luminance Control (D3D11)

22.3.22.1-NOCEGUI
=================
 + Added 15 frame initialization delay to Elden Ring plug-in to avoid
     compatibility problems with Flawless Widescreen's framerate stuff

22.3.22-NOCEGUI
===============
 + Removed C++20 std::format usage from SK's ini parser for stability reasons
 + Handle a regression in Elden Ring 1.3.2 that uses the old button textures

     >> Elden Ring PS4 button users must re-enable button mods from control panel

22.3.21.2-NOCEGUI
=================
 + Disable in-process SteamAPI achievement statistics fetch since achievement
     popups are not implemented in NOCEGUI branch

22.3.21.1-NOCEGUI
=================
 + Control panel's overlay pause feature is now disabled by default
     ( compat hack for "Going Under" )
 + Changed CPU Widget driver install procedure to use SKIF

22.3.20-NOCEGUI
===============
 + Added support for SKIFsvc{64|32} to install/uninstall WinRing0
 + Added 7.5s timeout for RunDLL-based WinRing0 install

22.3.19-NOCEGUI
===============
 + Added 'Compact' FPS detail mode (see "OSD Settings" / "Basic Monitoring")
 + Cleanup plug-in ABI (missing / incorrectly named DLL exports)

22.3.18.2-NOCEGUI
=================
 + Update game speed memory pattern for Elden Ring 1.3.1
 + Elden Ring DualShock 4 controller users should open SK's control panel and
     re-enable PS buttons.

    >> This will delete the old texture and download the correct new one.

22.3.18-NOCEGUI
===============
 + Updated Elden Ring plug-in with new button texture hash and game speed code
 + Restored normal HDR Peak Luminance behavior for scRGB / ACES Filmic tonemaps

22.3.11.3-NOCEGUI
=================
 + Added extra logging for D3D12 SwapChain format issues during ImGui init

22.3.11.2-NOCEGUI
=================
 + Fixed OpenGL-IK DX/GL Interop Shader broken in 22.3.11
 + Fixed HDR in Life is Strange True Colors (D3D12)
 + Fixed Latent Sync causing crashes in some D3D12 "Fullscreen" games

22.3.11-NOCEGUI
===============
 + Added support for HDR override in Guardians of the Galaxy and Forza Horizon 5

22.3.7.1-NOCEGUI
================
 + Removed Restart option from File menu if Global Injection is not active
 + Changed ] and [ keybinds in D3D9 mod tools window to behave like D3D11
 + Fixed D3D9 Blocking Texture loads delaying more threads than intended
 + Added Initialize Texutre Mods to File menu for D3D9/12

22.3.7-NOCEGUI
==============
 + Added 64-bit Steam AppID support (non-Steam games launched via Steam)
 + Fixed accidental removal of Latent Sync keybind config logic
 + Partially restored D3D9 texture mod support

22.3.6-NOCEGUI
==============
 + Fixed SteamInputAppID not being set to 0 initially
 + Removed libScePad.dll resource dependency from project
 + Fixed wrong game speed value being written to Elden Ring INI

22.3.5-NOCEGUI
==============
 + Reduced D3D12 Copy Command Allocator overhead in Elden Ring
 + Testing alternate Thread Pool scheduling to fix 'EzWorkPool' dumping all
     of its threads onto core 0/2 in Elden Ring

    >> Set [SpecialK.System] GameOutput=false to opt-in

       * Consult the Thread Widget to confirm 'Ez...' threads are being
           distributed to different CPU cores.

22.3.4.3-NOCEGUI
================
 + Optimized overlapping D3D12 HDR / Texture Injection code that was activating for HDR
     users without texture mods present
 + Elden Ring's Priority Inversion fix applies correct default state when toggled

22.3.4.2-NOCEGUI
================
 + Added in-game option to download and install PlayStation buttons in Elden Ring
 + Added HUD Toggle / Screenshot keybind settings to Elden Ring's control panel

22.3.4.1-NOCEGUI
================
 + Fixed recent changes to memory pattern scanning that caused NieR: Automata's
     plug-in to scan past the end of commited executable memory

  .1) Fixed the fix for NieR breaking Elden Ring, ugh.

 + Added Early D3D12 Texture Mod Support

    >> Elden Ring Dual Shock 4 Buttons:

         https://sk-data.special-k.info/archive/SK_ER_DualShock4.7z

22.3.3.1-NOCEGUI
================
 + Fixed compat. with other D3D12 games when using HUD toggle
 + Force sleepless window thread off in Elden Ring

22.3.3-NOCEGUI
==============
 + Added support for D3D12 HUDless Screenshots (See Screenshots cpl for Keybinds)
 + Added support for D3D12 HUD toggle          (Alt + Shift + H)

 (*) Tested only in Elden Ring ;)

22.3.2.1-NOCEGUI
================
 + Fixed compatibility with "PauseEldenRing" mode
 + Forcefully disable SteamAPI friend achievement fetch so achievements unlock

22.3.2-NOCEGUI
==============
 + Elden Ring Framerate Limit code is pattern-scanned and patched accordingly now,
     no updates required for compatibility with future patches.
 + Elden Ring plug-in init deferred until first frame drawn to fix deadlocks if
    config takes a long time.

22.3.1.3-NOCEGUI
================
 + Updated Elden Ring Plug-In for 3/1/22 patch

22.3.1.2-NOCEGUI
================
 + Default Elden Ring settings to block KB&M input while Elden Ring game window
     is not focused and keep mouse from leaving game window while it is focused

22.3.1.1-NOCEGUI
================
 + Handle ERROR_INVALID_PARAMETER during D3D12 Shader Pipeline Library creation
    ( fixes startup hangs in Elden Ring )

22.3.1-NOCEGUI
==============
 + Elden Ring settings are now saved in INI persistently
 + Elden Ring Prio. Inversion fix only applied if render thread is Below Normal
 + Disabled SteamAPI friend achievement sync. for Elden Ring

22.2.28.2-NOCEGUI
=================
 + Injecting SK _late_ into a Flip Model game that knows what DXGI tearing
     flags are no longer triggers an assertion failure

22.2.28.1-NOCEGUI
=================
 + Fixed issue with Priority Inversion workaround not applying correctly
 + Fixed Steam Overlay so that it works in Elden Ring

22.2.28-NOCEGUI
===============
 + Added D3D12 pipeline library (shader cache) flush if Elden Ring tries to
    use a stale / invalid cache from old driver version or changed hardware.

    >> Pipeline caching would otherwise not work at all after driver update

22.2.27-NOCEGUI
===============
 + Ignore EAC's launch window to prevent SKIF auto-stop in Elden Ring

22.2.26.5-NOCEGUI
=================
 + Added Thread Priority Inversion fix for Elden Ring

22.2.26.3-NOCEGUI
=================
 + Updated framerate limiter code for Elden Ring 1.0.2.1
 + Added Elden Ring control panel section
 + Uncapped framerate during cinematics

22.2.26-NOCEGUI
===============
 + Added EAC Disable Feature for Elden Ring
 + Added framreate limiter fixes for Elden Ring
 + Fixed some ImGui rendering issues when displaying UTF16 text

22.2.25-NOCEGUI
===============
 + Improved D3D11 resolution / window resize performance
 + Fixed an issue that was preventing screenshot functions from working in D3D11/12

22.2.24-NOCEGUI
===============
 + DualSense controller support extended to God of War

22.2.23-NOCEGUI
===============
 + Improved framerate limiter accuracy during arithmetic overflow edge-cases
 + Workaround irregular libScePad polling in Dying Light 2 in menus

22.2.22.968-NOCEGUI
===================
 + Fix frozen screen issues in some non-Flip compliant games (i.e. CrossCode)
 + Improved global hook standby performance (waiting for 'Stop Service')
 + Removed embedded sound files from SK's DLLs

     >> Previously built-in sounds now live in "Assets/Shared/Sounds/..."

22.2.22-NOCEGUI
===============
 + Upgraded build tools to Visual Studio 2022
 + D3DX9, Tobii Stream Engine and WinRing0 are no longer packed into SK's DLL;
     these are now downloaded on-first-use from SK's CDN.

22.2.21-NOCEGUI
===============
 + Eliminated locking caused by unsafe DllMain in NvCameraWhitelisting (ANSEL)
 + Added pre-defined PlayStation + Button combos for:

     Screenshot:                      PS + Share
     Latent Sync FCAT Bar Toggle:     PS + L3
     Latent Sync +5 Scanline Offset:  PS + Up
     Latent Sync -5 Scanline Offset:  PS + Down

   Holding PS for 20 frames or pressing and releasing PS without activating
   one of the button combos above will open the control panel

    - Currently only works in games that use native DualShock/DualSense

        (i.e. Dying Light 2)

    These will be customizable in the future, after figuring out an Xbox equiv.

     * Use DS4Windows if you actually want to use SK's control panel after
         opening it using PS; also set DS4Win's PS button binding to "Unset" :)

22.2.20.3-NOCEGUI
=================
 + Fixed even more issues with deadlock in Dying Light 2
 + Updated software licenses and copyleft SK 2022

22.2.20.2-NOCEGUI
=================
 + Fixed a rare deadlock in dbghelper.dll during game startup
 + Added WM_DEVICECHANGE stutter mitigation for Monster Hunter Rise and other
     games with poor gamepad hot-plug performance

22.2.20.1-NOCEGUI
=================
 + Epic's Overlay is driving me nuts reloading Steamclient64.dll every 150 ms,
     SK now pins that DLL so that it cannot be unloaded.

       [+] This DLL pinning behavior can be disabled w/ [Steam.Log] Silent=true

 + Added option to enable/disable PlayStation button opening SK's control panel
 + Changed mute button to mute game instead of changing input capture
 + Share -> Touchpad Click, Mute Button and PlayStation Button behavior are
     stored in Global\input.ini now instead of per-game

     >> Trackpad disable is still per-game, since some games kinda need it (!)

   Gamepad-specific bindings are now a practical feature since SK has access
     to a button that no game can use (or even see) -- the PlayStation button.

       [[ not implemented ]]
       ---------------------
       ( i.e. PS + L2 ==> Screenshot   or   PS + L3 ==> Toggle HUD )

   If any SK functions come to mind that normally require a keyboard, but
     would be handy using a gamepad, please share while this stuff is fresh :)

22.2.20-NOCEGUI
===============
 + DualShock / DualSense users can now open SK's control panel by pressing the
     PlayStation button (in games that use libScePad for enhanced PS input)
 + Mute button on PlayStation controllers can be used to toggle SK's UI input
     capture mode (e.g. play game while control panel is open)
 + Added options to disable touchpad input (PS-native games) and
     map the Share button to trackpad touch

      >> All notes assume, unless otherwise stated, the pad is wired via USB

22.2.19.1-NOCEGUI
=================
 + Fix back and forth button icon switching in Dying Light 2 if a DualSense
     controller is used while DS4Windows is active.

22.2.19-NOCEGUI
===============
 + Add input blocking (and API status) functionality for games that use
     PlayStation's native API (libScePad.dll)
 + Additional protection for EGS games with invalid manifests

22.2.18-NOCEGUI
===============
 + Fixed potential crashes for EGS games with manifests that do not match
     the locally installed game
 + Fixed black screens due to Multisampled Depth/Stencil in Dear Esther when
     promoting to Flip Model  ( Color is single-sampled, D/S must also be )

22.2.6-NOCEGUI
==============
 + Removed 8.3 DOS Filename warnings, "Restart Game" becomes "Exit Game"
     on systems that lack support.
 + Removed warnings for staging textures that are only partially updated by
     the game engine (D3D11)
 + Changed Latent Sync's Scanline Adjust keybinds to +/- 5 Scanlines and
     apply the new sync point immediately.

22.2.5-NOCEGUI
==============
 + Added HDR Setup button to Display menu for compatible displays
 + Added protection against changing SwapChain backbuffer count in D3D12
 + Added checks to prevent overriding SwapChain backbuffer count using a
     number of buffers smaller than the engine originally requested.

22.2.4-NOCEGUI
==============
 + Fixed HDR crash at startup in D3D12 mode in Dying Light 2

22.2.2-NOCEGUI
==============
 + Defaulted most of SK's widgets to click-through: enable

    † Reset global OSD INI for changes to take hold on existing installs
    ‡ Exceptional Widgets (break rules; not "amazing widgets" :P)

          1. HDR Widget
          2. Thread Profiler Widget

    Right-click a widget while the SK control panel is active to change a
      click-through enabled widget to work even when control panel is closed

22.2.1-NOCEGUI
==============
 + The SK_Res\Achievements directory no longer removes the 'Initialize Texture Mods'
     menu option from the File menu
 + Automagically blacklist SK from injection into Windows Terminal and many other
     non-game UWP applications that use graphics and game input APIs
 + Added additional protection against injection into user interactive service hosts

     >> SK's not a threat to them, however, they tend to stop responding to SK's DLL
          unload broadcast message and the DLL should bounce out immediately instead.

 + Fixed some games not registering window re-activation when using Multitasking-On-Top
 + Changed SteamInput code to apply only when exiting a process that has drawn at
     least one frame
 + DualShock / DualSense controllers will not work with SK unless SteamInput is
     disabled and DS4Windows is used instead or they are plugged in via USB and SK is
       set to use DirectInput instead of XInput (gamepad settings)

22.1.31-NOCEGUI
===============
 + Fix typo in HTTP status code logging that might crash on 300 range responses
 + Fix C++17 std::filesystem time vs. system clock epoch in cache age calculations

22.1.30-NOCEGUI
===============
 + Improved error handling for Steam users with private profiles
 + Added additional backend caching for Steam statistics and increased update freq.

22.1.29-NOCEGUI
===============
 + Improved caching behavior for Achievement data.

22.1.28-NOCEGUI
===============
 + Added caching and non-SteamAPI based achievement stat collection

22.1.27-NOCEGUI
===============
 + Reduced Start/Stop Injection delay from 50 ms to 15 ms
 + No longer issue steam://forceinputappid/ commands if Steam is not running
 + Changed Steam achievement icon pre-fetching to use SK's cloud server

22.1.24-NOCEGUI
===============
 + Added achievement icon pre-fetch for Steam and EOS (SK_Res\Achievements\...)

22.1.23-NOCEGUI
===============
 + Added Texture Cache / Mod support for D3D11 Mipmap Clamped Textures (God of War)

22.1.22-NOCEGUI
===============
 + Fixed potential buffer overrun while calculating Steam friend achievement stats
 + Fixed UTF8 character encoding in EOS achievement text

22.1.21.1-NOCEGUI
=================
 + Implemented File | Restart Game for EGS games (fixes game stuck in background)

22.1.21-NOCEGUI
===============
 + Removed CEGUI and temporarily removed achievement popups along with it
 + The achievement popups will be back, but it's important to test w/ CEGUI gone
     before proceeding to replace that popup with a new ImGui window

  * Render APIs most affected:  D3D9, OpenGL (w/o OpenGL-IK) and D3D11

    D3D12 is unaffected, so all testing should focus on those APIs.


22.1.20.1
=========
 + Improved reliability of temporary desktop resolution override for single-monitor
     users and for multi-monitor users who run the game on the default monitor
 + Flush display name cache when new monitors are powered on/off so that the Display
     menu's monitor list shows correct names

22.1.20
=======
 + Added option to apply a display resolution override while the game is running,
     grants access to optimized borderless window resolutions that would require
       changing display settings manually otherwise.
 + Resolutions changed in the Display menu no longer save to the System Registry
 + Display Management Keybinds are now in the Display menu on single-monitor systems

22.1.5
======
 + Added achievement progress indicator for EGS games
 + Added minimal achievement config for EGS

 - Configuration should be wrapping up in one or two extra releases,
     and CEGUI will be removed in favor of an ImGui-based achievement popup
       that works in D3D12.

22.1.4.1
========
 + Improved AppCache (config name lookup) performance for EGS
 + Stopped loading SteamAPI for GOG / EGS games that ship with SteamAPI DLLs
 + Quicker Start/Stop DLL unload for apps that lock SK's DLL and then suspend

22.1.4
======
 + Epic Game Store titles store config in Profiles\<Localized Game Name>
     instead of <game.exe> now
 + Active game title has been added to the control panel for EGS games

22.1.3
======
 + Added preliminary 'Epic Enhancements' section to control panel

22.1.2
======
 Initial Epic Online Services Integration
 ----------------------------------------
  + Achievement unlock sound has been added to EGS games
  + SK's OSD contextually hides/shows itself in response to Epic overlay state
  + SK can pause EOS overlay aware games when opening the control panel

  There is a lot of overlap in features between SteamAPI and EOS, so the
    Steam control panel will be unified with EOS in later builds. For now all
      of these features are controlled using the Steam INI settings.

22.1.1
======
 + Fixed Epic Online Services overlay occasionally removing SK's global hook
 + GOG, Epic Game Store and Ubisoft games are auto-whitelisted for injection

1.9.9.9 A.D. ラヴォスの日
========================
 + Regularly Scheduled Time Egg Maintenance

21.12.31
========
 + Optimized INI parser memory management / load speed
 + Increased throttling on SKIF's Start/Stop injection

21.12.30
========
 + Cleaned up FF7 Remake control panel
 + Added throttling mechanism to SKIF's inject Start/Stop to prevent hook races

21.12.29
========
 + Added configurable resolution scaling, texture streaming and shader caching
     for Final Fantasy 7 Remake

    >> FFVIIHook is required for Engine.ini changes to work, consult Nexusmods

21.12.28
========
 + Optimized cursor auto-hide and fixed a cursor-related lockup in Epic Overlay
 + Global Hook teardown delay (333 ms) for apps that exit before DLL cleanup

21.12.23
========
 + Do not activate Ansel with Special K unless you are using a gamepad,
     Ansel's overlay will break keyboard input until you restart the game.

    >> SK's support for Ansel goes as far as preventing it from deadlocking
         if enabled. Its keyboard problems will not be fixed

 + Workaround D3D11 deadlocks caused by Ansel + Epic Game Overlay in D3D12

21.12.22
========
 + Improved C++ Exception Safety in SK's COM Smart Pointer

 + Fix monitor reassignment on systems with gaps in -attached- devices
     and non-increasing sequences following GDI's '\\.\DISPLAYxx'
       naming convention  (e.g. 2,5,4 instead of typical 1,2,3)

   ->>  Internally, SK uses VidPN Path Name to identify monitors  <<-

    ( Game Developers are STRONGLY encouraged to store VidPN Paths
        instead of GDI display index values in config files )

"\\?\DISPLAY#GSMC0A0#5&2dafe0a1&3&UID49410#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}"

   ^^^ This is not a user-friendly identifier, but it persists across
         reboots, driver updates and whatever else Windows 11 breaks.

 + Fix GDI memory leak when copying screenshots to clipboard

21.12.20
========
 + Lossless (SDR) screenshots taken in 10-bpc D3D12 games
     will now use 48-bpp PNG to preserve lossless quality
 + Added D3D12 Shader Load Activity to Logs
 + Removed auto-disable G-Sync option from Latent Sync
 + Optimized Latent Sync's signal timing acquisition
 + Optimized framerate limiter for Final Fantasy 7 Remake

21.12.19
========
 + Fixed various build environment issues:

    * Missing tobii_stream_engine_sk{32|64}.lib
    * Missing boost/preprocessor/debug/error.hpp
    * Multiply-defined IID_IDXGIFactory6/7 symbols if using newer dxguid.lib

 + Keybind config for HUDless screenshots only shows up for games with
     SK HUD shader info (d3d11_shaders.ini or built-in)

21.12.18.2
==========
 + Auto-hide mouse cursor (as default config) in Final Fantasy 7 Remake
 + Add HUD shader info to the D3D11 version of Final Fantasy 7 Remake

21.12.18.1
==========
 + Fixed stuck keys after alt-tab in Final Fantasy 7 Remake
 + Fixed monitor-specific features (HDR, LatentSync, Display menu) in FF7R

21.12.18
========
 + Automatically whitelist Final Fantasy 7 Remake
 + Reduced memory usage for fonts in D3D9 games
 + Improved support for games with embedded child windows and menu bars
     (i.e. emulators)
 + G-Sync status updates quicker when a window changes monitors
 + Added notification when resizing / moving a window to get the game
     to resize the SwapChain and re-engage Independent Flip
 + Improved performance when moving windows between monitors w/ snap
 + Increased whitelist/blacklist limits to 128 * MAX_PATH characters
 + Added XInput UAP Support for Halo Infinite

21.12.6
=======
 + Reduced mouse stutter in games when the hardware cursor is visible
 + Implemented RGB[A]8 -> RGBA16F remastering in OpenGL when scRGB HDR is
     active in the HDR widget

21.12.5
=======
 + Improved OpenGL HDR quality (16bpc in many older titles)

     >> Newer engines that primarily draw to offscreen Renderbuffer Objects
          will see less improvement.

        GL "pipeline remastering" will help in later releases.

21.12.4
=======
 + "Multi-Tasking On Top" no longer requires Global Injection to monitor
     foreground status of other applications

21.12.3
=======
 + "Fixed" (workaround) compiler optimization bug so newer versions of MSVC
     can be used with ImGui
 + Fixed input not passing to other applications when SK's control panel is
     visible and "Disable Mouse / Keyboard Input to Game" is enabled
 + Fixed Tessellation Shader stateblock in D3D Feature Level 10_0/10_1 games
 + Added logging of D3D Debug Layer when no debugger is attached
    >> Also disabled Break-on-Error if nothing is attached to catch it :)

21.12.1
=======
 + Re-enabled OpenGL `ChangeDisplaySettingsEx` call, though warning is still
     displayed in any game that attempts to use it.
 + Fixed mouse input in Prey (2006), but to block mouse warp you need to set
     "Block Mouse when no Cursor is Visible" in SK's Mouse settings
 + Made the G-Sync status line of the control panel selectable with keyboard

21.11.30
========
 + Improved 'TemporaryDesktopHDRMode' mode on systems with single monitors,
     it should correctly turn HDR off at application exit
 + Improved Multi-Tasking On Top's protection against DWM composition when apps
     are snapped to the sides of adjacent monitors

21.11.29.1
==========
 + Changed 'Multi-Tasking On Top' to not raise the game's window when selecting
     an app on a different monitor if the game was _NOT_ already the TopMost
       window on its own monitor

 + Fixed Ctrl + Shift + Backspace not activating the control panel in some games
     when 'Disable Keyboard Input to Game' is selected


21.11.29
========
 + Temporarily disabled 2x and 4x Latent Sync modes to fix black screens
 + Added G-Sync Control Panel (right-click G-Sync status in control panel)

    >> G-Sync and FastSync can be configured per-game

 + Turning on Latent Sync now disables G-Sync; enable FastSync if you need
     G-Sync like functionality while using Latent Sync

21.11.28
========
 + Fixed texture upload performance issues in The Evil Within 1 / 2

 21.11.27
========
 + Fixed first-launch issues on systems without default_SpecialK.ini

21.11.26
========
 + Fixed default_{SpecialK|API}.ini files not being loaded when games launch
     w/o a config file present
 + Fixed [Reset Config] in Compatibility Launch Menu not deleting config files
 + Fixed OpenGL API auto-detect in some games on first launch

     >> NOTE: Using the compatibility menu and selecting 'OpenGL' will disable
                SK's new OpenGL / DX interop features; use 'All APIs' to enable

21.11.25
========
 OpenGL on D3D11
 ---------------
  + New system translates OpenGL display output to D3D11 to make GL games
      compatible with windowed mode G-Sync, Reflex and HDR (SK or AutoHDR)

    Feature is enabled by default, but can be disabled by setting:

      [API.Hook]
      d3d11=false

    Turning off D3D11 support in Special K will use legacy OpenGL


21.11.23.1
==========
 + Updated D3D9 Screenshot Support (keybinds / Steam integration)
 + Added support for X8R8G8B8 D3D9 Screenshots
 + Added support for RGB8 OpenGL Screenshots

21.11.23
========
 + Removed Assertion on Windows 8.1 systems for High-Precision Waitable Timers


 OpenGL Screenshot Support
 -------------------------
  + Added support for GL to SK's multi-threaded screenshot capture / encoder

    > Keybinds for 'HUDless Screenshots' exist, but trigger normal screenshots

  Only RGBA8 (32-bit color) games are supported, no known HDR or 10-bpc OpenGL
    games exist to test on. SK will be adding HDR support to GL, so this will
      change in the future!

  Special Notice for Steam Games:
  ===============================

    Steam screenshot integration may have automatically disabled itself in
      OpenGL games previously run using an older version of SK.

    > Consult the Screenshots section of the Control Panel to re-enable.


21.11.22
========
 + Fixed Deadlocks Caused by OpenGL Shared Context Deletion in Yuzu / Ryujinx
 + Added Sync Interval Clamping, to prevent games from using fractional-rate
     VSYNC instead of a proper framerate limiter.

     Fractional-rate VSYNC disables VRR, a SyncIntervalClamp of 1 will fix
       VRR issues in many games. It is set to 1 by default in these games

         * Forza Horizon 5,  Halo: Infinite,  NieR: Automata / Replicant

       [Render.FrameRate]
       ClampSyncInterval={-1=Unchanged|Maximum Presentation Interval}

21.11.21
========
 + Fixed RawInput Mouse performance at extreme polling rates (i.e. 8 kHz) by
     ensuring games do not sample the same RAWINPUT packet more than once.

   Duplicate processing has very high overhead and was leading to stutter in
     many games, if they need to see duplicate data for some reason they will
       hit SK's input cache now instead of increasing system lock contention.

21.11.20
========
 + Full input support for Halo: Infinite and other buffered RawInput games
 + Fixed issues with unicode path truncation when renaming game profile
     directories using localized titles in 32-bit builds

21.11.19
========
 + Added checkbox to turn on FCAT visualization bars in Latent Sync config
 + Added keybind to toggle FCAT visualization bars (not visible by default)
 + Reduced info shown in Latent Sync config when 'Advanced' tab is not open
 + Removed a few APC queue scheduler assertion messages when I/O Completion
     Status codes are returned but alertable waits are not enabled

21.11.17
========
 + Added support for Forza Horizon 5 and Halo Infinite

    >> For Halo Infinite, use a gamepad to control SK's UI

21.10.30
========
 + Added new Latency Statistics to Framepacing Widget (PresentMon-based)
 + Fixed OpenGL Pixel Unpack Buffer issues in Yuzu that prevented SK's UI
     from rendering correctly

21.10.24
========
 + Improved locale-specific key name support in some ImGui menus

21.10.23
========
 + Added support for GL_ARB_clip_control so that SK's UI is not rendered
     upside down and inside-out in many OpenGL-based emulators

21.10.22
========
 + Added VSYNC options to the Display menu in OpenGL and Direct3D9
 + Added warning in Reflex config if attempting to apply Latency modes on
     a Secondary monitor (framerate will be wrong among other things)
 + Fixed a Windows Defender deadlock when it tries to inject MpDetoursCopy...
    and the Steam Overlay has crashed while holding the DLL loader lock

21.10.21
========
 + Added right-click option to framerate limiter slider w/ pre-computed
     fractional refresh rate limits for optimal fixed-refresh pacing
 + Improved framerate limiter consistency at framerates > 200 FPS

21.10.20
========
 + Fixed Multimedia Class Scheduling in Framerate Limiter
 + Added support for XInput 1.1 and 1.2
 + Battery info now available for Xbox controllers in Steam Input-only games
 + Added NVIDIA Reflex "Nothing But Boost" mode to access the power setting
     without any of the latency-related features :)

21.10.18
========
 + Improved signal timing debug accuracy in framerate limiter
 + Correctly re-position secondary monitors when changing primary
 + Added feature to turn X360 controllers off by clicking their battery icon
 + Fixed null termination issues in paths combined with leading slashes

21.10.16
========
 + Added button to Display menu to make the active monitor the primary monitor
 + Fixed keybind for moving game windows to the primary monitor

 + Fixed a few performance issues in Steam Input; you are still recommended to
     always disable it per-game in Steam games
 + XInput Placeholders will work when Steam Input is trying to break things if
     "Rehook XInput" is enabled

21.10.15
========
 + Added DLL cleanup for software that invokes TerminateProcess (...) on itself
 + Added option to bring SKIF to the foreground when a game exits

    >> Enable this per-game by setting :

         [SpecialK.System]
         ReturnToSKIF=true

       -->  To apply this for all games, add it to Global\master_SpecialK.ini

21.10.13
========
 + Optimized wireless gamepad connect / disconnect
 + Re-enabled XInput placeholders for hot-swapping
 + Added gamepad battery meter to framepacing widget if PresentMon is inactive

 + Added native SteamInput bypass to poll/block gamepad input using XInput 1.1
 + Changed CBT hook removal / signal order during injection shutdown

21.10.12
========
 + Updated FAR to v 0.10.2

   - Fixed Camera Mod compatibility; only adjust timing for uncapped framerates

21.10.11
========
 + Added XInput battery level indicator to control panel and framepacing widget
 + Added XInput activity indicator to denote which gamepad(s) a game is polling
 + Detour all XInput 9.1.0 / 1.3 software through 1.4 for more reliable hooking

21.10.08
========
 + Fixed Far Cry 6 setting HDR metadata even in SDR, causing incorrect colors

21.10.07
========
 + Fixed Global Injection for Ubisoft games installed to Ubisoft Game Launcher\
  * Auto-blacklist rules for launchers now apply to executable names, not paths
 + Removed various D3D12 SwapChain settings
 + Fixed UTF-8 encoding issues in whitelist/blacklist files

21.09.25
========
 + Added default settings for Tales of Arise to auto-fix resolution issues

21.09.19
========
 + Changed Alt+F4 handler so that Bypass w/o Catch will terminate
     immediately.

21.07.23
========
 + Fixed a bug that might cause NvAPI to deadlock when checking G-Sync
     in 32-bit D3D9 games when the Steam client crashes


21.07.22.E
==========
 + Updated FAR to v 0.10.1

   - Fixed FPS limit when using gamepad input in menus
   - Added 60 FPS cap to cutscenes


21.07.22.F
==========
 + Updated FAR to v 0.10.0

  - Arbitrary framerate support added, just set SK's framerate limiter to
      whatever you want.

      A 60.0 limit will be applied in game menus, but gameplay works > 60

    * If you set the limiter while in a game menu, you can exceed 60 FPS
        in menus. Avoid doing that :)


21.07.22
========
 + Added configurable keybinds for moving monitors and toggling HDR
 + Added option to control whether monitor preferences are saved or not

 + Unless forcing Borderless Fullscreen or Centered window mode, game
     requested resolution changes will happen on whatever monitor they
       ask for

    >> Always force Borderless + Center/Fullscreen if you want a game to
         remain on a specific monitor

 + Fixed issue preventing users from moving bordered windows


21.07.21
========
 + Updated FAR to v 0.9.2

   - Fixed incorrect detection of Steam 2021 version for users who are not
       using the default SteamApps\common\ install path
   - Re-implemented Global Illumination minimum light volume coverage


21.07.20
========
 + Games that use D3D9 for Video Playback (i.e. Persona 5 Strikers) will
     no longer have their D3D9 render activity mistaken as the game's
       primary render API
 + Fixed issues with application switching not changing foreground window


21.07.19
========
 + Updated FAR to v 0.9.1

   - Fixed incorrectly ordered resolution list
   - Integrated emoose's LOD patch for Steam 2021 builds

 + Fixed PresentMon session management after abnormal game termination
 + Fixed unclean DLL unload if games shut down SteamAPI before SK's
     callback rate calibration loop finishes

 + HDR widget's CIE chart updates in realtime when switching monitors
 + Optimized display mode updates when moving a game between monitors
 + G-SYNC capabilities (in D3D9/11) update when games switch monitors


   -(  Multi-Monitor G-SYNC Survival Guide:  | Secondary Screens | )-

   >> A SwapChain resize is necessary for Direct Flip optimization to
        kick-in and grant "Hardware: Independent Flip" for VRR.

      If G-SYNC refuses to engage, try triggering a game's resolution
        change functions (e.g. gfx settings or Alt + Enter).

     (*) 1:1 scaling between window and desktop resolution is needed.

   - Failing all else, apply a 'PreferredMonitor=..' override in SK's
       INI and restart the game to maximize secondary-monitor VRR
         success on systems w/o MPO (Multiplane Overlay) support.


21.07.18
========
 + Updated FAR to v 0.9.0 and added FastLoad mode to Steam 2021 version

    >> Please delete FAR.ini for correct framerate behavior

   Framerates above 60 FPS are still not supported, so ensure the
     limiter is set to 60.0 in SK's control panel


21.07.17
========
 + Updated FAR to v 0.8.6 (replace QLOC limiter with SK limiter)
    >> Still must run at 60.0 FPS; SK has less latency / stutter
 + Added support for parsing Steam's new (July 2021) libraryfolders.vdf
 + Added support for "Sleepless Render Thread" in engines that use
     more than one thread for SwapChain presentation


21.07.16
========
 + Added new console variables to control the game's active monitor:

    Window.PreferredMonitor (saved in INI)
    Window.Monitor          (temporary)

    Macros to move the game window between monitors (without saving):

        [Macro.Monitor]
        Ctrl+Alt+Shift+Left=Window.Monitor --
        Ctrl+Alt+Shift+Right=Window.Monitor ++

+ Added option to assign game window to primary display

    ( PreferredMonitor=-1 )

 + Fixed mouse cursor containment when window moves to a monitor on the
     left of primary
 + Fixed command console input processing when game window is not active

 + Added option to restrict resolution choices (in D3D11/12) to specific
     refresh rates ( [Render.DXGI] MinRefresh=..., MaxRefresh=... )


21.07.12
========
 + Fixed compat issues between REFramework, RTSS, SK and Steam Overlay
     (D3D11On12 overlays mixed with native D3D12 overlays, ugh!)
 + Removed the bits setting from NVIDIA dithering options, SK will pick the
     correct value for you :)
 + Added an option to restart the current game to SK's 'File' menu.
 + Reverted texture changes temporarily because they cause problems with
     deleting / dumping textures on load in D3D11.


21.07.11
========
 + Monitor selections from the Display menu are now stored persistently and
     re-applied every time the game starts

       (see: "Window.PreferredMonitor"; 0 = No Preference)

 + Changed DPI scaling override to only write AppCompat flags to the system
     registry if the game was not natively DPI aware to begin with


21.07.10
========
 + Various fixes for Monster Hunter Stories 2's DXGI performance and for
     CAPCOM's annoying anti-tamper nonsense.

 + Fixed framepacing graph's center line (ideal frametime) when no framerate
     limit is active.

 + Added mobile Zen APU and Xbox Series X CPU support to CPU sensor driver
 + Added toggle for DPI Scaling (for the game only) to the Display menu

 + Added new D3D11 BltSurfaceCopy shader to convert HDR / SDR surfaces when
     engines readback an HDR retrofitted SwapChain's backbuffer (ugh!~)

    >> This primarily occurs in menu screens and when a game saves thumbnails

   There is additional overhead associated with this fix, but it will not
     affect gameplay. Readbacks are @#$% slow to begin with.

 + Command Console (Ctrl+Shift+Tab) no longer opens if Control Panel is open

 --- Texture Mod Changes ---

 + Re-enabled text metadata (i.e. format, resolution, mipmap count) files
     (<texhash>_metadata.txt) when dumping D3D11 textures to disk.

 + Dumped D3D11 textures no longer use the "Compressed_" or "Uncompressed_"
     filename scheme.   ( Metadata includes compression info )


21.07.07
========
 + Added Dithering options (to Display menu) for NVIDIA GPU users
 + Added experimental window layering feature (Full-SKreen) to Display menu

   (+) Requires Global Injection

     >> Raises game window above all non-OS windows to duplicate the
          behavior of Fullscreen Exclusive

    * This mode does not relinquish in response to Alt-Tab at the moment,
        it will eventually.

    Macro commands to control it are possible:

      Window.ZBand 1   // Default
      Window.ZBand 8   // Windows Fullscreen Optimization's Z Band
      Window.ZBand 2   // Top of Mt. Windows

 + Fixed Ninja Gaiden Sigma's SteamAPI achievement callbacks
 + Flip Model override is now enabled by default in D3D11 games
 + DPI Scaling disabled (app declared DPI Aware) in all games so that
     they have access to all resolutions
 + Fixed missing monitors in SK's Display menu for displays that
     Windows has no name for (i.e. Generic PnP).
 + Fixed input issues in Frostbite Engine games
 + Fixed Source Engine games crashing when WM_NULL is received

 --- Windows 11 Stuff ---

 + Added support for IDXGIFactory6 and IDXGIFactory7 to debug log
 + Added support for DXGI Factory caching for ...6 and ...7
 + Fixed overrides for SwapChains created using IDXGIFactory7


21.06.09
========
 + Fixed issue in games that process WM_USER messages incorrectly (Brawlhalla)

21.06.08
========
 + Changed the 'Borderless Evo' mode to 'Multi-tasking On-Top' and removed
     requirements that it only be used in borderless fullscreen mode
 + Fixed issues with DWM compositor reporting fluctuating refresh rates and
     causing default framerate limit to be +/- several FPS of VSYNC
 + Added refresh rate info to the control panel's UI even in windowed mode,
     and handle real-time changes to the refresh rate if the window moves to
       a different monitor
 + Added per-monitor HDR toggle to control the desktop's HDR setting
 + Configuring and moving game windows between monitors now supported in D3D9;
     Display menu shares functions with D3D11/12 though HDR is meaningless.
 + Fixed framerate limit not being saved in config file
 + Correctly switch from hardware cursor to software if a game turns the
     cursor off while SK's UI was still using the mouse
 + Added better support for RGB10A2 screenshots stored in PNG (using 48bpp);
     - Alpha channel is discarded, RGB promoted to 16bpc. Artifacts gone! :)

     * For non-HDR users playing games that use 10-bpc, this is probably the
         first and only time you have been able to capture a screenshot with
           precision preserved.

    ReShade unfortunately just quantizes the original image to 8-bpc and then
      stores in a 24bpp format, same with the Steam overlay.

21.05.31
========
 + Support multiple instances of PresentMon
 + Fixed debug user privilege requirements for PresentMon integration
 + Re-enabled option for per-thread memory allocation analysis in thread widget

21.05.30.1
==========
 + Fixed potential Unity deadlock in WindowStyle Get/Set due to ... Unity.
 + Fixed XInput disabling itself when 'Render in Background' is disabled
 + ImGui's virtual mouse cursor (kbd / gamepad input) no longer moves the
     cursor if the Windows cursor is outside of the game's window
 + Improved handling of games that destroy and re-create the render window

21.05.30
========
 + Improved 'Borderless Evo' mode to suppress popups already covering the
     game window just by turning the Window Layering mode -ON-

 + Added foreground window spoofing to 'Borderless Evo' mode to prevent
     DXGI / Driver from disabling G-Sync / VRR when activating another
       application's window

(?) Test: 'Borderless + Fullscreen + Continue Rendering + Borderless Evo'

 + Fixed game window activation when clicking on part of SK's overlay UI
 + Added watchdog thread to monitor hung Always-on-Top game windows

    >> A frozen fullscreen app will become alt-tabbable after ~5 seconds,
         saving a trip to the Windows Logon screen to use taskmgr

21.05.29
========
 + Experimental Window Always-On-Top Mode (Borderless Evo), improves
     Borderless Window behavior on multi-monitor systems w/ KB/M going
       to one application and gamepad to another.

 + Fixed bug that prevented PresentInterval=0 overrides from disabling
     VSYNC in D3D11/12, and that would default an override value of
       (-1) to VSYNC OFF in some engines.

 + Added VSYNC option to DXGI-based (D3D11/12) games in the Display Menu

   >> VSYNC overrides were available already, but required clumsy tweaks
        to D3D11/12 SwapChain settings.

       -( Clumsily tweaking D3D12 SwapChains is HIGHLY discouraged )-

21.05.28
========
 + Optimized per-thread memory allocation for text OSD
 + Fixed rare SteamAPI initialization race
 + Reduced thread scheduling hook overhead

21.05.27
========

 + Adds Windows Process / GPU Priority Boost features for scenarios where you
     play games using a gamepad and a fullscreen borderless window, but
       Windows gives its CPU/GPU priority boost to the application that owns
         the keyboard instead.

   Tl;Dr:  Background games (w/ Render In Background setup) get priority boosts.

 + Fixed wrong resolution settings in the Display menu
 + Fixed mode change confirmation dialog in Display menu

21.05.22
========
 + Added Crash Supression System for DRM / Anti-Debug that Deliberately
     rasies exceptions it knows the application will not handle in order
       to cause a crash ( and make it look like someone else did it :P )

   >> Safety is not guaranteed, if you opt-in game-ending crashes may
        get you far enough in the game to save and restart, or demons
          may fly out of noses and begin to delete NSFW content


    (*) This is experimental; sacrifical guinea pigs may test by setting:

            [SpecialK.System]
            EnableCrashSuppression=true ; Nasal Demons, oh boy!


     # In the current design, all crashes are candidates for suprression.

       (!) That is bad (even more than the already ill-advised feature)

        -  If this feature has any kind of staying power, it requires some
           additional configuration for supressed exception codes and code
           addresses.

       (+) Otherwise, nothing distinguishes "safe" / malicious (DRM) crashes
           from the more common "data may become corrupted if you continue"
           kind of crash.

21.05.21
========
 + Added memory (System, GPU and Texture Cache) statistics to crash logs
 + Removed duplicate resolution and refresh combinations from drop-downs
 + Mode changes in SK's Display menu now apply to the monitor the game is
     primarily covering instead of the default system monitor
 + Added optional 15 second confirmation timeout to display mode changes
 + Improved reliabiility of 'Preferred Monitor' drop-down in Display Menu
 + Improved performance in games that make redundant display mode changes

21.05.18
========
 + Improved startup reliability of Resident Evil 8 (bad engine!)
 + Enabled Legacy HID Keyboard Input in RE8 so that text input works

21.05.17
========
 + Re-wrote Text OSD and Command Console Rendering using ImGui;
     these features now work in UWP and D3D12 software

  >> This is Phase 1 of Operation CEGUI Must Die:

    CEGUI has been preventing SK from adopting newer graphics APIs, and
    it is not compatible with UWP / Windows Store software. ImGui is more
    flexible, but will take some time to re-implement things like Steam
    achievement popups.

   * Some visual differences are inevitable, but hopefully the text OSD is
     familiar enough in its new form.

 + Reduced D3D11 State Tracking Overhead for HUD Toggle in NieR Sqrt 1.5

21.05.16
========
 + Improved performance of Resident Evil 8 when changing display settings,
     it has a nasty habit of checking resolution support every frame and
       SK now caches DXGI Factories and Resolution Mode Lists until they
         actually change.

  ==> Bottom line, this saves up to 3 ms of DXGI API overhead every frame (!!)

 + Added texture mod support for NieR Sqrt 1.5
 + Added a drop-down menu in 'Display' to move borderless fullscreen windows
     between available monitors

21.05.10
========
 + Fixed DXVK issue with QueryVideoMemoryInfo returning successful HRESULTS
     for adapters that don't exist.

21.04.28
========
 + XInput UI controller slot is now determined automatically based on idle
     detection on each of the 4 possible slots.
 + XInput haptic feedback is cleared at application exit
 + XInput haptic feedback uses the UI controller slot instead of always 0

21.04.24
========
 + Improvements for mouse cursor BS in NieR Sqrt 1.5
 + Improved Sleepless Window Thread for Sqrt 1.5
 + Default most settings to optimal for Sqrt 1.5
    ( Delete your config file for best results )

  ==> Still no word on WTF is wrong with the engine's texture memory,
        it's giving wrong data to D3D11 at upload time, and D3D11 does not
          crash, however, I cannot intercept and extract any of the data.

    * Square-Enix is.... nope, I'm at a loss for words.

21.04.23
========
 + Fixed incorrect EDID display names on latest gen (360 Hz) G-Sync displays
 + Fixed incorrect EDID luminance levels reported by DXGI on some DELL displays
 + Added PresentMon capabilities to the framepacing widget to distinguish the
     myriad of different modes all calling themselves Flip Model :)

21.04.19
========
 + Fixed D3D12 API hooks not activating if users disable D3D11 API hooking
 + Reduced the number of required blacklisted executables significantly

    >> The "[SK] Hook Pacifier" thread will keep SK's injection logic idle
         in non-game / whitelisted software as originally designed, without
           causing the DLL to get stuck in UWP / .Net / Managed apps.

21.04.18
========
 + Fixed an issue where custom latency optimizations were being applied even
     when Reflex was inactive.

   >> SK has a few special tricks for Reflex + Low Latency + Boost,
        they are not suitable for use without Reflex and were causing
          frametime wobble

21.04.17
========
 + Add support for new NVIDIA Reflex feature
    (Latency Marker-trained Optimization)

21.04.16
========
 + Allow Steam achievement screenshots in D3D12 even though there is no
     popup to take a screenshot of (CEGUI unsupported).

21.03.25
========
 + Fixed Microsoft Store Yakuza game builds failing due to DPI awareness
 + Added option to wait for debugger attach after config load
 + Added option to delay Global Injection for an exact number of seconds

     [SpecialK.System]
     GlobalInjectDelay=...

  >> NOTE: Many D3D11/12 features do not work when delay loading is used.

21.03.23
========
 + Improved compatibility with NieR: Automata (QLOC)
 + Fixed a number of RTSS-related D3D11/12 SwapChain resize/create bugs
 + Added detection for third-party overlay interference in latency stats

21.03.22
========
 + Fixed Structured Exception Handling incompat. in some 32-bit games
 + Added gamepad latency tester under Input Management / Gamepad section

21.03.21
========
 + Fixed empty keybind INI entries reverting to default value on config load
 + Fixed latency markers not being clipped to control panel window bounds
 + Framerate Limiter automatically defaults to low-latency mode in D3D9/11
     games if a G-Sync compatible (and active) monitor is detected.
 + Fixed crashing in Ys 8 when hot-plugging DirectInput 8 devices

21.03.20
========
 + Fixed typo in startup version banner
 + Compatible with NieR: Automata Something Something God Edition
 + Added minimal implementation of FAR for NieR: Automata (Windows Store)
  >> Framerate uncap only, intended so you can replace limiter with SK's
       (game still needs to run at 60 FPS for game logic)
 + Added option to hide HDR support from games so they do not enable HDR

    ( [Render.DXGI] HideHDRSupport={true|false} )

   -> Use this on NieR: Automata, and then use SK's HDR features instead

21.03.19.1 (HOTFIX)
========== --------
 + Fixed Steam game profile name generation (game.exe -> human readable)
 + Removed 'Timing Accuracy' slider from Framerate Limiter; it's obsolete

21.03.19
========
 + Fixed Adaptive Sync status not updating for some users
 + Removed NVIDIA Reflex options from control panel for D3D9 / GL games
 + Added a timing chart for all of the latency markers
 + Added a latency marker for Special K's activity
 + Added input latency measurement for KB&M users

   >> Keyboard & Mouse input processing is a less reliable measure of
      latency than gamepad, since KB&M is event-driven and reads from
      these devices may happen in response to said event only to be
      processed later.

21.03.18
========
 + NVIDIA Reflex defaults to Disabled
 + NVIDIA Reflex config changes apply even if SK's limiter is disabled
 + Fixed wrong decimal units in Latency Marker summary
 + Mentioned G-Sync behavior in Reflex Mode tooltip

21.03.17
========
 + Added Desktop Resolution / Refresh config to Display Menu
 + Added Adaptive Sync info to the Framerate Limiter Advanced tab
 + Added Latency Marker Analysis to Framerate Limiter Advanced tab
     ( Requires NVIDIA hardware )
 + Lowered disk-free check before taking screenshots to 0.5% (from 3%)
 + Fixed blank HDR screenshots in D3D12 games

21.03.16
========
 + NVIDIA Reflex Configuration made Simpler
 + NVIDIA Reflex settings now stored in INI files per-game
 + Added support for HDR in D3D12 version of The Medium

21.03.15
========
 + Improved HDR Metadata for accurate sRGB retrofits and ideal black floor
 + Disabled XInput Hotplug functionality because something appears to be
     breaking it (Steam overlay? or something else?)

       >> Either way, better off without the broken feature for now.

21.03.14.Reflex
===============
 + Adds experimental NVIDIA Reflex functionality to the framerate limiter

21.03.14
========
 + Fixed missing textures in D3D11 Render Mod Tools when modified textures have
     a different number of mipmap LODs than the original texture
 + Fixed a bug that occasionally added borders to borderless games at startup
 + Removed "(16-bit)" from the scRGB button in the HDR widget to avoid confusion

21.03.13
========
 + Improved Framerate Limiter accuracy in games that change x87/SSE2 FPU precision
 + Fixed an issue in Koei Tecmo games that detects Alt-Tab as gamepad disconnection
 + Fixed loading texture mods from sub-directories of `inject\textures\...`

21.03.12.1
==========
 + Fixed EDID issues in D3D9 and OpenGL games
 + Fixed parsing of corrupted EDIDs, and stopped using NvAPI to get display EDID
 + Improved support for late injection into D3D11 games; HDR needs early inject

21.03.12
========
 + Fixed input issues with Background Render mode and applications that use
     child dialogs (i.e. 'Confirm Exit' message boxes)
 + Cleaned up Help menu in Control Panel with relevant links
 + Removed branch information and referenced SK's Wiki in the startup banner

21.03.11
========
 + Fixed crash in NieR: Automata due to DXGI factories
 + Fixed various issues with Ansel in D3D11 games

21.03.10
========
 + Added real-time HDR on/off state detection
 + Added per-monitor HDR support
 + Added warning when HDR is enabled but the game's window is on a non-HDR monitor
 + HDR widget remains functional (to help disable SK HDR) if SK HDR is enabled on
     a non-HDR monitor. It will vanish as-per original design if SK HDR is disable

 + Added option to FORCEFULLY disable Ansel (NvCamera{64}.dll), since NV no longer
     honors the per-game driver setting that was designed to do this.

     [NVIDIA.Bugs]
     DisableAnselShimLoader={true|false}

21.03.06
========
 + Added HDR support to RTSS overlay
 + Added independent luminance control for Discord and RTSS to SK's HDR menu
    >> These options will only show up if said overlay is detected actively rendering

21.03.05
========
 + Added HDR support to Discord overlay; re-uses Special K's preferences for Steam
     overlay luminance. This only applies in D3D11 at the moment.
 + Removed Control.exe from global injection blacklist; it's no longer a launcher

21.03.02
========
 + Add checks for redundant calls to IDXGISwapChain::ResizeBuffers (...), to reduce
     performance loss in Watch_Dogs: Legion
 + Automatically disable caching textures without mipmaps in all Unity Engine games

21.03.01
========
 + Fix HDR turning off when games examine DXGI containing outputs (monitors) that
     are SDR... (i.e. multi-monitor mixed SDR/HDR situations)
 + Workaround issues with Cyberpunk 2077's Cyber Engine Tweak overlay

21.02.15
========
 + Gal*Gun Returns Resolution Fix: Fixes internal render resolution using the value
     of OverrideRes= in SK's INI (can be set from cpl, but requires a game restart).

21.02.09
========
 + Nioh 2 needs "Sleepless Window Thread" turned on in SK's framerate limiter to fix
     its framepacing with "Effects: High"; option enabled by default now.
 + 32-bit version of SK now built with same compiler version as used in 21.02.05+

21.02.05
========
 + Workaround new Visual C++ compiler bug that breaks double-precision FP math in x64
  ( That bug was responsible for incorrectly sized UI windows and other things )

21.01.30.1
==========
 + Default all Yakuza games to Borderless Fullscreen + Flip Model
 + Disable game's Alt-F4 handler in all Yakuza games because it can deadlock
 + Remove Always-on-Top Window style from all Yakuza games
 + Force DPI Awareness ON in all Yakuza games the correct way
 + Disable buttons on CPU widget when the main control panel is not open

  >> For users unfortunate enough to be playing a Yakuza game:

    * Press and Hold Ctrl + Shift during game startup and use SK's AppCompat
        [ Reset Config ] function the first time you use this version.


21.01.29
========
 + Yakuza 3, no surprise, incorrectly counts resource references
 + Fixed HDR / Flip Model override support in games that create 8x8 SwapChains
     (i.e. The Elder Scrolls Online)

21.01.28
========
 + Fixed D3D11 performance issues caused by 20.12.29's D3D11On12 safeguards
 + Added ability to customize HUD toggle keybind (refer to Global/osd.ini)
 + No longer display latency stats for non-Fullscreen / Flip Model SwapChains

21.01.27
========
 + Correctly handle D3D11 texture mods that change format: BC3 -> BC7
 + Improve support for D3D11 texture mods for textures with partial mipchains

21.01.11
========
 + Added Option to Clamp Negative Texture LOD Bias to 0 in D3D9

20.12.30
========
 + Added option to disable screenshot sound
 + Added disk free space check to screenshot capture
 + Added option to copy screenshots to clipboard
 + Reduced volume of screenshot sound
 + Added outlines to SK's UI elements

20.12.29
========
 + Added support for switching between D3D11/D3D12 on-the-fly in Serious Sam 4

  >> Should assist with D3D11On12 and Ansel compatibility in normal games that
       don't support this bizarre render API hotswap feature

 + Fixed framerate uncap in NieR: Automata

20.12.28
========
 + Disabled auto-update checks on all game-specific plug-ins built-in to SK

20.12.27
========
 + Fixed uPlay Overlay Support in D3D12
 + Fixed UE3 infinitely shrinking windows when removing borders
 + Disabled Haptic Feedback unless using Gamepad Input in the control panel
 + Alt+F4 Capture only provides a confirmation dialog if the game would
     otherwise block Alt+F4 functionality, or SK's control panel is open.
 + Fixed Mouse Input Capture in Dying Light
 + Added Screenshot Sound
 + Added HDR Screenshot support to D3D12

0.12.0:
-------

 + Added preliminary D3D12 Support

  >> Has compatibility issues with some non-native D3D12 overlays
       (i.e. RTSS and Steam), but works correctly with native D3D12
         overlays (i.e. Discord)

 + Temporarily disabled Tobii Eye Tracking features (and its Widget)
 + Disabled D3D Shader Compiler Hooks (e.g. nop D3DStripShader)
    >> Tends to break D3D12 engines that use persistent shader caches

0.11.0.52:

 + Added HDR minimum luminance (black level) to tonemap for scRGB
 + Added workaround for Ogre games that load CEGUI before Special K does
 + Fixed Racing Wheel Input not responding when SK hooks DirectInput 8
 + Added sRGB Bypass Mode for SDR games that need sRGB removed for Flip Model

  >> Games that used to be too dark can now use Flip Model

 + Changed HDR Display Name Query to use NvAPI on compatible systems to
     correctly map DXGI Display Handles to EDID Display Names
 + Added HDR Widget option to control "Implicit sRGB" gamma processing,
     this is needed for many Unity engine games that would otherwise be
       too dark to do any kind of processing on.

 + Fixed Mute in Background Mode when combined with "Continue Rendering."
 + Fixed Background Rendering Mode in many games
 + Added VRAM Usage to HDR Remastering Checkbox Tooltips
 + Added the same Yakuza reference counting fixes needed to keep 0, Kiwami 1 and
     Kiwami 2 from crashing to Like a Dragon -- somebody fix the damn engine (!!)

 + Added button to Reset HDR Presets to HDR widget

  >> Later versions will add buttons to import and export presets from previously
       configured games

 + Fixed widget slider / dropdown behavior so that it blocks mouse input to game
 + Added DXGIGetDebugInterface1 (...) to SpecialK{64|32}.dll for games that need it

 + Corrected near-black noise when processing sRGB LDR images for HDR tonemapping
  --------------------
  * Care must be taken when using sRGB gamma if the input image may have negative
      color values, because sRGB gamma's x*x*x property preserves negative values.
  --------------------
 + Added support for HDR10 image processing so that SK's HDR widget can control
     games with official HDR support now (usually does a better job :P)

   >> When running a game with official HDR support, most are HDR10 and you
        will need to run SK's HDR widget in HDR10 Passthrough or Filmic mode,

        Expect to target ~10,000 nits because games that use HDR10 don't
          actually bother to encode luminance levels into the signal.

 + Boosted black level when using ACEScg tonemap mode for more shadow detail

 + Fixed issues preventing Ys8 from starting (again...)
 + Fixed a bunch of anti-debug problems in various Ubisoft games

 + Added more details to latency monitoring in framepacing widget

 + Framerate Limiter now defaults to Screen Refresh if no limit is set,
     for the framepacing widget's scale

 + Added Gamut Overshoot Visualization
 + Added HDR Overbright Bit Visualization

 + Added support for loading 'default_{SpecialK|<api_name>}.ini' from
     Documents\My Mods\SpecialK\Profiles\<game_name> and
     Documents\My Mods\SpecialK\Global\

    >> These will be loaded the first time you launch a game, or after
         resetting the game's config. Global is loaded first, then profile.

 + Fixed uninitialized D3D11 State Block pointer in Thread Local Storage
 + Fixed D3D11 RenderTargetView HDR Format override for 2D Array Textures
 + Fixed GetProcAddress (...) caching that causes input-related issues in
     games that use the wrong XInput DLL for the system they are running


0.11.0.51:

 + Fixed Tales of Vesperia Bug Regression in 0.11.0.48+
 + Removed DXVK compat. hacks for DXGI SwapChain overrides

  >> The only known remaining oddity when you combine SK w/ DXVK is that SK's
       framerate limiter must be configured with busy-wait behavior
         ('Timing Accuracy' Slider: 100% CPU) or it cannot throttle Vk acquire.

 + Help menu no longer links to Steam; it now points to discourse.differentk.fyi
 + Removed accidental inclusion of dgVoodoo2 in SpecialK.7z; if you want/need it,
     consult Google ('shitgoogle' or whatever Dege is referring to it as now, lol)


0.11.0.50:

 + HDR Preset Default Keybinds changed to Shift+F1, Shift+F2, Shift+F3, Shift+F4
 + HDR Preset Keybindings are configurable in-game by clicking on the binding text

 --

 + Unreal Engine needs to STFU when Present (...) returns DXGI_ERROR_INVALID_CALL,
     it is -not- a crash and is completely recoverable by calling ResizeBuffers ().

    >> SK will now lie to Unreal Engine and replace DXGI_ERROR_INVALID_CALL with
         DXGI_STATUS_MODE_CHANGE_IN_PROGRESS to prevent it from self-destructing
           after Alt-Tab when Fullscreen Flip is enabled.

  + Disabled %USERPROFILE% environment variable expansion in FFXV because it does
      not properly handle paths containing multi-byte characters.


0.11.0.49:

 -------------------------------------------------------------------------------
   ( Flip Model + Fullscreen Exclusive is now supported for all D3D11 games! )

  This means that HDR can now be used in Fullscreen Display Modes, with Refresh Rate
    overrides and (on NV hardware) your choice of signal encoding (e.g. YCbCr 4:4:4).

    Refer to the Display menu for more details
    ==========================================

      >> NOTE: Not all of the Signal Encodings listed will work for your current
         Refresh Rate (NvAPI -SUCKS- at enumerating Signal + Refresh Support)

  + A ton of tooltips have been added to the D3D11 SwapChain and Framerate Limiter
      sections, mostly amounting to "Reduces Input Latency."

    * Tooltips will be improved later, for now pay attention to "Low Latency Mode"
        and "Drop Late Frames" in the Framerate Limiter config section.
 -------------------------------------------------------------------------------

 - Sleepless Window / Render Thread were accidentally enabled by default in 0.11.0.48.

 + Removed Fallout 4 and Dark Souls 3 Flip Model plug-in options, these games will
     use the standard SK flip model settings now instead of requiring special config.

 + Increased number of partitions addressable in Disk Monitoring OSD from 16 to 128.

 + Unified IDXGISwapChain::Present (...) and IDXGISwapChain1::Present1 (...)
     code for better compatibility with Chromium-based games (i.e. CrossCode) and
       video players (i.e. VLC).

     >> Steam Overlay does not hook/wrap IDXGISwapChain1::Present1 and cannot count
          frames or even figure out when to draw in software that calls Present1 (...).

      @  (!!)  VALVE might want to do something about this at some point :P


0.11.0.48:

 + Added "Drop Late Frames" (DXGI Flip Model) to allow rendering at rates > Refresh
    ( Without Triple-Buffering's normal Latency ); Default = ON
 + Added "Limiter Enforcement Policy" to allow users to pick between smooth / low latency
 + Removed references to "Adaptive Tearing," because the feature was removed a long time ago.

 + Added a new "Ultra Low Latency" mode to D3D11 SwapChain settings if you turn
     on Flip Model and engage Special K's Framerate limiter.

   >> This limiter mode has the potential to cause stuttering if your system is
        barely hitting its framerate target (which needs to be Refresh Rate)

 + Waitable SwapChains have no configurable duration anymore, they are ON or OFF.
 + Fixed issues that prevented using Flip Model in Cross Code and Disco Elysium


0.11.0.47:

 + Fixed Missing +/- N.M Frames stat in the Framepacing Widget
 + Fixed DXGI Budget Tracking Thread (VRAM stats) if [API.Hook] d3d12=true
 + Fixed Ys8 when HDR is enabled and game attempts to go Fullscreen Exclusive

 + Add a new "Widget Flash" keybind that briefly shows and then hides a widget

     >> All widgets have a binding for this feature and a configurable duration.

 + Do not HDR remaster MSAA RenderTargets

     >> MSAA Resolve is complicated if the source format has been changed by SK,
          it is not impossible, but more work than I have time for right now.

0.11.0.46:

 + Fixed unsafe exception handling in Remedy's (Control) SteamAPI code to prevent crashing
 + Re-enabled Staging D3D11 Texture Mods
 + Added Effective FPS to Framerate Limiter Debug in the Framepacing widget

    >> Right-click the widget while the Control Panel is open to access its config menu,
         the debug view is a check-box in the bottom-left corner; setting is not saved.

 + Slightly tweaked framerate limiter's clock skew recovery for less apparent clock resets
   ( Less "wonkiness" when you are running _massively_ below your TargetFPS )

 + Added forced Windowed Mode when engaging HDR
 + Disabled 11:11:10-bit FP HDR remastering by default
     >> This leaves only 10-bit render passes promoted to full FP16 by default
 + HDR widget now defaults to CIE XYZ for In/Out Colorspaces
 + HDR widget displays new text explaining DCI-P3 and Rec2020 Colorspaces are for debugging only

0.11.0.45:

 + Fixed Windows key blocking behavior in games that use RawInput to poll the keyboard
 + Fixed keyboard disconnect behavior in Resident Evil 3
 + Added tooltip explaining the purpose of CPU core count spoofing to Framerate Limiter > Advanced


0.11.0.43:

 + Improved performance of D3D11 Render Mod Toolkit in games with many RenderTargetViews
 + Reduced state tracking overhead for "DisableIfTexture=..." D3D11 shader mods significantly

 + Temporarily disabled support for modding D3D11 textures that use Staging uploads

   >> Engines that use Staging data uploads most often == Unreal + Unity.

 + Gamepad Input Blocking properly queries and fills-in neutral/deadzone values for analog axes

   >> Prevents issues in DirectInput games where a game's menu constantly scrolls while SK's
        control panel is using the gamepad

 + Found and killed Persona 4's crash handler so that Special K's can do something useful instead.

 + Added Denuvo anti-debug workarounds for a number of NtDll and Kernel32 thread / handle APIs

   >> Much less of a hassle debugging broken Denuvo games during startup :)


0.11.0.42:

 + Fixed false-positive shader resources showing up in D3D11 Render Mod Toolkit for many 32-bit games
 + Added memory limit checks prior to taking enhanced screenshots in 32-bit D3D11 software
 + Added Large Address Aware patch detection for Persona 4

 HDR stuff

 > HDR Widget now defaults to a swapchain with at least 4 backbuffers and 5 device latency for better
     frame pacing.
 > HDR Widget no longer overwrites existing swapchain tweaks, provided they satisfy 1)

 Project-wide Odds and Ends

 > In order to reach a larger audience, Special K and all associated tools and DLLs will no longer be
     compiled targeting AVX CPU instructions. I still do not intend to support Windows 7, but will
       attempt to support users with pre-AVX CPUs.


0.11.0.36:

   -----------------------------------------------------------------------------------------
 + Class Leading D3D11 FPS Limiter Pulls Ahead

   Implemented flip model glitch recovery to eliminate microstutter in even the most stubborn
     engines (i.e. Tales of Vesperia). Many scenarios that used to require the framerate limiter
       be turned off and then back on to get a flat framepacing graph have been completely eliminated.

    * You should always turn Special K's framerate limiter on in D3D11 games for lowest input latency
      and smoothest frame pacing.

    * To get the most out of SK's framerate limiter, you need to use flip model.
         Refer to the following recommendations for best framerate limiter performance.

    Recommended SwapChain Settings
    ---------------------------------------
    [✔️] Use Flip Model Presentation
      Presentation Interval.: 1 (refresh)
      Backbuffer Count......: 4 (buffers)
      Max. Device Latency...: 5 (frames)
    [✔️] Waitable SwapChain
      Maximum Wait Period...: 200 (ms)

    (*) Run all games in borderless window mode, Fullscreen is actually a performance bottleneck
          versus Flip Model w/ SK's limiter.

   -----------------------------------------------------------------------------------------

   In related news, Special K's limiter compared to the competition. Those results pre-date the advances
     made in 0.11.0.36, but show that Special K's framerate limiter was already leaps and bounds ahead of
       the alternatives.

   >> https://www.reddit.com/r/allbenchmarks/comments/gohkn9/specialks_frame_rate_limiter_review_dx11_based/


0.11.0.30:

 + Fixed HBAO over-darkening many games

 + Fixed games not exiting during SteamAPI shutdown
 + Fixed memory leaks in some Unreal Engine 4 games
 + Added support for Flip Model to NieR: Automata
 + Added support for HDR to NieR: Automata

 + Added HDR widget options to control precision of non-HDR render passes

     >> 10- and 11-bit passes are expanded to 16-bit by default
     >> Enabling may reduce banding artifacts or produce more dynamic highlights

 > These changes require running SKIF (Special K Injection Frontend) once to update Special K; if you have
     Global Injection to start with Windows it will continue to use the old version until you launch SKIF.


0.11.0.28:

   -----------------------------------------------------------------------------------------
 + HDR retrofit should now work with ALL D3D11 games that support Flip Model (NieR does not)

     NOTE: For Unity Engine games, pay attention to the framebuffer (top of control panel)
             before turning HDR on.

          >> If the game's original framebuffer was (sRGB), then for proper HDR color,
               you must use "Unaltered" for both IN and OUT in the HDR widget and the
                 gamma slider will require more adjustment than other games.

      * For all other games, "CIE XYZ" is always preferred for IN and OUT.

          The other colorspace options are there to hammer out scenarios where neutral
            white objects ("paper white") appear warmer (red) / cooler (blue) than expected.
   -----------------------------------------------------------------------------------------

 + WinRing0 Driver can now be installed / uninstalled without restarting games.

   >> Please Note:
      ===========

        Special K's involvement in Kernel Ring 0 is optional and limited, by design, to
          reading PCI/ACPI and Model-Specific CPU Registers for more advanced hardware
            reporting.

     (Currently:  Thermals, Energy and Precise Clock Rate in CPUs, with no plans
                          for any additional custom driver code any time soon).

       * I take code running in kernel-mode _very_ seriously, and WinRing0's nothing to worry
           about, since it was designed specifically for this use-case and the driver is used
             by nearly every Open Source hardware monitoring software package on Windows.

 + Fixed wrong API auto-detection in many D3D11 games
 + Fixed missing OpenGL API name in top of control panel for OpenGL 3.2+ games

 + Added reference counts to RTVs, Textures and Shaders in D3D11 Render Mod Toolkit
 + Added support for visualizing TYPELESS resources to the D3D11 Render Mod Toolkit,
     type priority = ( UNORM, FLOAT, SNORM ). No sRGB or INT datatypes can be visualized.

 + Added Trails of Cold Steel's config tool to injection blacklist to prevent crashes
 + Improved support for "Continue Rendering" mode (see: Window Management) to block  KB / M
     while still passing gamepad input (this is intentional) when game lacks keyboard focus.
 + Fixed various SteamAPI issues caused by Valve's redesign of the Flat API
     (Flat API = Language bindings for C# and other similarly awful languages :P)
 + Fixed CPU Widget init race condition with SteamAPI that was causing intermittent crashes
 + Added Framerate Limit Enforcement Site as a control panel option
     >> This is not saved in the INI, default=4 and the only reason to try alternates is for
          testing the limiter's effectivness in non-D3D11 games; 0 and 1 work well in D3D9.

Recommended SwapChain Settings for HDR:
---------------------------------------
  [??] Use Flip Model Presentation
       Presentation Interval.: 1?(refresh)
       Backbuffer Count......: 3?(buffers)
       Max. Device Latency...: 4?(frames)
  [??] Waitable SwapChain
       Maximum Wait Period...: 200?(ms)


0.11.0.3:

 + Fix issues in games that use PhysX (i.e. FFXV, Arkham Knight)


0.10.2.1:

 + Fixed shell32.dll hook issue in Steam client that prevented games from restarting


0.10.2:

 + Ansel is automatically disabled in games that are whitelisted (many of them should not be).

     Although I cannot reproduce any compatibility issues whatsoever with Ansel, this was the
       most economical approach to solving rampant reports of Ansel crashing games.

    -- If, like me, Ansel doesn't cause any compatibility problems on your system, you may
         re-enable it from the Help menu.

 + Memory performance data acquisition no longer uses WMI

 + Added a Compact Working Set button to the thread widget, to reduce memory overhead;

     >> The ideal use-case would be prior to switching applications to Chrome or other memory
          intensive applications.
      > I may add an option to automatically do this on alt-tab in future versions

 + Added in-game link to PCGamingWiki for any Steam game (see Help menu)
 + Added resolution scaling preferences in terms of screen % to custom ReShade
 + Added an optional background framerate limit that applies when running in the background

 + Changed name of [SK] Primary Render Thread to [GAME] ... to clear up misconceptions that it
     is a thread created, owned or managed by Special K.

 + Fixed incorrect HDR detection in some Unreal Engine 4 games
 + Fixed buffer overrun when fetching > 384 friend achievements
 + Fixed mouse cursor auto-hide feature not actually auto-hiding in most games
 + Fixed achievements not unlocking in A Plague Tale: Innocence and possibly other games
 + Fixed issue preventing EULA from showing on screen if an assertion popup was triggered first
 + Fixed unresponsive text input in Special K's console when (to-game) input blocking is enabled
 + Fixed incorrect API auto-detect in many games if run for the first time with no config file in v 0.10.1
 + Fixed some games treating disabled keyboard input as though buttons were being held down constantly

   >> This problem only affects whether a game draws KB&M or Gamepad icons, actual gameplay is unaffected.

    > For future developer reference, if a game calls GetKeyState (...) and you wish to block it,
        the proper way to do this is to cast KF_UP to SHORT and then return it.

 + Refactored a ton of code to modern C++17, from what had been mostly C++ Duct Tape compliant code.

   >> This is an ongoing process, but the codebase needs all the new language features that
        I have been neglecting or it is going to collapse under its own unmanageable weight
          at some point.


0.9.24.x:

 + Changed MHW plug-in to write-out all config values on first load
 + Fixed Constant Buffer for alt. tonemaps writing to wrong memory addr.
 + Fixed the INI parameter names in MHW plug-in
 + Added alternative tonemap options to MHW
 + Fixed CEGUI so that it renders to an HDR target (text OSD works again)
 + Added HDR Luminance control for the Steam overlay
 + Removed Inject Metadata button from scRGB mode
 + Set range of HDR luminance sliders to monitor's reported capabilities
 + Added HDR luminance setting persistence for ImGui
 + Added tooltip on CPU widget if WinRing0 is not installed
 + Added June 2010 DX Redistributable Check _BEFORE_ loading CEGUI

  + Added RenderTarget details to the Live RT View in D3D11 Mod Tools;

    * Also added support for displaying rendertargets that don't have
        Shader Resource bind flags (i.e. the swapchain backbuffer)

  + Added CPU driver for AMD Zen and (most) Intel chips Pentium 4 or newer
   >> Run SKIM64 as admin once to install this driver
   >> Use the CPU widget to see these stats

   + Added powerscheme options, stored per-game, to control the Windows
       Power management engine -- you can setup a per-game preference by
         clicking the scheme name in the CPU widget.

 + Changed the formatting of crash logs
 + Fixed mousewheel scroll behavior in ImGui
 + Added HUDless screenshots to Monster Hunters World and Yakuza 0
 + Fixed several issues with "Smart Capture" screenshots in D3D11


0.9.23:

   ( D3D11 ReShade and various mod features for D3D11 games may not work
       correctly starting with 0.9.23, I will work to get that resolved as
         quickly as I can )

 + Added CPU clock rate to CPU performance widget; will add core parking and
     thermal throttling details in a future release for Windows 10 users.

 + Improved recursive file search (SteamAPI DLL location) performance
 + If SpecialK32.pdb or SpecialK64.pdb are not present in a local install,
     SK will attempt to load these form Documents\My Mods\SpecialK\...
 + Sped up Special K boot procedure pretty singificantly
 + Tweaked inefficient Texture Residency driver queries
 + Fixed situations where SK would fetch vertsion info from GitHUb multiple times
 + Fixed sRGB -> RGBA buffer override for Unity games to use flip model
 + Fixed various inconsistent ANSI / Unicode text issues in Unity (debug log)
 + Added CPU core spoofing to the framerate limiter for broken Unity games

 + Added HDR luminance control to Special K's OSD so you can see it in an HDR game :P


0.9.22:

 + Added render-ahead option to framerate limiter to tradeoff latency vs. rate accuracy
 + Fixed achievement popup showing up twice in Smart Capture mode
 + Various D3D11 Deferred Context optimizations
 + Added button to rebalance thread -> CPU assignment to the Threads widget
 + Added data options to the GPU widget's config menu
 + Added Fan RPM to GPU widget
 + Config files only write to disk if they are changed now


0.9.21:

 + New "Smart Capture" Mode for Steam Screenshots
 ================================================

  + High-performance screenshot capture code that does not cause games to hitch

   *) Compress lossless .PNG screenshots with or without Special K's OSD

    >> Steam cannot store .PNG screenshots, so any lossless screenshots are stored
         separately and you can manage these files using SK's control panel.

   *) Set the default Steam screenshot behavior to show/hide SK's OSD
   *) Take HUDless screenshots in D3D11 games (not finished)
   *) Compresses the JPG image imported to Steam using a slightly more advanced
        compressor for better image quality.

  ** All of these features are orders of magnitude faster than the Steam overlay's
       built-in screenshot code is! Use them all and still get better performance :P

    ---------------
  @ Current support is limited to D3D11 with no on-screen MSAA, sRGB or HDR framebuffers
    ---------------


0.9.20:

 (.2): Fixed WMI Memory Perfmon not using the correct PID
 (.2): Added experimental SteamAPI callback thread-sync avoidance for AC:Origins
 (.2): Fixed SteamController issues in Nioh
 (.1): Added proper (keyboard layout-aware) tooltips for prev/next texture
         list in D3D11 render mod toolkit.


 + Added D3D11 Constant Buffer injection for Vertex/Pixel/Geometry/Hull/Domain shaders
  >> Allows the manipulation of a game's material system in real-time in the mod tools

  @ Compute Shader injection is disabled in this release for stability, it will be
      enabled in a future release.

 + Fixed Geometry Shader state leak in D3D11 UI render code for certain games

 + Bundled a new build of custom ReShade with improved support for games that render
     into different format / resolution rendertargets than they use for their swapcahain

 + Improved support for D3D11 texture resampling (mipmap generation, on-the-fly compression)
     incuding HyperThreading optimization.

 + Altered ImGui vertex processing code to align dynamic memory allocation to a 16-byte
     boundary for improved performance in games that use heavy CPU-side transform.

  -------------------------

    D3D11 Constant Buffer injection is still experimental and will improve over time,
      it is almost identical in function to the D3D9 feature but D3D11 has significantly
        more complicated memory management requirements that make optimization harder.

    Altering vertex shader material state is not recommended due to the number of
      draw calls made and vertex instancing, focus most experimentation on pixel shaders

      5r4

0.9.19:

 (.1): Fixed hook address cache invalidation if Windows updates a system DLL

 + Replaced SteamAPI battery monitoring with actual Win32 API code, and now indicate
     when a laptop battery is charging or discharging and how much runtime is left in
       the framepacing widget.

 + Fixed various issues with SpecialK.DENY files and local / global injection
     co-existence (Ctrl + Shift compat. menu works much better).

 + Improved support for BC7 texture dumping and injection
 + Added mipmap generation for Ys VIII
 + Added shadowmap resolution boost for Ys VIII
 + Fixed Ni no Kuni 2 memory patterns for anti-stutter mod
 + Added x64 DebugRegister listing to crash handler
 + Added bypass for broken Win32MiniDumpInit in Steam's latest DRM wrapper;
     ( affects 32-bit games only. )
 + Added preliminary Ansel overlay activation detection / prevention



0.9.18:

 + More work on MinHook stability / performance -- planning a few pull requests!
   ----------------------------------------------------------------------------

 + Fixed D3D11 texture cache (missing descriptors) in Elex when trees become
    unbalanced; fullscreen mode transition in this and other games is safer now.
 + Fixed Steam achievement server->client callbacks in Star Ocean 4 and The Witcher 3
 + Turned D3D11 deferred isolation off by default since most games do not need it

 + Added real-time stack traces for all running threads to the thread debugger
 + Rewrote debug symbol loading code for better multi-threaded performance
 + Changed Thread-Local Storage to Fiber-Local Storage for UWP compliance

 + Added validation of NtLdr DLL paths
    >> Detects AppCompat shims that makes games behave unpredictably

 + Fixed NvAPI issues in some third-party (vidcap) software that could break
     hardware monitoring (fan RPM in particular).

 =====
  *** Fixed CBT Hook Teardown Broadcast -- it was not running in the 64-bit
        builds and caused many WER faults when upgrading Special K. ***
 =====


0.9.17:

 + Finished re-writing MinHook's injection core to use MUCH more efficient thread
     suspend / resume.

  >> Boot up in some applications is 2-3x faster now and that is 2-3x less time for
       third-party injection to poke its nose where it does not belong while Special K
         is rewriting application code :)

 + Fixed various CBT hook issues in global injection; for users who frequently start/stop
     (why?) injection, things should behave better.

 + Added Exceptions Raised counter to the Thread Monitor widget; debug feature.

  >> Any exception counted here is the "continuable" sort; they generally pose no threat
       to software stability but high exception counts usually indicate a software defect.


0.9.16:

 (.1): Switched to D3DCompiler_47.dll (built-in)
 (.1): Eliminated unnecessary lock contention during texture uploads
 (.1): Fixed Alt+F4 menu in games that mixup Virtual Key Codes with Character Codes

 + Added workaround for systems that do not dispatch user32.dll system calls
     through win32u.dll
 + Added D3D11 Texture Cache residency management, to reduce cache pressure on
     textures that the driver isn't storing in VRAM.
 + Added D3D11 Deferred Context Isolation checkbox to D3D11 settings
 + Added SteamAPI callback count to thread monitoring info


0.9.15:

 (.1): Fix for Chrono Trigger + CEGUI
 (.1): Fix global injection profile creation for games with : in their name

 ** Substantial performance and stability gains by switching critical system call
     hooks from User32.dll to their NtUser* counterparts in win32u.dll **


0.9.14:

 (.1): Added option to fix red/green color banding if G-Sync is used with a
         10-bit framebuffer

 + Added D3DCompiler_43.dll, D3DX11_43.dll and D3DX9_43.dll as compressed .7z
     archives that will be unpacked to a game's directory if a user does not
       have the June 2010 DirectX Redistributables installed.

   >> In theory I could now start using D3DCompiler_47.dll, but I'll stick
        with _43 until I need the more advanced features for shader modding.


0.9.13:

 (.3): Added disk read/write info to thread tfooltip
 (.2): Added memory info to thread tooltip
 (.1): Assigned names to unnamed threads using debug symbols

 + Added a new Threads widget, that lists performance per-thread (kernel/user)
     and can even allow you to suspend individual threads.

   >> Suspending threads is dangerous, I expect this feature will be used for
        mod developers only. There is a high likelihood that you will have to
         restart a game to recover after using that.

 + Moved SteamAPI support DLLs to PlugIns\ThirdParty\Steamworks\...
 + Added proper Unicode filesystem path translation to SKIM64 for Steam manifests


0.9.12:

 + Updated build of SKIM64 allows installation of standalone Ni No Stutter mod
  - Ni No Stutter is built-in to this release of the global injector
 + Reduced memory consumption for D3D11 shader state tracking
 + No longer write ReservePercent to ini files, it is being phased out
 + Remove Merge-Only Cache Policy from D3D11 Texture Cache


0.9.11:

 (.1): Fix D3D11 Shader Mod Commands (i.e. D3D11.ShaderMods.ToggleConfig ...)

  + Fixed injection-blacklisted games failing to start while global injection is active
  + Fixed DLL init. issues with Far Cry 5 (_after_ Easy Anti-Cheat is worked around)
  + Improved support for shader state tracking in multi-threaded D3D11 engines
  + Added audio gain control (+dB) to volume management for hardware that supports it


0.9.10:

  + Dynamically adjust NvAPI monitoring thread priority to prevent rare hitching
      when the render thread's priority is != NORMAL
  + Added various options to make Ni No Kuni 2 less annoying; refer to control panel
  + Rolled up all of the changes from the standalone FFXV version (0.9.9)


0.9.9:

 (.15): Add logging of unexpected ref. counts on texture data to locate FFXV leaks
 (.14): TargetFPS applied at startup again
 (.13): Add merge mode to texture cache -- only prevents duplicate resources
 (.12): Sleep(0) on render thread -> SwitchToThread(); useful for i5 users
 (.11): Workaround for threads that try to skip attach notifications and corrupt TLS
 (.10): Alternate compiler options for better support with Ansel -- again
 (.8): Add persistent storage of settings introduced in .6, and explain them
        [They are actually applied when the engine starts said thread now]

 (.6): Add options for thread scheduling; can lower render and VSYNC threads
         to help people with fewer CPU cores in FFXV

 (.5): Anti-Debug Workaround for FFXV

 (.3): Correctly packed 64-bit version of CEGUI into 64-bit builds :P

 (.2): Fixed floating ImGui widgets not saving position in osd.ini
 (.1): Fix issue preventing Special K from identifying and assigning its own
         threads their initial priority (all were running NORMAL but most are
           designed to run at lower priority).

 + Disabled compiler options known to cause problems with Ansel; forced to
     replace them with options known to cause issues with MSI Nahimic.

 + Prevent FFXV from running SteamAPI with TIME_CRITICAL scheduling and
     starving more important threads that actually use the CPU productively


0.9.8:

 (.4): Fixed concurrency issues with texture cache in FFXV, it is safe to
         enable caching now and highly recommended
 (.3): Added error message on systems missing June 2010 DirectX Runtimes

 (.1): Disable a user's ability to perform software updates using the in-game
         config menu on installs done without SKIM.
 (.1): Add option to disable DXGI_PRESENT_TEST swapchain present for FFXV


 + Added SteamAPI rate throttling to fix resource load hitches in FFXV

   >> Right-click the SteamAPI Frame counter in the control panel to access:

       -1 = Unlimited (will hitch)
        0 = Disabled  (no idea what will happen, but probably not good)
       *8 = (Suggested max. for FFXV)


 + DLL static initialization cleanup (most global scope data is now scoped)

    (Dramatic global injection performance speedup)


0.9.7:

 + Added DirectXTex DLL Exports:

   * SK_DXTex_GetMetadataFromDDSFile
   * SK_DXTex_LoadFromDDSFile
   * SK_DXTex_CreateTexture

     ( Plug-in Authors: Use these instead of D3DX11; refer to updated UnX
                          plug-in for example code )

 --

 + Fixed ReShade shim loader (1.0.0.3) not correctly invoking LoadLibraryW
 + Reduced volume of crash sound and added a MessageBox if sound is muted
 + Added version info to the kernel DLL unload trace log
 + Added render API and crash info to global DLL's shared data segment


0.9.6:

===========================================================================
 IMPORTANT NOTES REGARDING Final Fantasy XV:
 -------------------------------------------

  If you opt to use texture caching, set the limit to your entire VRAM
    capacity, otherwise it will fight with the game's internal cache and
      cause stuttering.

  I cannot fix this in time for the game's launch and have disabled texture
     caching by default for this game as an interim solution.

 *** Texture modding in D3D11 requires caching to be enabled, so if you see
       no textures in the mod tools, it's probably because caching is OFF.
===========================================================================

 + Re-enabled IsDebuggerAttached (...) spoofing to allow FFXV to be run
     through a normal debugger (i.e. not Cheat Engine) without bailing out
 + Optimized D3D11 shader cache for games that create the same shader
     concurrently across multiple threads


0.9.5:

 (.3): Fixed mouse cursor confinement in FFXV
 (.3): Optimized live shader view in D3D11 for games with thousands of
         pre-compiled, but inactive, shaders.

 (.2): Defer initialization of D3D11 texture management until D3D11 is actually
         used :P
 (.2): Improve AppCache generation on first execution of games w/ launchers

 -----------------------------------------------------------
 *** It is STRONGLY suggested that you delete the directory:

       Documents\My Mods\SpecialK\Profiles\AppCache

     after receiving this update ***
 -----------------------------------

 (.1): Partitioned scratch memory per-thread for D3D shader disassembly,
         ini parser, command processor and debug stack traces for faster startup

 (.1): Fixed various rare NvAPI issues
 (.1): Upon successful shutdown, crash.log is deleted again
 (.1): All Steam AppID resolution cache data is stored in Profiles\AppCache\... now

 + Replaced kernel scheduling resolution tricks with Multimedia Class Scheduler

  >> This will increase battery life on mobile systems (versus the old code),
       and should not have a measurable impact on framerate limiter performance.


0.9.4:

(.3) Ignore D3D9 video playback in Atelier Firis (a D3D11 game)
(.3) Disabled automatic steam_appid.txt generation
(.3) Disabled code to automatically bring a game's window to the foreground at
       start, it was causing too many compat. issues.

(.2) Tweaked global injection behavior for certain non-standard Windows apps

 + Added more detailed pixel format information to SK's log in D3D11 games.
 + Added logging of unloaded DLLs to SK's log
 + Improved the reliability of using auto-update and branch selection
     features from the Update menu in-game.

   >> Please give these a try, I know of a few Unity games that don't handle
        window management correctly and they're forever WONTFIX, but if you
          encounter errors with other games, I'll be happy to investigate.

 + "Borrowed" an environment variable exported by the Steam client to get
     game's AppID without booting up SteamAPI.


0.9.3:

 Updates should no longer cause WerFault.exe to flip out :P
 ----------------------------------------------------------

 + Joined the update dialog's thread with the game's message pump so that
     input processing behaves consistently.
 + Delay-load most non-standard DLL dependencies (i.e. d3dx9_43.dll) to
     reduce injection overhead in applications that are not games.

  >> Prevents the DLL from getting stuck in explorer.exe, browser_broker, etc.
       without the need for a shim loader.


0.9.2:

 (.1): Updates should no longer cause WerFault.exe to flip out :P
 ----------------------------------------------------------------

 (.1): Joined the update dialog's thread with the game's message pump so that
         input processing behaves consistently.
 (.1): Delay-load most non-standard DLL dependencies (i.e. d3dx9_43.dll) to
         reduce injection overhead in applications that are not games.


 + Fixed Skyrim Special Edition launcher crashes
 + Fixed auto-update fetching version.ini multiple times if user postpones
 + Tweaked Steam achievement rarity colors in unlock popup for visibility
 + Sped up redundant Steam redisributable file detection (cpl opens faster)
 + Fixed DXGI CreateSwapChainForHwnd not actually using the HWND :)
 + Fixed Secret of Mana's resolution quirkiness
 + Cleaned up log file formatting and added performance counters to it
 + Removed CPU Stress Test Button
 + Added support for naming threads (Win 10 feature) to improve crash logs


0.9.1:

 (.4): Add option to cache textures even if a graphics engine is under- or
         overflowing Special K's reference count sanity tests

           (i.e. Tokyo Xanadu)

 (.3): Tweaked thread priority scheduling at boot for faster startup
 (.3): Improved window management in Sonic Mania and Lightning Returns
 (.2): Fixed support for caching / injecting Unordered Access View qualified
         textures (about 2/3 of FFXII's textures are Unordered Access Views)

 (.1): Fixed mouse capture issues caused by the previously mentioned fix :P

  + Fixed keyboard / mouse focus issues when Win32 modal dialogs are
      active at the same time as an ImGui modal dialog

 [!] Moved SpecialK[32|64].dll's texture injection directory to

      Documents\My Mods\SpecialK\Profiles\<game_name>\SK_Res

  + Fixed Secret of Mana late SteamAPI init. in global injector
  + Fixed address cache invalidation for D3D11 games
  + Updated 64-bit SteamAPI DLL for compat. with newer games
  + Increased MinHook performance (faster startup)


0.9.0:

 + Added a new File menu for texture modders, that will take you to your
     game's texture dump / injection directory (D3D11 only at the moment)

 + Fixed SteamAPI shutdown issues in some improperly written games;
   >> SteamAPI isn't thread-safe, stop shutting down stuff from a different
        thread than owns the client pipe.

 + Enabled the Bordered/Borderless/Borderless Fullscreen Display Menu in GL
  >> Some games do not properly resize their viewport when overriden in GL;
       please be aware of this.
 + Optimized dynamic memory management when drawing line-based performance
     graphs
 + Added auto-pause feature for Steam Overlay Aware games when the cpl is open
   >> This feature requires Special K to observe the game setup an overlay
        activation callback.

      This callback may be missed in global injection scenarios and the
        local DLL is more likely to properly detect Overlay Aware software.

    *** Right-click the SteamAPI frame counter to access this setting (if
          the current game is overlay aware) ***
  ---
 + Added Steam Online Status options to a new Steam menu
  >> This setting is per-game, but a system-wide preference can be manually
       setup by adding [Steam.Social] OnlineStatus=0 to Global\achievements.ini
 + Improved framerate limiter WaitForVBLANK and added this feature to GL
 + Fixed D3D9Ex Fullscreen and Windowed overrides for applications that do
     not set the Focus / Device HWND parameters during device creation

 + Added FFXV to an internal whitelist of games _NOT SOLD ON STEAM_ that
     are compatible with global injection.
 + Added more descriptive version info to the startup banner if you manually
     place Special K's DLL into a game directory as (dxgi.dll, d3d9.dll, etc).
 + Fixed file permission problems if you use Special K in the FFXV benchmark
  >> CEGUI cannot be used in the benchmark unless you run _BOTH_ the game,
      and SKIM64 (if you use global injection) as admin. SK will disable
        CEGUI automatically if file permission issues are detected.

 + Enhanced FFXII compatibility
 + Fixed UI scaling issues preventing Accept button from appearing on EULA.

 + Automatically bootstrap steam_api{64}.dll from Special K's distribution for
     any game located in SteamApps\common that does not use SteamAPI

  >> This allows AppID name resolution for games that pre-date SteamWorks,
       and adds Special K's Steam overlay enhancements.

   ( This feature is configurable through Steam.System::AutoInjectSteamAPI )

 + Added a menu option to File to inject SteamAPI into non-Steam games.

 + Fixed window focus issues in some OpenGL and DirectDraw/Direct3D 8 games
 + Renamed Render.GL::ShowOSDInVidCap to Render.OSD::ShowInVidCap since it
     affects all graphics APIs now

 + Stop booting ancillary graphics APIs after the game draws two frames;

     A game bringing in D3D9 or D3D11 after it's already started rendering
       using a different graphics API is usually for video playback and I
         have no interest in modifying that stuff :P

 + Added logging of all HWNDs that are actively tracking RawInput devices
 + Application restarts after update / compat menu now properly start the
     game in the foreground

 + Forced fullscreen mode works in D3D9 again, but Unity's still sketchy
 + Fixed COM wrapper dispatch issues for DirectInput 7 games
 + Fixed several window activation (alt+tab) issues in D3D9/GL
 + Fixed compatibility dialog for local wrapper installs causing deadlocks
 + Added D3D9 OSD visibility toggle for vidcap
 + Fixed framerate limiter preferences not being applied at start

 + Added timeout detection in the event that third-party
     software is preventing the OSD hiding feature from working;

  >> OSD will automagically revert to normal drawing behavior
       if this scenario is detected.

 + Added option to toggle OSD visibility in D3D11 games
 + 100% support for video capture software in D3D11
 + Nearly complete support for vidcap software in D3D9



0.8.67:

 + Corrected usernames not properly stripped from log files
 + Added range validation to D3D11 resolution limiting settings
 + Fixed OpenGL HWND determination logic for Chromium games


 + Tweaked input latency reducing features in framerate limiter

  >> If you want to test these, it is suggested you set the mouse cursor
       to NOT use hardware and then move it rapidly.

      Games severely impacted by input latency (usually denoted by a rising
        counter in the sleepless window thread tooltip) will become more
          responsive.


0.8.66:

 + Fixed ReShade deferred context shader triggers in Okami HD
 + Fixed CSteamworks (C#) SteamAPI wrapper in 32-bit games
 + Fixed window border removal in 32-bit games at startup
 + Improved compatibility with Mirillis Action! video capture
 + Improved ability of D3D8 / DDraw API wrappers to bootstrap through
     global injection


0.8.65:

 + Optimized thread locking behavior at startup for faster game launches
 + Lowered thread priority on performance monitoring threads
 + Delay-init WMI-based performance monitoring services for more reliable CPU
     monitoring
 + Moved NvAPI init until after Special K has setup render APIs because
     NvAPI hooks LoadLibrary{A|W}<Ex> and may interfere with render setup


0.8.64:

 + Added option to disable CEGUI in D3D9
 + Fixed D3D11 startup issues in some games
 + Fixed crash handler not re-installing itself in Steam Brakepad games


0.8.63:

 + Fixed window focus issues in multi-render context OpenGL games
 + Added option to disable CEGUI in D3D11
 + Fixed ImGui reset on resolution change in DXGI graphics APIs

   >> Overlay doesn't disappear when resizing anymore :)


0.8.62:

 + Added option to show OpenGL OSD in video capture
 + Added option to disable CEGUI in OpenGL

 + Added DirectInput / XInput version number to Input Management
 + Added full support for DirectInput 7 (needed for FF7/8)
 + HID Gamepad input is properly blocked by the option to disable it

 + Games that use RawInput for mouse processing will no longer be blocked
     when the UI is in input-exclusive mode.

   >> That mode was always intended to block only gamepad and keyboard input;
        mouse input is blocked only if the cursor is over Special K's UI.


0.8.61:

 (.1): Fixed missing DLL export for wglSwapBuffers; needed for use as OpenGL32.dll

 + Fixed the EULA screen to support agreeing with gamepad / keyboard :)
 + Fixed OpenGL transparency option for ImGui rendering.
 + Fixes OpenGL OSD text rendering memory issues in 32-bit games

  >> The fix is sub-optimal and it is not recommended that you use the
       text-based OSD in OpenGL games until I can re-write it.

    * Performance widgets are actually higher performance in OpenGL
        than the OSD, please use widgets to monitor performance instead.


  + A handful of 32-bit OpenGL games continue to have issues and you
      may need to use EnableCEGUI=false to resolve compatibility issues.

    >> CEGUI is only used for achievement popups and OSD text; other
         overlay / UI aspects will continue to work.



0.8.60:

 (.2): Fixed ReShade post-processing order in OpenGL so that it does
         not post-process the config UI :)
 (.2): Temporarily disabled OSD text rendering in 32-bit OpenGL games
 (.2): Added sRGB framebuffer support in OpenGL games
 (.2): Fixed GL geometry buffer state leaks in CEGUI
 (.2): Fixed INI parser off-by-one issue in Chinese INI files
 (.2): Fixed OpenGL wglSwapMultipleBuffers calling wrong hook

 (.1): Improved global injection and auto-update performance
 (.1): Removed several legacy settings (i.e. Raptr injection warnings)

 + Completely separated ImGui from CEGUI (OSD / achievements) in OpenGL
 + Fixed 32-bit OpenGL delay-load ABI issues
 + Fixed OpenGL Vertex Array Object state leaks in legacy (GL 2.x) games
 + Corrected injection bypass dialog crashing OpenGL games


0.8.59:

 + Fixed GTA V Launcher injection compatibility
 + Added an option to delete Steam Common Redistributables across all
     registered Steam Libraries (libraryfolders.vdf) to the control panel.


0.8.58  (2018):

 (.2): Adds refresh rate to Fullscreen Resolution reading in control panel

 + CEGUI is packed into Special K DLLs now and it is possible to redistribute
     Special K without any dependencies.
 + DLL stays inside of blacklisted apps to prevent leaks in third-party modules
     that incorrectly use DisableThreadLibraryCalls (...)


0.8.57:

 (.1): Added a startup banner with version info, and new options to control the
         complexity of the FPS readout in the OSD.

  + Improved SteamAPI offline DRM bypass to work in all games tested;
   + Improved support for native Steam controller games

    >> Local DLL wrapper is needed for both of these things and so is the
         INI option referred to as "SpoofBLoggedOn."

  + In D3D11 games that use multi-threaded rendering, ReShade triggering works
      as intended.
  + Added option to disable gamepad input to a game, similar to the m&kb options

  * New Command Console Variables:
  ================================
    Input.Keyboard.DisableToGame  (Boolean): Blocks Keyboard Input
    Input.Mouse.DisableToGame     (Boolean): Blocks Mouse Input
    Input.Gamepad.DisableToGame   (Boolean): Blocks Gamepad Input
    Input.Gamepad.DisableRumble   (Boolean): Blocks Rumble*
                                     (*) All APIs except DirectInput

    Input.Gamepad.XInput.UIController (Integer): 0-3,   4=Disable
    Input.Gamepad.Steam.UIController  (Integer): 0-15, 16=Disable


0.8.56:

 (.1): Fixed various memory problems during init/shutdown
 (.1): Steam achievement popups are now drawn over top ImGui

 + Added support for d3d11.dll wrapping (alternative to dxgi.dll)
 + Addressed memory leak in blacklisted processes


0.8.55:

 + custom_<SpecialK|dxgi|d3d9|dinput8|OpenGL32>.ini is now supported

  >> If this INI file is present (using the appropriate DLL name), any values in
       it will override the game's config.

       These values are not stored at exit, and remain even if/after a mod update
         overwrites your base INI file. Use this feature sparingly, for stuff you
           don't need to re-configure (i.e. mouse behavior, macros, etc.)

 + Added RTSS hook avoidance by checking the window class that owns a Swapchain
 + Added alt. DXGI hook codepaths (Render.DXGI | HookType=0,1) for Okami compat.
 + Added WaitForVBLANK option to D3D11 Swapchain settings
 + Changing D3D11 Swapchain latency in the control panel takes effect immediately
 + Improved global injection performance for non-whitelisted applications


0.8.54:

 + Added support for plug-in loads from a game's global injection profile directory
 + Improved texture memory stats in custom ReShade
  * Rendertargets are distinguishable from actual texture files by their color
  * Added active / total count to the texture summary

 + Added D3D11.ShaderMods.Unload and ToggleConfig commands to load/unload shader
     setting INI files.
 + Added fullscreen mode restoration on Alt+Tab if force fullscreen is enabled


0.8.53:

 (.6): Fixed CEGUI to support Unicode file paths for log files

   >> Configuration for some Steam games may be reset because profile names with
        non-Latin characters will be stored in a different location.

 (.5): RawInput mouse fixes for Okami
 (.4): HOTFIX for Okami's non-Latin characters in filesystem when storing config

 + Changed debug code to run-time load dbghelp.dll instead of link-time
 + Added option to disable screensaver
 + Added texture format types to typeless DXGI formats when generating mipmaps
 + Added SteamAPI DLL SHA1 Verification for diagnostic purposes since CodexAPI is
     a stability problem... pirates just opt-out of SteamAPI enhancements please.


0.8.52:

 (.4): HOTFIX for 5 FPS issue
 (.3): Fix XInput lock behavior in games that use out-of-range controller idx
 (.2): Corrected SKIM64 start/stop behavior and AMD ADL
 (.1): Added Window.TopMost variable to fix Star Ocean 4

 Keyboard Macros
 ===============

 + Added support for keyboard macros

  >> (See ReadMe\cvars.txt for partial list of commands)

    *** Structure in INI is  [Macro.<NameOfMacroGroup>]
                             KeyBind=Command
                             ...

     ( Multiple commands may share the same keybinding, but order of execution
         is undefined. )

 + Added support for global macros and turned all OSD toggle keys into macros

  >> (Refer to Global\macros.ini)

 + Fixed WMI performance monitoring thread init when Steam overlay is
     loaded first


0.8.51:

 (.1): Corrects mouse cursor activity detection in World of Final Fantasy

 + Added windowed mode compatibility fixes for World of Final Fantasy

  >> Delete any existing config profile (dxgi.ini/SpecialK.ini) to take advantage of

 + Fixed HWND ping-pong issue in World of Final Fantasy
 + Added XInput haptic recursion protection (safeguard against Steam overlay)
 + Added automatic mipmap generation option in D3D11
 + Corrected cached VRAM total calculation when injecting textures in D3D11


0.8.50:

 (.1): Enabled persistent storage of sleep-wait framerate limiter preferences

 + Added options to control line and contour anti-aliasing in ImGui
 + Added option to disable alpha transparency on Special K's UI
  >> Solves flickering in some DirectDraw, D3D8 and D3D9 games

 + Corrected ReShade's SMAA shader so that edge-detection when using depth
     respects the "upside down" pre-processor definition.
 + Fixed the ability to drag ReShade effects to change their order
 + Added options to block Keyboard / Mouse input to games, to prevent them
     from changing input icons if you don't want that.
 + Added Alt + F4 Confirmation Dialog for games that usually block Alt+F4
 + Made ReShade Shim Loading a bit more sane

  >> (d3d11, d3d9 and GL DLLs are dynamically generated on first load)

 + Added D3D11 Texture Mod Reload Support


0.8.49:

 (.2): Fixes startup issues in Elex

 (.1): Performance optimization for heavily multi-threaded engines that
         map and unmap D3D11 memory from different threads.

+ Added global injection whitelist using Regular Expression syntax.

  Manually create Documents\My Mods\SpecialK\Global\whitelist.ini and enter
    patterns to match, one per line.

   >> Implicitly, the whitelist already contains this pattern:

        "SteamApps\\common\\" , which is part of the executable path for all
                                  Steam games.

  *** Restart global injection using SKIM64 any time you change the whitelist;
        it is only parsed at startup. ***

+ Locally wrapped games can now load ReShade from a central location by using a new
    shim loader DLL (ReShade32.dll / ReShade64.dll).
+ Eliminates D3D11 shaders generated by ReShade from the shader list
   >> That used to be a good way to crash the game ;)


0.8.48:

 + Fixed incorrect alt+tab operation in fullscreen exclusive w/ window centering on
 + Eliminated D3D11 reference counting issues at startup
 + Improved window management reliability
 + Disabled cursor restriction while dragging windows
 + Added support for evaluating commands in parallel on deferred render contexts
     before they are coallesced by a (working) graphics driver.
   >> Fixes problems in Blue Reflection, though probably hurts performance.


0.8.47.2/3:

 + Added rescale-to-fit behavior to Live Render Target and Texture View (D3D11)
 + Added support for DisableIfTexture predicate to d3d11_shaders.ini

  >> Right click a shader to access this menu (generally pixel shaders only)


0.8.47.1:

 + Added per-tracked shader wireframe/on-top state and cleaned up D3D11 shader UI

  >> Default is now to draw the tracked shader on-top


0.8.47:

 + Added support for D3D11 Shader state load/store (d3d11_shaders.ini)

      (Refer to the new button pannel in the Shader Mod Tools)

  >> Will add annotations for hash names to something more meaningful later
  >> Will also add ability to save shader profiles in order to enable/disable
       known effects.
  >> Command console will also allow loading profiles by name and manipulating
       the stored shader values, so that you can macro this stuff to keybinds.

 + Added sRGB -> UNORM override if Flip Model is enabled in D3D11 games, this
     allows G-Sync in Unity games

 + Added FlipEx mode to D3D9Ex override, allowing G-Sync in windowed mode in D3D9


0.8.46:

 + Local Wrapper DLLs no longer use AppCache for config
 + Fix for Steam games with Trademark symbols in their name when using the
     global injector config repository... you may need to clear Special K's
       AppCache directory before this takes affect.
 + Corrected attempts to auto-detect D3D8 / DDraw as the primary graphics API
     when the required dgVoodoo API support plug-in is not present
 + D3D11 Texture injection optimizations
 + Disabled Sleepless Render Thread by default for improved compatibility


0.8.45:

 + Improved vertex memory alignment in ImGui D3D9 renderer
 + Fixed memory alignment issues for non-standard packed DXTn textures (D3D9)
 + Fixed Agarest Zero / 2 D3D9 texture management
 + Exit Confirmation Dialog now focuses on the Cancel button using gamepad input
 + Thread optimizations for D3D9/11 texture injection


0.8.44:

 + Added Denuvo activation management to all Denuvo-based (STEAM games)

  >> I am not a fan of Origin, maybe if they publish more games I like and open up their
       platform's API a littlebit I will give Origin+Denuvo the same features? :)

 + Corrected formatting on the D3D9 framebuffer tooltip

  >> Mouseover the resolution number in a D3D9 game for Special K's "stats for Nerds" :P

 + Added support for games that use the very latest version of SteamAPI (mostly VR nonsense)
 + Improved performance in games that busy-wait using PeekMessage (...)  (i.e. Sonic Mania)
 + Minor correction for some D3D9 games having issues with texture modding


0.8.43:

 + Enabled triple-buffering override in D3D11 fullscreen (non-flip-model) mode
 + Disabled non-mipmapped texture cache in Divinity: Original Sin 2

  >> If you want to mod its UI textures, turn this option back on and turn staging texture
       uploads on. This is under the D3D11 / Texture Management settings.

 + Improved multi-threaded texture cache performance for games like Divinity: Original Sin 2
 + Removed username from file paths in logs
 + Add SteamAPI offline check bypass option


0.8.42:

 + Last update prior to hurricane Irma
 + Improved D3D9 texture injection performance


0.8.41:

 + Improved support for D3D9 texture modding, and made it an opt-in thing since it's still
     experimental.
 + Added File | Exit to the control panel


0.8.40:

 + Added somewhat functional texture modding support to D3D9
  >> Will finish at a later date
 + Added XInput Controller Slot Reassignment (refer to INI file -- default is 0,1,2,3)


0.8.39:

 + Fixed D3D9Ex D3DPRESENT_DONOTWAIT support in Lightning Returns: FFXIII
 + Integrated UI memory management fixes for FFXIII
 + Improved thread-safety in D3D9 shader mod tools
 + Added scaling option to widgets (needs a ton of work)
 + Added clothing preferences to Gal*Gun: Double Peace


0.8.38:

 + Integrates about 33 - 50% of Tales of Berseria Fix's shader modding functionality
 + Fixes SteamAPI problems in older games


0.8.37:

 + Preliminary support for a native Steam Controller input backend
  >> Does not utilize any of the special features, merely blocks native SteamAPI input
       while the config UI is open
  >> Generally for the 1% of games that use native Steam, this requires Special K to be
       installed as a local wrapper because it needs to catch SteamAPI initialization early.


0.8.36:

 + Performance-tuned memory pattern scanner to offer alignment and address above/below
     search heuristics.

   >> Significantly speeds up repeating pattern searches (i.e. hard-coded resolutions)

 + Added Resolution Override to Gal Gun and Akiba's Trip

  >> This is different from the way this feature normally works, it goes beyond API
       reflection/introspection and instead patches certain hardcoded arrays of memory
         in really crappy JRPG ports.

 + Added D3D11 Wireframe Mode (per-shader)
 + Added additional D3D11 Shader Culling options (per-Shader Resource View)
 + Added support for BC7 and BC6H textures to Final Fantasy X/X-2
 + Fixed Shader Resource View formats for injected D3D11 textures using alternate formats
 + Fixed Global Injection Blacklist issues
 + Turned off all widgets by default for new installs


0.8.35:

 + Added option to flip textures in D3D11 Live Texture View
 + Added indicator for injected textures to D3D11 Live Texture View
 + Corrected texture hashes listed in D3D11 Live Texture View
 + ReShade can now be opened independently of Special K's config menu
 + Fixed ReShade draw order in OpenGL games


0.8.34.1:

 + Fixed SteamAPI problem in Dark Souls III
 + Added Browse ReShade Assets to File Menu
 + Improved ReShade stats screen
 + Improved controller support in ReShade's UI
 + ReShade game presets are now stored in Profiles\<appname>\ReShade\<executable.ini>

0.8.34:

 + Framerate limiter defaults to busy-wait again
  * The customization you do to the non-busy-wait method (under Advanced) are not saved
      when you exit a game.

 Added Support for Custom ReShade
 ================================
  + This release comes bundled with a test version of unofficial ReShade 3.0.666 ;)
  + The custom version goes in PlugIns/Unofficial, and you should place the official
      release (if you want/need it) into PlugIns/ThirdParty
  + Only the global injector version of Special K supports custom ReShade, you can
      select between official / custom under the PlugIns menu

   >> The custom version includes:
    * Gamepad / keyboard support on config menu
    * Per-game presets, textures and shaders
     + Place Textures in Documents/My Mods/SpecialK/Profiles/<App Name>/ReShade/Textures
     + Place Shaders in Documents/My Mods/SpecialK/Profiles/<App Name>/ReShade/Shaders
    * Always loads a game's preset on start, instead of the last used preset


0.8.33:

 + Fixed low-resolution issues with the EULA window
 + Most analytical graphs are now multi-colored instead of trying to determine
     a single color to represent the quality of the entire dataset.
 + Added new options to the framerate limiter (disabled by default) to continue
     driving a game's window message pump if it renders from the same thread as it
       handles input.
  >> Should reduce input latency and help in games like FFX
  >> You must turn Busy-Wait limiting off in order to use this


0.8.32:

  * Profile Name Collision Avoidance
 ====================================

 + Global Injector Profiles for Steam games use the application name as defined by the game's manifest
   >> Prior to this, they used <app_name.exe>, which was too generic.

 + This is a two-stage process that involves booting SteamAPI up to determine the AppID and then
     parsing the manifest.

   >> Translation and mapping data for each game is maintained in a new AppCache\... directory structure
   >> Profile migration occurs automatically, but for some games my overlay may not render correctly
        the first time you run a pre-migrated game.
   >> In some cases, deleting the original <app_name.exe> directory may even be necessary.

 + Later versions of Special K will allow blacklisting launchers and other components that share Steam AppIDs


0.8.31:

 + Fixed Steam DRM issues in DOOMx64 and a couplf of other OpenGL games
 + Added a battery meter to the framepacing widget
 + Added an option to draw a border around widgets

 * Added support for gamepad manipulation of widgets
 ===================================================
  > Enter gamepad exclusive input mode, then hold Square (PlayStation) or X (Xbox)
      and select a widget by pressing the shoulder buttons.
  > Moving a widget can be done by holding Square / X and moving the left analog stick
  > Double-tapping the Cross (PlayStation) or A (Xbox) buttons will open widget config

 + Removed Alt+F4 input hack for Trails of Cold Steel; it is obsolete


0.8.30:

 [.3]
  + Added D3D11 Graphics Pipeline Widget, it displays most of the important stats from the
      shader analytics feature (Ctrl + Shift + R) over a 5 to 10-second history.
  + Added D3D11 SwapChain Menu, I'll fill the stuff in with tooltips later.
   >> This mostly benefits Windows 10 users
  + Fixed Trails of Cold Steel Alt+F4 behavior so it no longer exits if you're trying to
      close a different program
  + Added 1 frame swapchain latency in Flip Mode to ensure G-Sync doesn't destroy timing :)
   >> Will make this an option and restore the original latency reducing measures for
        non-G-Sync users in a future update.

 [.2]
  + Added CPU Monitor as an official widget, with OSD config and all
  + Added grid rulers for docked widgets while moving them
  + Added option to disable resizing widgets
  + Added persistent storage of widget positions
  + Added user-defined min/max size constraints to widgets
  + Fixed keybind parsing problems with numpad and Left/Right Alt keys

 [.1]
  + Fixed D3D8 / DDraw Wrapping

 + Added persistent config to some of the widgets (Volume Control / GPU Stats / Framepacing)
  >> Right click those widgets to open a config menu for them
 + Fixed DDRAW / D3D8 wrapper problems
 + Corrected scaling on menus


0.8.29:

 + The peak volume meter is now a histogram, assigned color based on channel
 + Peak volume moves left / right depending on channel
 + Added very early GPU hardware stat graphs to a new GPU widget
 + Mouse cursor and input behavior when interacting with widgets is more intuitive
  >> You can even move them around without the config menu open
 + Fixed Dark Souls 3 Texture Cache reference leaks
 + Disabled a few of the optimizations from 0.8.28 for compatibility with GeForce Experience
  >> Will investigate further in the future


0.8.28:

 + Removed tooltips from graph data views
 + Fixed G-Sync status query in D3D9 games
 + Added minimum flush interval for log I/O (100 ms default)
 + Coalesced all INI file output into a single buffered write for improved
     disk I/O performance
 + Restored multi-threaded DLL analysis at startup (performance)


0.8.27:

 + Added OSD Widgets (framepacing and CPU load)
  >> Will polish these off later, they're just toys for now.
 + Changed Special K's config menu to work similar to a Mac, for easier access
     to the branches sub-menu at lower resolutions
 + Fixed various Windows 7 issues


0.8.26:

 + Added G-Sync status to framerate readout on OSD
 + Cleaned up log formatting, turn wordwrap off to appreciate the changes ;)
 + Various DLL Loader compliance issues have been fixed (in third-party software),
     including using incorrect paths, wrong flags, etc.
   >> I am likely to encounter broken software that relied on the original undefined
        behavior, I'll fix it when it causes problems :)
   >> This change actuall solves a few oddball problems in the meantime
 + Added mouse warp deadzone configuration to the control panel for games with obnoxious
     mouselook.
 + Fixed occasional Wbem Locator issues caused by the Steam Overlay
   >> The reason that CPU stats, etc. can take several seconds to load is because the Steam
        overlay holds a thread sync lock on the service needed for those stats. The reason
          those stats sometimes crash games is ... because the Steam overlay holds a lock.
   >> Tsk, tsk, Steam - other people need those services too, damit :)


0.8.25:

 + Fixed mouse input in Mouse Effect: Andromeda, *AGAIN*.
 + Officially supports dinput8.dll injection; the compatibility menu does not offer this
     as one of its choices, but it will eventually.
  >> dinput8.dll, for games that use this, has the greatest chance of working with fullscreen
       video capture software.
 + Improved keyboard input processing, particularly how it behves while in Input Exclusive mode
     and you trigger the keybinding to toggle the config menu.
  >> This is preparing for customizable keybindings, I've been promising them for a long time :)
 + Fixed occasional right-to-left window orientation problems in 64-bit builds
 + Fixed D3D11 reference counting underflows in some games, especially when a third-party
     render enhancing mod is present.
 + Fixed rare texture cache hash collision problem for textures that are removed from the cache
     because a graphics engine has altered them.


0.8.24.4:

 + Fix deadlock caused by MSI Nahimic due to hotpatching 32-bit code
  >> Add MORE padding bytes than the x86 ABI requires because Nahimic is borked

0.8.24.3:

 + Fixed all known multi-threaded rendering problems (Dishonored2 can be debugged now).
 + Reduced texture cache overhead
 + Improved WMI monitoring performance

0.8.24.1 / 2:

 + Crash logs are now stored persistently in logs/crash/<date>/...
 + Updated SKIM64 to add more functionality to tray menu

0.8.24:

 + Added Window Border Style settings to Display menu
 + Corrected several Windows 7 issues
 + Improved DOSBox OpenGL support
 + Improved thread-safety in D3D11 shader mod tools; still can't safely debug Dishonored 2
 + Fixed input support in Final Fantasy 8


0.8.23:

 + Fixed potential startup deadlock with Steam Overlay and CoInitializeSecurity (...)
 + Fixed SK_NoFailMove behavior (prevents updates) when attempting to patch a locked file
 + Fixed (evict-on-update) D3D11 texture cache in The Witcher 3 and Divinity: Original Sin
 + Added logs/installer.log when installing through SKIM
 + Added module name and fixed newline endings in game_output.log


0.8.22:

 + [Misc]  Stopping injection while programs are using Special K no longer crashes them :)
 + [SKIM]  Closing SKIM while injection is enabled now triggers a confirmation dialog
 + [D3D11] Added option to enable staging texture cache (for Unity games)
 + [SKIM]  Added option to start SKIM automatically during install and to system tray
 + [SKIM]  Added list of (64-bit) programs currently injected and a confirmation if you
             attempt to stop injection while a program is using Special K.
 + [SKIM]  Added tooltip to system tray icon
 + [D3D11] Added support for changing fullscreen display scaling mode while your game is
             running; should make using centered scaling modes a bit more intuitive.
 + [Misc]  Added injection stats to Help menu, mouseover Global Injector version to see
             basic information about games recently played.


0.8.21:

 + [SKIM]   Changed system tray icon (to another KDE icon =P) so that it is easier to
              recognize
 + [XInput] Fix for games that use XInputGetStateEx (...) without allocating the correct
              memory size for the data structure (+1 DWORD)
 + [D3D11]  Reduced D3D11 API overhead in games that stream memory-mapped textures when
              texture caching is enabled but the render mod window is not open
 + [SKIM]   Using +Inject or -Inject commandline switches starts SKIM minimized to the
              tray; left-click the icon in the try to restore it
 + [SKIM]   Branch migration takes effect immediately in all software except for the
              global injector
 + [SKIM]   Only one instance of SKIM can run simultaneously, minimized instances will
              be restored if a new instance is launched
 + [SKIM]   The commandline switch -Inject will now kill any running injection instances
              and exit


0.8.20:

 + [D3D11] Added texture update frequency (0 = Manually Refresh, 1+ = Auto) for the
             texture mod tools.
 + [D3D11] Added option to replace 24-bit Depth Buffer with 32-bit
 + [D3D11] Improved multi-threaded safety in the D3D11 mod tools for games that draw
             from multiple threads.
 + [SKIM]  Added support to minimize SKIM v 0.7.0+ to the System Tray and have it
             manage global injection for the end-user.
 + [D3D9]  Fixed swapchain recovery afer device loss
 + [GL]    Improved startup time


0.8.19:

 + [D3D11] Re-wrote stateblock code to minimize reference counting problems
 + [D3D11] Fixed stateblock leak that prevented ResizeBuffers (...) from working
 + Fixed late initialization problems if compat menu is dismissed by pressing OK
 + Added version to compatibility menu
 + Improved compatibility menu and update menu's input focus behavior


0.8.18:

 + Added version info to wrapper DLL installations; updating is not supported
 + Installing a wrapper DLL through the compat menu now copies the config from the
     global profile.
 + Uninstalling a wrapper DLL copies the local config back to the global profile
 + Fixed G-Sync indicator in D3D11


0.8.17:

 + Added Last-Known-RenderAPI to Special K's INI file to help with the auto-detect
     mechanism on the compatibility menu
 + Corrected scenario where having a local API wrapper version of Special K in-place
     and one of the API virtual files (i.e. SpecialK.d3d9) would cause both DLLs to
       load.
 + Temporarily re-enabled auto-update.


0.8.16:
 + Renamed Window/Fullscreen override options now that they work in multiple APIs
     (refer to Display.Output)
 + Added version info for all plug-ins to the help menu
 + Store user preferences for G-Sync and Input API persistently.
 + Extended screen mode option to include D3D11
 + Changed the D3D9 screen mode option to a combobox for mode and checkbox for
     permanent override.


0.8.15:

 + Injection Compatibility Options Menu DRASTICALLY Overhauled
 -------------------------------------------------------------
  * Can now be used for both local DLL wrappers and global injector
  * Can be activated with late global injection as a means of installing a
      local DLL.
   >> Activate global injection, hold Ctrl + Shift, activate your game, click
        Install and then deactivate global injection.
  * Added config file reset option
  * Added plug-in disable feature (ReShade)
  * Added D3D8/DDraw plug-in validation
  * Improved API auto-detection and validation of executable's DLL Import Table.

 + Added sleepless render / window thread options to framerate limiter to fix
     games like LEGO City Undercover, that trash their window's message pump.
 + Added Fullscreen override option to control panel for D3D9 games


0.8.14:

 + Add D3D11 Safe Fullscreen option for games that disable fullscreen mode
    (i.e. LEGO City Undercover, Final Fantasy X/X-2, anything on Windows Store)
    ==> Set SafeFullscreenMode in dxgi.ini / SpecialK.ini, then press Alt+Enter
 + Added option to install wrapper DLL through global injector's compat. menu
 + Fixed framerate statistics above ~333 FPS
 + Disabled DirectDraw and D3D8 in 64-bit builds
 + Disabled Vulkan and D3D12 in 32-bit builds
 + Added support for games that change render API without a full restart;
     OSD will not work, but the game will continue running ;)
 + Fixed WMI Performance Monitoring thread initialization
 + Added DirectDraw support (using dgVoodoo)
 + Fixed OpenGL vertex memory management in Sinless
 + Fixed achievement popups with partial progress (no longer treated as unlock)
 + Screenshot on achievement unlock fixed when popups are disabled
 + Added Texture LOD Selection to D3D11 Texture View
 + Added Texture Set Filtering to D3D11 Texture View
 + Added XInput vibration parameter validation
 + Fixed alt-tab in Fullscreen mode in EverQuest and Hunie Pop
 + Fixed double-input processing in God Eater 2: Rageburst
 + Fixed SteamAPI init. problems in Final Fantasy IX
 + Fixed typo (spe----) in EULA
 + Improved Gamepad Input in Audio Session Selector
 + Changed OSD to draw below ImGui control panel in D3D9
 + Fixed Achievement Popups in Senkran Kagura: Shinovi Versus
 + Fixed Overlay Rendering in Pillars of Eternity / Tyranny / Torment


0.8.13:

 + Removed Chinese Unicode code points from ImGui font; added Latin punctuation
 + Fixed NieR: Automata Texture Staging
 + Added Thread Local Storage Stack
 + Added play time tracking to non-Steam games
 + Fixed hour roll-over problems in play time stats
    >> Special K is Y2K38 ready! :) <<
 + d3dcompiler_*.dll is pinned at load-time to prevent TLS issues in software
     that loads and unloads this DLL when it compiles HLSL shaders.
 + Fixed 3DMigoto compatibility
     (ImGui changed to use hooked D3D11 functions instead of trampoline)
 + Added support for resolutions as low as 1280x720 and 1024x768
 + Added option to force-inject steam_api into games published before SteamWorks.
     (steam_api{64}.dll must be placed in Documents\My Mods\SpecialK\)
 + Added configuration for CEGUI initialization (safe vs. fast [default])
 + Enabled D3D11 Texture Cache by DEFAULT (for new mod tools to work)
 + Added Memory View (D3D11)
 + Added Texture View (D3D11)
 + Added RenderTarget View (D3D11)
 + Added Shader Disassembly View (D3D11)
 + Added option to disable DebugBreak (...) in kernel32.dll
 + Added fix for incorrectly packed compressed DDS textures
 + Remove Malware detection, I have no intention to maintain that featurez  


0.8.12.3:

 + Added game playtime to control panel title
 + Added Synaptics touchpad mousewheel support for DirectInput/RawInput/HID
 + Added temporary file cleanup (i.e. SKI*.tmp, Version\*.old, ...) to DLL init.
 + Improved global injection startup/shutdown reliability
 + Fixed control panel window moving if its title changes
 + Fixed Fallout 4 / Scaleform exception handling
 + Fixed game_output.log being saved to the wrong location when using the
     global injector.
 + Fixed legacy keyboard input in Steam overlay in Skyrim: Special Edition
 + Fixed legacy mouse input after Alt+Tab in EverQuest
 + Switched framerate limiter over to new render backend system; WaitForVBLANK
     may not function correctly in some D3D9Ex games.

0.8.12.2:

 + Added a D3D9 ForceWindowed override to SpecialK.ini
 + Fixed SteamAPI exception handling in 32-bit ABI (Steam overlay callback)
 + Fixed double-input processing through PeekMessage
 + Fixed CEGUI / ImGui reset on multi-frame D3D9 device loss recovery

0.8.12.1:

 + Added 1.5 second delay unload for blacklisted applications to prevent performance
     problems when the CBT hook inevitably tries to re-inject the DLL.

0.8.12:

 + Removed legacy command console code (low-level keyboard hook, message pump)
 + Removed FreeLibrary hook, memory leaks in other software were being caught
     while debugging... it was obnoxious ;)
 + Fixed SteamAPI_Init being called instead of SteamAPI_Init_Detour
 + Fixed DirectDraw issues in Disgaea2 (presumably for video playback)
 + Fixed LoadLibraryW unhook during shutdown (had been unhooking LoadLibraryA)
 + Disabled relative mouse move in NieR: Automata - it always sends legacy input
 + Fixed problems dispatching keyboard input early from PeekMessage caused
     in Mass Effect: Andromeda
 + Added pirate tooltips to EULA ;)
 + Added resolution warning to EULA screen
 + Fixed license text truncation on EULA screen
 + Added code to compensate for games that pull WM_KEYDOWN messages out of the
     pump by using PeekMessage* with PM_REMOVE set.
 + Enabled relative mouse motion from RawInput in any game that tries to capture
     mouse input non-cooperatively.
 + Added support for wrapping d3d8.dll, no native renderer exists or ever will,
     the project relies on optional third-party API wrappers for legacy APIs.
 + Optional dgVoodoo support added, place the (all 32-bit) DLLs in
     Documents\My Mods\Special K\PlugIns\ThirdParty\dgVoodoo\
 + Fixed-up floating-point exception handling in Prey

--------- (Initial GitLab Migration) ---------