; ------------------------------------------------------------------------------------------------------
; ****** ECHO by DHR ******
; Fix: Shadows, Lights, Decals, Specular lights, Light Shafts, Models, Halos and others.
; Use EFFECT QUALITY = LOW
; ------------------------------------------------------------------------------------------------------

;------------------------------------------------------------------------------------------------------
; Logging options.
; Comment line or set value to 0 for no logging.
;------------------------------------------------------------------------------------------------------
[Logging]

; Log all API usage
calls=0

; Log Input key actions
input=0

; Super verbose massive log
debug=0

; Unbuffered logging to avoid missing anything at file end
unbuffered=0

; Force the CPU affinity to use only a single CPU for debugging multi-threaded
force_cpu_affinity=0

; Log NVAPI convergence modifications
convergence=0
; Log NVAPI separation modifications
separation=0


; ------------------------------------------------------------------------------------------------------
; Default constants to pass directly to shaders as IniParams
; ------------------------------------------------------------------------------------------------------
[Constants]
x = 0.6
; y = 1.0
; z = 1.2
; w = 2.0

; x7 is used by the 3DVision2SBS custom shader. To use, find the [Present]
; section below and uncomment the 'run = CustomShader3DVision2SBS' line.
; 0 = Regular 3D Vision
; 1 = Reversed 3D Vision
; 2 = Side by Side
; 3 = Reversed Side by Side
; 4 = Top and Bottom
; 5 = Reversed Top and Bottom
; 6 = Line interlacing
; 7 = Reversed Line interlacing
x7 = 5


;------------------------------------------------------------------------------------------------------
; Custom settings override for any of [convergence, separation, x, y, z, w]
;
; Four types are supported - by default the bindings will simply load the
; configured settings, but type=hold can be specified to have a preset
; active while the button is held, type=toggle can be used to make a simple
; on/off toggle, and type=cycle can be used to cycle between several presets.
;
; Delays (type=hold only) and linear or cosine trasition periods (any key type)
; can be used to better synchonrise setting changes to the game's animations,
; or to smoothly adjust UI elements over a short period of time.
;
; Key bindings: For A-Z and 0-9 on the number row, just use that single
; character. For everything else (including mouse buttons), use the virtual key
; name (with or without the VK_ prefix) or hex code from this article:
; http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
;
; Key combinations can be specified by separating key names with spaces, e.g.
; "Shift Q". It is also possible to indicate that a key must *not* be held for
; the binding to activate, e.g. "NO_ALT F1" would prevent the binding from
; activating when taking a 3D Screenshot with Alt F1. "NO_MODIFIERS" may be
; used as a shorthand for excluding all standard modifiers (Ctrl, Alt, Shift,
; Windows).
;
; Keys can also be from XBox controllers using:
;   XB_LEFT_TRIGGER, XB_RIGHT_TRIGGER,
;   XB_LEFT_SHOULDER, XB_RIGHT_SHOULDER,
;   XB_LEFT_THUMB, XB_RIGHT_THUMB,
;   XB_DPAD_UP, XB_DPAD_DOWN, XB_DPAD_LEFT, XB_DPAD_RIGHT,
;   XB_A, XB_B, XB_X, XB_Y, XB_START, XB_BACK, XB_GUIDE
; By default all attached controllers are used - to associate a binding with a
; specific controller add the controller number 1-4 to the prefix, like
; XB2_LEFT_TRIGGER, though this may be more useful for hunting than playing.
;------------------------------------------------------------------------------------------------------

; Example to support momentary hold type overrides, like aiming.
[Key_HUD]
Key = P
type = cycle
x = 0.7, 0.8, 0.9, 0.6


; Example for a toggle override.
;[Key3]
;Key = q
;separation = 0.1
;type = toggle
;y = 0.0

; Example for a momentary hold, but with a delay followed by a smooth
; transition (ms) on hold and release to sync better with the game. Note that
; delay only works with type=hold (for now), while transitions will work with
; all types.
;[Key4]
;Key = XB_LEFT_TRIGGER
;type = hold
;y = 0.25
;delay = 100
;transition = 100
;transition_type = linear
;release_delay = 0
;release_transition = 500
;release_transition_type = cosine

; Example of a cycle transition that might be used to provide several presets
; that set both convergence and UI depth to suit different scenes in a game.
; Cosine transitions are used to smooth the changes over 1/10 of a second.
;[Key5]
;Key = Q
;type = cycle
;convergence = 1.45, 1.13, 0.98
;z           = 0.25,  0.5, 0.75
;transition = 100
;transition_type = cosine

; Example of a preset override that can be referenced by one or more [ShaderOverride*]
; sections which can be activated / deactivated automatically when one of the shader
; overrides is activated / deactivated. This is useful for setting automatic
; convergence for specific scene.
;[Preset1]
;convergence = 0
;transition = 100
;transition_type = linear


;------------------------------------------------------------------------------------------------------
; Shader hunting options.
; Default setup is to use keyboard similar to Helix presets
;------------------------------------------------------------------------------------------------------
[Hunting]

; 0: Release mode is with shader hunting disabled, optimized for speed.
; 1: Hunting mode enabled
; 2: Hunting mode "soft disabled" - can be turned on via the toggle_hunting key
hunting=0

; Highlight mode of currently selected shader / rendertarget.
; "skip" = skip shader. don't render anything using the currently selected shader.
; "original" = fall back to original shader if the currently selected shader was patched.
; "pink" = make the output hot pink to make it standout.
; "mono" = disable stereo for the selected shader / rendertarget.
; "zero" = shader output is all zero. NOTE: this has a big performance impact.
marking_mode=skip

; Key bindings: For A-Z and 0-9 on the number row, just use that single
; character. For everything else (including mouse buttons), use the virtual key
; name (with or without the VK_ prefix) or hex code from this article:
; http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
;
; XBox controllers are supported using the same bindings as the [Key] sections
; (see above). If the game already uses the first controller you might try
; using the second controller for hunting with e.g. XB2_LEFT_SHOULDER

; rotate through all VISIBLE pixel shaders at the current scene.
previous_pixelshader = no_modifiers VK_NUMPAD1
next_pixelshader = no_modifiers VK_NUMPAD2
mark_pixelshader = no_modifiers VK_NUMPAD3

; rotate through all VISIBLE vertex shaders at the current scene.
previous_vertexshader = no_modifiers VK_NUMPAD4
next_vertexshader = no_modifiers VK_NUMPAD5
mark_vertexshader = no_modifiers VK_NUMPAD6

; rotate through all USED index buffers at the current scene.
previous_indexbuffer = no_modifiers VK_NUMPAD7
next_indexbuffer = no_modifiers VK_NUMPAD8
mark_indexbuffer = no_modifiers VK_NUMPAD9

; rotate through all USED render targets at the current scene.
previous_rendertarget = no_modifiers VK_DIVIDE
next_rendertarget = no_modifiers VK_MULTIPLY
mark_rendertarget = no_modifiers VK_SUBTRACT

; rotate through all VISIBLE geometry shaders at the current scene.
; This is disabled since these keys are commonly pressed while alt+tabbed out
;previous_geometryshader = no_modifiers <
;next_geometryshader = no_modifiers >
;mark_geometryshader = no_modifiers /

; rotate through all VISIBLE domain shaders at the current scene.
; This is disabled since these keys are commonly pressed while alt+tabbed out
;previous_domainshader = no_modifiers [
;next_domainshader = no_modifiers ]
;mark_domainshader = no_modifiers \

; rotate through all VISIBLE hull shaders at the current scene.
; This is disabled only because it is rarely needed
;previous_hullshader = no_modifiers MINUS
;next_hullshader = no_modifiers EQUALS
;mark_hullshader = no_modifiers BACKSPACE

; rotate through all USED compute shaders at the current scene.
; Disabling compute shaders may cause crashes, so these are
; not enabled by default:
previous_computeshader = no_modifiers PAGE_UP
next_computeshader = no_modifiers PAGE_DOWN
mark_computeshader = no_modifiers HOME

; Re-enable shaders once done with hunting:
done_hunting = no_modifiers VK_ADD

; Screenshot as pns
take_screenshot = no_modifiers VK_SNAPSHOT

; reload all fixes from ShaderFixes folder
reload_fixes = no_modifiers VK_F10

; Key to turn hunting itself on/off.  This will also show/hide overlay.
; Hunting must be set to either 1 or 2 to enable this toggle.
toggle_hunting = no_modifiers VK_NUMPAD0

; Key to reload the settings from the the d3dx.ini without restarting. This can
; be the same key as reload_fixes for convenience, or a different key may be
; used to avoid resetting the ini parameters every time the shaders are
; reloaded. Note that not all settings can be reloaded, so if something doesn't
; work as expected you may still have to restart the game:
reload_config = no_modifiers VK_F10

; Hold this key to temporarily disable the fix - useful to quickly check what
; an effect looked like in the original game.
show_original = no_modifiers VK_F9

; snapshots to be made upon any shader Mark.  These give you snapshot when the
; shader is disabled, as a way to correlate image to shader hash.
;  mark_snapshot=0  // none
;  mark_snapshot=1  // mono, simple snapshot
;  mark_snapshot=2  // stereo snapshot
mark_snapshot=2

; Auto-repeat key rate in events per second.
repeat_rate=6


; tunable parameter to use in modified shaders as variable (StereoParams.Load(int3(1,0,0)).xyzw)
; enabling tuning results in a small performance hit because the parameter texture
;tune_enable=1
;tune_step=0.1
;tune1_up=VK_INSERT
;tune1_down=VK_DELETE
;tune2_up=X
;tune2_down=Z


; Dumps out a flight log of DirectX state changes and the contents of each
; render target after every immediate draw call for the next frame. Takes up a
; large amount of space, so disabled by default.
;analyse_frame = no_modifiers VK_F8

; Specifies options for the frame analysis feature. Options can be combined by
; separating them with a space.
;          log: This option is now always enabled - Logs draw calls and state
;               changes (one log file per context)
;         hold: Continue analysing subsequent frames while the key is held
;  dump_rt_jps: Dumps out render targets as JPS files. These are the easiest to
;               work with and don't take up as much space as DDS files, but they
;               are not dumped for every render target and are missing some data.
;  dump_rt_dds: Dumps out render targets as DDS files. WARNING: This option may
;               require hundreds of gigabytes and a long time! Only use it if
;               you absolutely need more information than you can get otherwise.
;               Will also dump buffer type render targets & UAVs as .buf files.
;      dump_rt: Dumps render targets as JPS files when possible, or DDS when not.
;     clear_rt: Clears each render target the first time they are used in the
;               frame. Makes it easier to see what is being drawn if the game
;               doesn't clear them, but might cause some effects not to render.
;   dump_depth: Dumps depth/stencil targets as DDS files
; dump_tex_jps: Dumps textures as JPS files
; dump_tex_dds: Dumps textures as DDS files (Same warning as for dump_rt_dds)
;               Will also dump buffer type shader resource views as .buf files.
;     dump_tex: Dumps textures as JPS files when possible, or DDS when not.
;      dump_cb: Dumps constant buffers as binary .buf files
;  dump_cb_txt: Decodes constant buffers as an array of float4s
;      dump_vb: Dumps vertex buffers as binary .buf files
;  dump_vb_txt: Decodes vertex buffers as an array of float4s
;      dump_ib: Dumps index buffers as binary .buf files
;  dump_ib_txt: Decodes index buffers
; filename_reg: Normally the draw number is the first part of the filename so
;               that the files will be sorted in the order they were used in
;               the game. Sometimes it is more desirable to examine how a
;               specific output changed through the frame and this option will
;               place the register number first in the filename to allow that.
;         mono: Dump out mono textures instead of stereo. To dump both, specify
;               'mono stereo'. If neither are specified, defaults to stereo.
;dump_on_unmap: Dumps buffers/textures whenever the game maps them to the CPU
;               with the Map() / Unmap() calls. Typically used to update
;               constant buffers.
; analyse_options can also be specified in [ShaderOverride*] and
; [TextureOverride*] sections to set up triggers to change the options mid-way
; through a frame analysis, either for a single draw call (default), or
; permanently (by adding the 'persist' keyword).
;analyse_options = dump_rt_jps clear_rt



;------------------------------------------------------------------------------------------------------
; Chain load other wrapper DLLs instead of system DLLs.
;------------------------------------------------------------------------------------------------------
[System]

;proxy_d3d9=d3d9_helix.dll
;proxy_d3d11=d3d11_helix.dll

; Options to use hooking instead of wrapping. Used in MGSV. Possible objects to hook include:
;   deferred_contexts
;   immediate_context
;   device
;   all - all of the above
; crash/hang workarounds:
;   except_set_shader_resources - work around crash on Win 7 with evil update
;   except_set_samplers - work around crash on Win 10
;   except_set_rasterizer_state - work around crash on Win 7 without evil update
;   skip_dxgi_factory - hack for MGSV, not recommended for other games as it
;                       may disable core 3DMigoto functionality in some cases
;   skip_dxgi_device - hack for MGSV on Win10 anniversary update
;   recommended - hook supported objects, safe workarounds enabled, skips not enabled
;hook=recommended

; Options to allow IDXGIFactory2 to be created and wrapped.  We have typically had good
; luck with returning an error for all non-dx11 requests, but some games error out
; with these checks in place.
; The allow_create_device allows D3D10 Device creation and is needed for some games.
; It has two options, allow_create_device=1, which will allow anything to go through
; without returning an error, and allow_create_device=2, which will force all requests
; to become D3D11 Devices, no matter what was passed in.
; The allow_platform_update option allows the D3D11Device1 and D3D11Context1
; interfaces introduced in Windows 8 and the platform update of Windows 7.
;
; Start with allow_check_interfaces, if that doesn't work then try allow_dxgi1_2,
; then try allow_create_device=2, lastly try allow_create_device=1
;
; Setting allow_dxgi1_2=2 may allow the Steam Overlay and Steam Controller to
; work in some games on Windows 7 and Windows 8, but could potentially disable
; core functionality in some cases, so only enable it if you need it.
;
allow_check_interface=0
allow_dxgi1_2=0
allow_create_device=2
allow_platform_update=0


;------------------------------------------------------------------------------------------------------
; Settings to force display device to a specific mode.
; Uncomment a value to force the specific setting.
;------------------------------------------------------------------------------------------------------
[Device]

; (0) - disable upscaling
; (1) - enable upscaling and allows the game to disable and enable fullscreen mode
; (2) - enable upscaling and don't allow the game to switch fullscreen mode
;       (always force fullscreen). Try this if you get issues with the mouse cursor.
; Note if you enable upscaling please do not forget to:
;   1) Uncomment "run = CustomShaderUpscale" in the [Present] section,
;      otherwise you will see only a black window (with game sound).
;   2) Set a custom resolution here for width and height that the game will see.
;   3) Uncomment upscale_mode here.
upscaling = 0

; Force override the screen resolution.
; If upscaling is on, the resizing functionality is disabled.
; If upscaling is on, then you MUST specify the resolution the game will be upscaled to.
; To achieve the best visual result use the native resolution of your tv or monitor.
;width=1280
;height=720

; upscale_mode = 0: 3Dmigoto creates a texture and pushes it as the back buffer for the game.
; Seems to work with only few games but everything seems to run a bit smoother.
; upscale_mode = 1: 3Dmigoto creates a second swap chain and pushes the game to use it.
; Seems to work with most games. dont forget to activate upscaling shader in [present] section
;upscale_mode = 1


; overrides refresh rate set by game.
;refresh_rate=60

; filters available video modes to those providing given refresh rates.
; some games don't explicitely set the refresh rate, but use the video mode.
; use this if setting refresh_rate doesn't work.
;filter_refresh_rate=24,59,60

; full_screen=1 forces creation of full screen devices and swap chains.
; use this for 3dtvplay if game won't active stereo mode.
; full_screen=2 will also disable SetWindowPos which might help in some games.
full_screen=0

; This toggles forcing the full screen mode on and off. It will not take effect
; immediately, but will change what happens the next time the game tries to
; change the fullscreen mode. This is a specific hack to workaround a bug in
; Unity games, which crash when alt+tabbing out from exclusive mode fullscreen.
;
; To switch out of a Unity game without it crashing:
; Enable this option, Press F7, Alt+Enter, Alt+Tab
;toggle_full_screen = no_modifiers VK_F7

; some games explicitely disable stereo, prohibiting any stereo attempts.
; Setting this to 1 ignores all stereo disabling calls and also calls
; NvAPI_Stereo_Enable to force stereo on.
; Setting this to 2 sets 3Dmigoto to use 3D Vision Direct Mode
force_stereo=0

; almost all DX11 games deactivate window message handling.
; setting this to 1 reenables print screen handling, alt-tab key handling etc.
;allow_windowcommands=1

; Indicates where the resolution is obtained for texture hashes. Comment this
; out to never special case hashes that match the resolution or a multiple.
; Possible values are swap_chain and depth_stencil. Recommended to test which
; works for a given game (e.g. CryEngine always creates a swap chain that
; matches the native resolution so has to use depth_stencil).
get_resolution_from = swap_chain

; This will hide the hardware mouse cursor, for use in conjunction with the
; software mouse cursor by uncommenting 'run = CustomShaderSoftwareMouse' in
; the [Present] section. The hardware mouse cursor cannot be moved to depth and
; cannot be used in conjunction with the side-by-side or top-and-bottom output
; modes, so using a software mouse cursor is recommended in those cases.
; NOTE: IT IS RECOMMENDED TO RESTART THE GAME AFTER CHANGING THIS SETTING!
hide_cursor = 1


;------------------------------------------------------------------------------------------------------
; Settings for NVidia stereo driver.
;------------------------------------------------------------------------------------------------------
[Stereo]

; games which have their own stereo renderer disable the NVidia automatic
; stereo mode and render themselves into stereo buffers (Crysis 3 for example).
; Setting this to 1 disables the game stereo renderer and enables NVidia auto stereo mechanism.
; This also forces 'false' as a return for any request for NvAPI_Stereo_IsEnabled.
automatic_mode=0

; Some games (CryEngine games, for example) lock the separation & convergence
; to a specific value, which can be undesirable. Set this to 1 to ignore these
; requests from the game to unlock the separation:
unlock_separation=0
unlock_convergence=0

; games without predefined profiles can't save stereo settings.
; enabling this options automatically creates a profile for unknown games.
; Note that there is now a more flexible means to alter the game's profile -
; refer to the [Profile] section.
create_profile=0

; sets the global surface creation heuristic for NVidia stero driver.
; 0 = NVAPI_STEREO_SURFACECREATEMODE_AUTO - use driver registry profile settings for surface creation mode.
; 1 = NVAPI_STEREO_SURFACECREATEMODE_FORCESTEREO - Always create stereo surfaces.
; 2 = NVAPI_STEREO_SURFACECREATEMODE_FORCEMONO - Always create mono surfaces.
;surface_createmode=1

; overrides surface creation mode for square surfaces.
;surface_square_createmode=1

; Force the NvAPI_Initialize to return an error so that games think stereo and NVidia is unavailable.
force_no_nvapi=0


;------------------------------------------------------------------------------------------------------
; Settings for GPU manipulations.
; Render settings override
;------------------------------------------------------------------------------------------------------
[Rendering]

; GPU program manipulations.

; Type of shader hashes in use:
;   3dmigoto = Traditional hash used by 3DMigoto (unseeded software FNV-1)
;   embedded = Use the first half of the MD5-like hash embedded within the
;              shaders to skip the hash calculation altogether.
;   bytecode = Only hash bytecode and signatures with hardware accelerated
;              CRC32C. Used to minimise duplicate shaders in certain games, but
;              potentially carries a higher risk of hash collisions between
;              unrelated shaders in some games (e.g. that only differ in
;              variable names). May occasionally avoid hash changes on game
;              updates due to changes in the game developer's build environment
;              (shader compiler version, build path embedded in debug info,
;              constants renamed, etc). Will not avoid hash changes if the
;              shader code, constant values, etc are changed.
shader_hash = 3dmigoto

; Shaders in game will be replaced by these custom shaders.
override_directory=ShaderFixes

; Automatically patched shaders will be written here if caching is enabled.
cache_directory=ShaderCache

; Shaders that are directly compiled by the game, instead of binary, go here.
storage_directory=ShaderFromGame

; cache all compiled .txt shaders into .bin. this removes loading stalls.
cache_shaders=1

; thread save data structure access. required on multithreaded rendering.
use_criticalsection=1

; Indicates whether scissor clipping should be disabled by default.
; If you set rasterizer_disable_scissor=0, you can selectively disable scissor
; for individual shaders by setting disable_scissor=1 in [ShaderOverride*]
; sections. Or you can also set rasterizer_disable_scissor=1 here and then
; selectively enable scissor for individual shaders by setting disable_scissor=0
; in [ShaderOverride*] sections.
rasterizer_disable_scissor=1

; Tracks copies and updates to textures which may cause their hash to become
; out of sync with their contents - enable if texture hashes seem unreliable:
;track_texture_updates=1

; Registers where the StereoParams and IniParams textures will be assigned -
; change if the game already uses these registers. Newly decompiled shaders
; will use the new registers, but existing shaders will not be updated - best
; workflow is to remove ShaderCache after changing these and run a search and
; replace on all shaders in ShaderFixes. Set to -1 to disable if not required.
stereo_params = 125
ini_params = 120

; Set to 1 to assemble the Input / Output / Patch Constant signature comments
; in shader assembly to allow them to be changed for passing new values between
; pipeline stages. Be careful with these comments if this is enabled - treat
; them like code! If set to 0 the assembler will use the old behaviour and
; re-use the sections from the unmodified shaders.
assemble_signature_comments = 1

;------------------------------------------------------------------------------------------------------
; Analyzation options.
;
; save all autofixed shaders as HLSL
export_fixed=0

; save all shaders sent to DX11 as ASM, or as HLSL text files if compiled by game.
export_shaders=0

; save all shaders seen as HLSL code, autofixed or not. 1= HLSL only, 2=HLSL+OriginalASM, 3=HLSL+OriginalASM+RecompiledASM
export_hlsl=0

; stores a ShaderUsage.txt file on any marking button press.
dump_usage=0

;------------------------------------------------------------------------------------------------------
; Automatic shader fixes. Those settings here apply only on newly read shaders.
; All existing *_replace.txt or *_replace.bin files are not tampered with.
; If you change settings here, the best workflow is to delete all shaders in
; the shader cache directory and let them be fixed again.

; Stereoize all shader parameters with position semantic.
fix_sv_position=0

; Pixel depth evaluation.
;fix_ZRepair_DepthTexture1=SceneDepthTexture.x
;fix_ZRepair_Dependencies1=MinZ_MaxZRatio
;fix_ZRepair_ZPosCalc1=zTex * MinZ_MaxZRatio.z - MinZ_MaxZRatio.w
;fix_ZRepair_DepthTexture2=SceneDepthTexture.x
;fix_ZRepair_Dependencies2=
;fix_ZRepair_ZPosCalc2=zTex
;fix_ZRepair_PositionTexture=PositionTexture
;fix_ZRepair_PositionCalc=1024 * %s

; Inject depth texture if other depth sources are unavailable.
;fix_ZRepair_DepthTextureHash=8a19f087b004598f

; Correct inverse transformations in pixel shaders using evaluated depth.
;fix_InvTransform=ScreenToLight,InverseTranslatedViewProjectionMatrix

; Back projection coordinate fix.
;
; Available variables in expressions:
; stereoParams.x = Separation value in range [0..1] or [-0..-1] dependent on active eye
; stereoParams.y = Convergence value in w coordinates (1/z)
; stereoParams.z = -1/1 for left/right eye
; stereoParams.w = Separation value without eye separation
; stereoTune.x = tune value 1 (default is 1)
; stereoTune.y = tune value 2 (default is 1)
; stereoTune.z = tune value 3 (default is 1)
; stereoTune.w = tune value 4 (default is 1)
; stereoScreenRes.x = Primary swap chain backbuffer horizontal resolution
; stereoScreenRes.y = Primary swap chain backbuffer vertical resolution
; zpos = current pixel z position in pixel shader
; wpos = current pixel w position in pixel shader

; Send inverse transformations from vertex shaders to pixel shaders.
;fix_BackProjectionTransform1=ScreenToTranslatedWorldMatrix._m00,ScreenToTranslatedWorldMatrix._m02,ScreenToTranslatedWorldMatrix._m01
;fix_BackProjectionTransform2=ScreenToWorld._m00,ScreenToWorld._m02,ScreenToWorld._m01

; Position variables to correct in pixel shaders.
;fix_ObjectPosition1=PointPositionAndInverseRadius
;fix_ObjectPosition1Multiplier=1, (stereoScreenRes.x/stereoScreenRes.y)*0.5, -0.5
;fix_ObjectPosition2=SpotPositionAndInverseRadius
;fix_ObjectPosition2Multiplier=1, (stereoScreenRes.x/stereoScreenRes.y)*0.5, -0.5

; Matrix multiplications to correct in pixel shaders.
;fix_MatrixOperand1=TranslatedWorldToShadowMatrix
;fix_MatrixOperand1Multiplier=1, (stereoScreenRes.x/stereoScreenRes.y)*0.5 - viewDirection.z*0.05 + (0.02791946-stereoParams.x/stereoParams.w), 0

; autofix shader option: recompiles all vertex shaders. fixes minor differences in deferred rendering.
;recompile_all_vs=0

;------------------------------------------------------------------------------------------------------
; Shader manipulations without patches + shader filtering.
;------------------------------------------------------------------------------------------------------
;[ShaderOverride_Menu_Hunting]
;Hash=63fa2c0019a0bd72
;Handling=skip

[ShaderOverride_SpotShadows]
Hash=8f49298a53a78f48
Handling=skip



; Custom stereo separation value while rendering objects using this shader.
;Separation=0
; Custom stereo convergence value while rendering objects using this
; shader (e.g. convergence=0 will move an object to infinity).
;Convergence=0
; don't draw anything using this shader.
;Handling=skip
; Use replaced shader only when there is/is not an active depth buffer (for UI filtering)
; Deprecated: use 'x = oD' instead, and test for negative zero in the shader with
; if (asint(IniParams[0].x) == asint(-0.0)) { /* depth inactive */ } else { /* depth active */ }
;depth_filter = depth_inactive
;depth_filter = depth_active
; Only use replaced shader when it is used in conjunction with a specific shader
; (e.g. to adjust a vertex shader ONLY when it is used with a specific pixel shader)
;partner=af7b880f07630615
; Override a value from [Constants] when this shader is used:
;x=2.0
; Pass the dimensions of the active render target and resolution (obtained with
; get_resolution_from) into the shader:
;x1=rt_width
;y1=rt_height
;z1=res_width
;w1=res_height
; Use t0 from active pixel shader for texture filtering. Will be 0 if no
; [TextureOverride*] section exists for the texture or 1 if one does. For advanced
; filtering, set a value for filter_index in the [TextureOverride] section.
; This also works with other slot types (like o0, oD, ib, etc).
;x2=ps-t0
; Override the shader model to allow using newer features like Texture2DMS:
;model=vs_5_0
; Activate a preset section when this shader override is in use.
;preset = 1
; Disable scissor clipping for this shader when rasterizer_disable_scissor=0 in
; [Rendering] section. Or set this to 0 to enable scissor clipping for this shader
; when rasterizer_disable_scissor=1 in [Rendering] section.
;disable_scissor = 1
; There's also support for copying textures, constant buffers, depth buffers,
; etc. from one shader to another. This is a complex topic - see this page:
;    https://github.com/bo3b/3Dmigoto/wiki/Resource-Copying


;------------------------------------------------------------------------------------------------------
; texture / render target manipulations
;------------------------------------------------------------------------------------------------------
;
; NOTE: If you are trying to match a texture the same size as the resolution (or
; a /2, x2, x4 or x8 multiple), you should confirm that the same hash is used
; on different resolutions, and adjust get_resolution_from if necessary.
;
; NOTE: If you find a texture hash seems to change inconsistently, try enabling
; track_texture_updates in the [Rendering] section.
;
;[TextureOverride1]
;Hash=c3e55ebd
; NVidia stores surface creation mode heuristics in the game profile. setting
; this option overrides the creation mode for a given texture / buffer.
; 0 = NVAPI_STEREO_SURFACECREATEMODE_AUTO - use driver registry profile settings.
; 1 = NVAPI_STEREO_SURFACECREATEMODE_FORCESTEREO - create stereo surface.
; 2 = NVAPI_STEREO_SURFACECREATEMODE_FORCEMONO - create mono surface.
;StereoMode=2

;[TextureOverride2]
;Hash = e27b9d07
; Prevent the game reading from this texture - will give the game a blank
; buffer instead. Used to prevent CryEngine games falsely culling objects. Use
; debug logging and look for Map calls to identify possible hashes.
;deny_cpu_read=1
; Expand the region copied to this texture with CopySubresourceRegion (similar
; issue to rasterizer_disable_scissor). Used to solve issues with transparent
; refraction effects (like glass) in CryEngine games.
;expand_region_copy=1


;------------------------------------------------------------------------------------------------------
; Example of settings override by mouse button configuration
; Mapping of from game provided hard coded convergence values to custom values
; Those are values for L.A. Noir
; Example of settings override by mouse button configuration
;------------------------------------------------------------------------------------------------------
;[ConvergenceMap]

;Map1=from 3e99999a to 0.3
;Map2=from 3f800000 to 1.0
;Map3=from 3f666666 to 0.9


;------------------------------------------------------------------------------------------------------
; Updates the game's driver profile on launch.
;
; Any changes here will require the user to OK a UAC prompt the first time they
; run the game, but the DLL tries to only do that if it is actually required.
;------------------------------------------------------------------------------------------------------
[Profile]
; This setting should always be added to a profile - it is required for a
; number of other settings to work, as well as allowing the convergence to be
; saved. If you are customising a profile you should **always uncomment this**:
StereoProfile = 1
;
; This setting enables stereo compute shaders (0x00004000), which is required
; to fix a lot of "one eye" type rendering issues in many DX11 games, and
; allows stereo2mono and the side-by-side / top-and-bottom output modes to work
; in SLI (0x00000008):
StereoFlagsDX10 = 0x00004008
StereoTextureEnable = 0x00000027
;
; This sets the default convergence in the profile. Note that 3DMigoto will
; happily override the default value from the driver, but will only override
; the user's custom convergence if it has another reason to update the profile,
; such as a change to another setting (adding a version tag to the Comments
; setting would be one way to force an update):
StereoConvergence = 96
;
; This changes the green text that the driver displays, and is a good place to
; put any reminders to display to the user or just take some credit:
Comments = "3Dfix by DHR, donations to dhr.donation@gmail.com. Use Effect = LOW"
;
; Change the rating: "0": 3D Vision Ready, "1": Excellent, "2": Good,
;                    "3": Fair, "4": Not Recommended
Compat = "0"
;
; If you have added some comments, you probably want to force the green text to
; show up when the game is next run. Note that like convergence, 3DMigoto will
; only override a user setting here if something else has also been updated
; (such as Comments), so this will usually only show up the first time a user
; runs the game after installing the fix (be sure to enable StereoProfile).
StereoMemoEnabled = 1
;
; Disable compatibility mode to make sure users are seeing the real deal. Like
; convergence, 3DMigoto will respect the users custom settings here:
;Disable2DD = 1
;
; Put a reminder in the green text of compatibility mode that they are not
; seeing the real deal:
;2DD_Notes = "Compatibility mode is enabled. To use the fix, please disable it with Ctrl+Alt+F11"
;
; These two options change which constant buffers the driver uses to pass the
; separation and convergence to any Vertex and Domain shaders it has modified.
; The default value is 12, and you may need to change it if the game already
; uses that constant buffer for any purpose, which should be apparent as you
; will see 2D geometry on any shader that uses this. You should avoid using
; these constant buffers yourself unless you understand the nuances involved.
;DX10VSCBNumber = 12
;DX10DSCBNumber = 12
;
; If a setting doesn't have a name or you don't know what it is (check the
; d3d11_log.txt for the names of all settings in this profile), you can use the
; hex ID (in fact, you can even paste a complete profile from Geforce Profile
; Manager - just be sure to delete any corrupt string settings if you do):
;0x1033cec2 = 0x00000002
;
; There are many more options, and we have tried to document them here -
; *please* edit this page if you figure out anything new:
; http://wiki.bo3b.net/index.php?title=Driver_Profile_Settings


;------------------------------------------------------------------------------------------------------
; This section defines a shortcut for unbinding all render and depth targets,
; which is commonly needed in [CustomShader] sections since all bound render
; and depth targets *must* be the same size, and leaving something else bound
; is a sure way for things to go weirdly wrong. Call it from any section that
; supports a command list with 'run = CommandListUnbindAllRenderTargets' after
; you have copied any state you need from these and before binding your own.
;------------------------------------------------------------------------------------------------------
[CommandListUnbindAllRenderTargets]
o0 = null
o1 = null
o2 = null
o3 = null
o4 = null
o5 = null
o6 = null
o7 = null
oD = null

;------------------------------------------------------------------------------------------------------
; Commands to run from the Present call at the start/end of each frame
;
; Useful to clear custom resources or ini params at the start of each frame, or
; to run a custom shader to do whatever you can dream up. The post keyword will
; make an action run at the start of a frame instead of the end - as general
; guideline you want overlays drawn at the end of a frame and resources cleared
; at the start of a new frame.
;------------------------------------------------------------------------------------------------------
[Present]
; Example: Clear an ini param at the start of each frame:
;post x = 0
; Example: Clear a custom resource at the start of each frame:
;post ResourceDepthBuffer = null

; Uncomment to enable a custom shader that allows the stereo output mode to be
; upscaled. NOTE: uncomment only if 'upscaling' and resolution are not zero.
;run = CustomShaderUpscale

; Uncomment to enable a custom shader that implements a software mouse cursor.
; Use in games that use a hardware cursor if you want to be able to adjust the
; stereo depth of the mouse, or to work with the below 3DVision2SBS shader.
; You should also set 'hide_cursor = 1' under [Device] to suppress the hardware
; mouse cursor. Note that this shader will use w5, x6, y6, z6, w6, y7, z7 and
; w7, and has a higher latency than the hardware cursor!
run = CustomShaderSoftwareMouse

; Uncomment to enable a custom shader that allows the stereo output mode to be
; changed to Side-by-Side or Top-and-Bottom. If you are using SLI and this
; isn't working properly (partially blank or stuck image) you may need to also
; set StereoFlagsDX10 = 0x00000008 in the [Profile] section:
;run = CustomShader3DVision2SBS

;------------------------------------------------------------------------------------------------------
; The following custom shader can be used to perform upscaling to arbitrary resolutions,
; specifically useful for 4K 3D TVs or for DSR. To enable, uncomment the
; ";run = CustomShaderUpscale" in the Present section, set the custom resolution and
; enable "upscaling=1" in the Device section.
; If you uncomment upscale shader without actually enabling the upscaling in [Device]
; you might have wrong screen resolution or the game will not be able to enter the fullscreen mode.
; Both Upscaling and SBS can be used at the same time.

[Resource3DVisionUpscaleBackupTexture]
[CustomShaderUpscale]
; Load a custom vertex + pixel shader:
vs = ShaderFixes/upscalevs.hlsl
ps = ShaderFixes/upscaleps.hlsl
; Explicitly unbind other shader types for safety:
hs = null
ds = null
gs = null
; Disable the OM blend stage that could interfere with the shader:
blend = disable
; Disable front/back face culling so the vertices can be in any rotation:
cull = none
; enable sampler with the filter: anisotropic_filter, linear_filter, point_filter
sampler = anisotropic_filter
; Use a triangle strip topology so we only have to output four vertices:
topology = triangle_strip
; Clear all render + depth targets to avoid compatibility issues:
run = CommandListUnbindAllRenderTargets
; Bind the back buffer as a render target. set_viewport ensures that the view
; port is the size of the buffer so the draw call will work. No no_view_cache
; seems to make some games crash. Just play around with it if something is not working
; is necessary for a few games like Mad Max:
o0 = set_viewport bb
; Back up any textures that were in the ps-t100 slot. The CustomResource
; section will already back up a lot of state, including shaders, render
; targets, depth targets, UAVs, viewports, blend state, rasterizer state,
; primitive topology, etc. but it does not back up textures:
Resource3DVisionUpscaleBackupTexture = reference ps-t101
; Use faked bb to give the shader access to the back buffers of
; both eyes:
; f_bb is the faked swap chain that has the game resolution
ps-t101 = f_bb
; Some rare games (e.g. Onechanbara Z2) use MSAA back buffers, which cannot be
; directly used with the reverse stereo blit and must be resolved to non MSAA
; versions first. The symptoms will be a black screen after enabling this
; shader with F11. In that case, replace the above line with these two:
; upscaling with msaa swap chain is currently only avialable if upscale_mode = 1
; ps-t100 = resolve_msaa f_bb
; Draw four vertices. The vertex shader will construct coordinates to cover the
; full screen using the SV_VertexID semantic so we don't need vertex buffers:
draw = 4, 0
; Restore the original texture from the ps-t100 slot:
post ps-t101 = reference Resource3DVisionUpscaleBackupTexture

;------------------------------------------------------------------------------------------------------
; The following custom shader renders the mouse cursor in software, which can
; allow it's stereo depth to be adjusted and can work with the side-by-side /
; top-and-bottom output modes - to enable this uncomment the 'run =
; CustomShaderSoftwareMouse' in the [Present] section, and set 'hide_cursor =
; 1' in the [Device] section. Edit the bottom of mousevs.hlsl to adjust the
; stereo depth of the cursor as desired. Note that this shader uses w5, x6, y6,
; z6, w6, y7, z7 and w7, and has a higher latency than the hardware cursor!

[ResourceSoftwareMouseBackupTexture1]
[ResourceSoftwareMouseBackupTexture2]
[ResourceSoftwareMouseBackupTexture3]
[ResourceSoftwareMouseBackupTexture4]
[CustomShaderSoftwareMouse]
; Load software mouse shaders and explicitly unbind other shaders for safety:
vs = ShaderFixes/mousevs.hlsl
ps = ShaderFixes/mouseps.hlsl
hs = null
ds = null
gs = null
; Disable front/back face culling so the vertices can be in any rotation:
cull = none
; Use a triangle strip topology so we only have to output four vertices:
topology = triangle_strip
; Clear all render + depth targets to avoid compatibility issues:
run = CommandListUnbindAllRenderTargets
; Bind the back buffer as a render target. set_viewport ensures that the view
; port is the size of the buffer so the draw call will work, and no_view_cache
; is necessary for a few games like Mad Max:
o0 = set_viewport no_view_cache bb
; Some games such as The Evil Within and Akiba's Trip constantly unbind
; StereoParams & IniParams, so we may need to explicitly rebind them now:
vs-t125 = StereoParams
ps-t125 = StereoParams
vs-t120 = IniParams
ps-t120 = IniParams
; Pass cursor position and visibility info to the shader:
x6 = cursor_window_x
y6 = cursor_window_y
z6 = cursor_hotspot_x
w6 = cursor_hotspot_y
y7 = cursor_showing
; Pass the size of the window to the shader:
z7 = window_width
w7 = window_height
; Back up textures we are about to replace:
ResourceSoftwareMouseBackupTexture1 = reference vs-t100
ResourceSoftwareMouseBackupTexture2 = reference vs-t101
ResourceSoftwareMouseBackupTexture3 = reference ps-t100
ResourceSoftwareMouseBackupTexture4 = reference ps-t101
; Bind cursor mask and colour textures to both vertex and pixel shaders:
vs-t100 = cursor_mask
vs-t101 = cursor_color
ps-t100 = cursor_mask
ps-t101 = cursor_color
; Enable alpha blending for a colour cursor:
blend = ADD ONE INV_SRC_ALPHA
; Set w5 to 1 to indicate that this pass is drawing a colour cursor - the
; vertex shader will bail if the cursor is black and white / inverted:
w5 = 1
draw = 4, 0
; If the cursor is black and white it needs a different blend mode to support
; inverted colours, but most of the rest of the state is the same. Fire off a
; second custom shader from here, which will inherit the state we have already
; set up but allow the blend mode to be changed (alternatively you could copy
; the back buffer and blend in the shader, or just ignore inverted cursors).
; The vertex shader will bail on one of these two passes depending on the
; cursor and current value of w5:
run = CustomShaderSoftwareMouseBW
; Restore backed up textures:
post vs-t100 = reference ResourceSoftwareMouseBackupTexture1
post vs-t101 = reference ResourceSoftwareMouseBackupTexture2
post ps-t100 = reference ResourceSoftwareMouseBackupTexture3
post ps-t101 = reference ResourceSoftwareMouseBackupTexture4
[CustomShaderSoftwareMouseBW]
; Set a blend mode that supports inverting the destination to suit black and
; white or inverted cursors:
blend = ADD INV_DEST_COLOR SRC_ALPHA
; Set w5 to 2 to indicate that this pass is drawing a black and white /
; inverted cursor - the vertex shader will bail if the cursor is colour:
w5 = 2
draw = 4, 0

;------------------------------------------------------------------------------------------------------
; The following custom shader can convert 3D Vision to Side-by-Side and
; Top-and-Bottom for use with 3D TVs & projectors - to enable this uncomment
; the 'run = CustomShader3DVision2SBS' in the [Present] section, set 3D Vision
; to output "checkerboard" in the control panel (which will remove the 720p
; limitation) and enable this either via the F11 key, or by setting a default
; for x7 in the [Constants] section. If you are using SLI and this isn't
; working properly (partially blank or stuck image) you may need to also set
; StereoFlagsDX10 = 0x00000008 in the [Profile] section.


[Resource3DVision2SBSBackupTexture]
[CustomShader3DVision2SBS]
; Load a custom vertex + pixel shader:
vs = ShaderFixes/3dvision2sbsvs.hlsl
ps = ShaderFixes/3dvision2sbsps.hlsl
; Explicitly unbind other shader types for safety:
hs = null
ds = null
gs = null
; Disable the OM blend stage that could interfere with the shader:
blend = disable
; Disable front/back face culling so the vertices can be in any rotation:
cull = none
; Use a triangle strip topology so we only have to output four vertices:
topology = triangle_strip
; Clear all render + depth targets to avoid compatibility issues:
run = CommandListUnbindAllRenderTargets
; Bind the back buffer as a render target. set_viewport ensures that the view
; port is the size of the buffer so the draw call will work, and no_view_cache
; is necessary for a few games like Mad Max:
o0 = set_viewport no_view_cache bb
; Back up any textures that were in the ps-t100 slot. The CustomResource
; section will already back up a lot of state, including shaders, render
; targets, depth targets, UAVs, viewports, blend state, rasterizer state,
; primitive topology, etc. but it does not back up textures:
Resource3DVision2SBSBackupTexture = reference ps-t100
; Use the reverse stereo blit to give the shader access to the back buffers of
; both eyes:
ps-t100 = stereo2mono bb
; Some rare games (e.g. Onechanbara Z2) use MSAA back buffers, which cannot be
; directly used with the reverse stereo blit and must be resolved to non MSAA
; versions first. The symptoms will be a black screen after enabling this
; shader with F11. In that case, replace the above line with these two:
; ps-t100 = resolve_msaa bb
; ps-t100 = stereo2mono ps-t100
; Some games such as The Evil Within and Akiba's Trip constantly unbind
; StereoParams & IniParams, so we may need to explicitly rebind them now:
vs-t125 = StereoParams
ps-t125 = StereoParams
vs-t120 = IniParams
ps-t120 = IniParams
; Draw four vertices. The vertex shader will construct coordinates to cover the
; full screen using the SV_VertexID semantic so we don't need vertex buffers:
draw = 4, 0
; Restore the original texture from the ps-t100 slot:
post ps-t100 = reference Resource3DVision2SBSBackupTexture

[KeyChange3DVision2SBSOutputMode]
key = no_modifiers F11
; 0 = Regular 3D Vision
; 1 = Reversed 3D Vision
; 2 = Side by Side
; 3 = Reversed Side by Side
; 4 = Top and Bottom
; 5 = Reversed Top and Bottom
; 6 = Line interlacing
; 7 = Line interlacing reverse
x7 = 1, 2, 3, 4, 5, 6 , 7, 0
type = cycle

[ResourceDummyRenderTarget1]
Format = R8G8B8A8_UNORM
[ShaderOverrideObjectHighlight1]
hash = a489cab6d6e41a9f
; Shader is used with no render target, only a depth target. Assign a dummy
; render target to influence the driver heuristics to render it in stereo:
ResourceDummyRenderTarget1 = copy_desc oD
o0 = ResourceDummyRenderTarget1