commit
a19906df2a
99 changed files with 17551 additions and 0 deletions
-
20.gitignore
-
8Assets/Scenes.meta
-
267Assets/Scenes/SampleScene.unity
-
7Assets/Scenes/SampleScene.unity.meta
-
8Assets/Shaders.meta
-
8Assets/Shaders/FSR2.meta
-
426Assets/Shaders/FSR2/ffx_common_types.h
-
27Assets/Shaders/FSR2/ffx_common_types.h.meta
-
52Assets/Shaders/FSR2/ffx_core.h
-
27Assets/Shaders/FSR2/ffx_core.h.meta
-
328Assets/Shaders/FSR2/ffx_core_cpu.h
-
27Assets/Shaders/FSR2/ffx_core_cpu.h.meta
-
2784Assets/Shaders/FSR2/ffx_core_gpu_common.h
-
27Assets/Shaders/FSR2/ffx_core_gpu_common.h.meta
-
2978Assets/Shaders/FSR2/ffx_core_gpu_common_half.h
-
27Assets/Shaders/FSR2/ffx_core_gpu_common_half.h.meta
-
1527Assets/Shaders/FSR2/ffx_core_hlsl.h
-
27Assets/Shaders/FSR2/ffx_core_hlsl.h.meta
-
50Assets/Shaders/FSR2/ffx_core_portability.h
-
27Assets/Shaders/FSR2/ffx_core_portability.h.meta
-
1246Assets/Shaders/FSR2/ffx_fsr1.h
-
27Assets/Shaders/FSR2/ffx_fsr1.h.meta
-
279Assets/Shaders/FSR2/ffx_fsr2_accumulate.h
-
27Assets/Shaders/FSR2/ffx_fsr2_accumulate.h.meta
-
90Assets/Shaders/FSR2/ffx_fsr2_accumulate_pass.hlsl
-
7Assets/Shaders/FSR2/ffx_fsr2_accumulate_pass.hlsl.meta
-
87Assets/Shaders/FSR2/ffx_fsr2_autogen_reactive_pass.compute
-
8Assets/Shaders/FSR2/ffx_fsr2_autogen_reactive_pass.compute.meta
-
933Assets/Shaders/FSR2/ffx_fsr2_callbacks_hlsl.cginc
-
7Assets/Shaders/FSR2/ffx_fsr2_callbacks_hlsl.cginc.meta
-
356Assets/Shaders/FSR2/ffx_fsr2_common.cginc
-
7Assets/Shaders/FSR2/ffx_fsr2_common.cginc.meta
-
188Assets/Shaders/FSR2/ffx_fsr2_compute_luminance_pyramid.h
-
27Assets/Shaders/FSR2/ffx_fsr2_compute_luminance_pyramid.h.meta
-
164Assets/Shaders/FSR2/ffx_fsr2_compute_luminance_pyramid_pass.hlsl
-
7Assets/Shaders/FSR2/ffx_fsr2_compute_luminance_pyramid_pass.hlsl.meta
-
93Assets/Shaders/FSR2/ffx_fsr2_depth_clip.h
-
27Assets/Shaders/FSR2/ffx_fsr2_depth_clip.h.meta
-
63Assets/Shaders/FSR2/ffx_fsr2_depth_clip_pass.hlsl
-
7Assets/Shaders/FSR2/ffx_fsr2_depth_clip_pass.hlsl.meta
-
171Assets/Shaders/FSR2/ffx_fsr2_lock.h
-
27Assets/Shaders/FSR2/ffx_fsr2_lock.h.meta
-
66Assets/Shaders/FSR2/ffx_fsr2_lock_pass.hlsl
-
7Assets/Shaders/FSR2/ffx_fsr2_lock_pass.hlsl.meta
-
85Assets/Shaders/FSR2/ffx_fsr2_postprocess_lock_status.h
-
27Assets/Shaders/FSR2/ffx_fsr2_postprocess_lock_status.h.meta
-
83Assets/Shaders/FSR2/ffx_fsr2_prepare_input_color.h
-
27Assets/Shaders/FSR2/ffx_fsr2_prepare_input_color.h.meta
-
64Assets/Shaders/FSR2/ffx_fsr2_prepare_input_color_pass.hlsl
-
7Assets/Shaders/FSR2/ffx_fsr2_prepare_input_color_pass.hlsl.meta
-
105Assets/Shaders/FSR2/ffx_fsr2_rcas.h
-
27Assets/Shaders/FSR2/ffx_fsr2_rcas.h.meta
-
88Assets/Shaders/FSR2/ffx_fsr2_rcas_pass.hlsl
-
7Assets/Shaders/FSR2/ffx_fsr2_rcas_pass.hlsl.meta
-
135Assets/Shaders/FSR2/ffx_fsr2_reconstruct_dilated_velocity_and_previous_depth.h
-
27Assets/Shaders/FSR2/ffx_fsr2_reconstruct_dilated_velocity_and_previous_depth.h.meta
-
66Assets/Shaders/FSR2/ffx_fsr2_reconstruct_previous_depth_pass.hlsl
-
7Assets/Shaders/FSR2/ffx_fsr2_reconstruct_previous_depth_pass.hlsl.meta
-
93Assets/Shaders/FSR2/ffx_fsr2_reproject.h
-
27Assets/Shaders/FSR2/ffx_fsr2_reproject.h.meta
-
89Assets/Shaders/FSR2/ffx_fsr2_resources.h
-
27Assets/Shaders/FSR2/ffx_fsr2_resources.h.meta
-
494Assets/Shaders/FSR2/ffx_fsr2_sample.h
-
27Assets/Shaders/FSR2/ffx_fsr2_sample.h.meta
-
148Assets/Shaders/FSR2/ffx_fsr2_upsample.h
-
27Assets/Shaders/FSR2/ffx_fsr2_upsample.h.meta
-
936Assets/Shaders/FSR2/ffx_spd.h
-
27Assets/Shaders/FSR2/ffx_spd.h.meta
-
17FSR2Test.sln
-
45Packages/manifest.json
-
413Packages/packages-lock.json
-
19ProjectSettings/AudioManager.asset
-
6ProjectSettings/ClusterInputManager.asset
-
34ProjectSettings/DynamicsManager.asset
-
8ProjectSettings/EditorBuildSettings.asset
-
30ProjectSettings/EditorSettings.asset
-
11ProjectSettings/GameCoreScarlettSettings.asset
-
14ProjectSettings/GameCoreXboxOneSettings.asset
-
63ProjectSettings/GraphicsSettings.asset
-
295ProjectSettings/InputManager.asset
-
35ProjectSettings/MemorySettings.asset
-
91ProjectSettings/NavMeshAreas.asset
-
56ProjectSettings/PS5Settings.json
-
35ProjectSettings/PackageManagerSettings.asset
-
7ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json
-
56ProjectSettings/Physics2DSettings.asset
-
7ProjectSettings/PresetManager.asset
-
723ProjectSettings/ProjectSettings.asset
-
2ProjectSettings/ProjectVersion.txt
-
232ProjectSettings/QualitySettings.asset
-
6ProjectSettings/ScarlettGame.config
-
43ProjectSettings/TagManager.asset
-
9ProjectSettings/TimeManager.asset
-
35ProjectSettings/UnityConnectSettings.asset
-
12ProjectSettings/VFXManager.asset
-
8ProjectSettings/VersionControlSettings.asset
-
10ProjectSettings/XRSettings.asset
-
6ProjectSettings/XboxOneGame.config
-
0ProjectSettings/boot.config
@ -0,0 +1,20 @@ |
|||
Library/ |
|||
Temp/ |
|||
UniQuake.sln |
|||
UserSettings/ |
|||
.vs/ |
|||
Debug/ |
|||
Release/ |
|||
.idea/ |
|||
*.csproj |
|||
Logs/ |
|||
Build/ |
|||
Build64/ |
|||
mods/ |
|||
*.DotSettings |
|||
*.orig |
|||
Debug Portable/ |
|||
Assets/StreamingAssets/ |
|||
Build*/ |
|||
*_Debug/ |
|||
Data/ |
|||
@ -0,0 +1,8 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 6ea315d0fd7389c41b19996891e99ae3 |
|||
folderAsset: yes |
|||
DefaultImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,267 @@ |
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!29 &1 |
|||
OcclusionCullingSettings: |
|||
m_ObjectHideFlags: 0 |
|||
serializedVersion: 2 |
|||
m_OcclusionBakeSettings: |
|||
smallestOccluder: 5 |
|||
smallestHole: 0.25 |
|||
backfaceThreshold: 100 |
|||
m_SceneGUID: 00000000000000000000000000000000 |
|||
m_OcclusionCullingData: {fileID: 0} |
|||
--- !u!104 &2 |
|||
RenderSettings: |
|||
m_ObjectHideFlags: 0 |
|||
serializedVersion: 9 |
|||
m_Fog: 0 |
|||
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} |
|||
m_FogMode: 3 |
|||
m_FogDensity: 0.01 |
|||
m_LinearFogStart: 0 |
|||
m_LinearFogEnd: 300 |
|||
m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} |
|||
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} |
|||
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} |
|||
m_AmbientIntensity: 1 |
|||
m_AmbientMode: 0 |
|||
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} |
|||
m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} |
|||
m_HaloStrength: 0.5 |
|||
m_FlareStrength: 1 |
|||
m_FlareFadeSpeed: 3 |
|||
m_HaloTexture: {fileID: 0} |
|||
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} |
|||
m_DefaultReflectionMode: 0 |
|||
m_DefaultReflectionResolution: 128 |
|||
m_ReflectionBounces: 1 |
|||
m_ReflectionIntensity: 1 |
|||
m_CustomReflection: {fileID: 0} |
|||
m_Sun: {fileID: 705507994} |
|||
m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} |
|||
m_UseRadianceAmbientProbe: 0 |
|||
--- !u!157 &3 |
|||
LightmapSettings: |
|||
m_ObjectHideFlags: 0 |
|||
serializedVersion: 12 |
|||
m_GIWorkflowMode: 1 |
|||
m_GISettings: |
|||
serializedVersion: 2 |
|||
m_BounceScale: 1 |
|||
m_IndirectOutputScale: 1 |
|||
m_AlbedoBoost: 1 |
|||
m_EnvironmentLightingMode: 0 |
|||
m_EnableBakedLightmaps: 1 |
|||
m_EnableRealtimeLightmaps: 0 |
|||
m_LightmapEditorSettings: |
|||
serializedVersion: 12 |
|||
m_Resolution: 2 |
|||
m_BakeResolution: 40 |
|||
m_AtlasSize: 1024 |
|||
m_AO: 0 |
|||
m_AOMaxDistance: 1 |
|||
m_CompAOExponent: 1 |
|||
m_CompAOExponentDirect: 0 |
|||
m_ExtractAmbientOcclusion: 0 |
|||
m_Padding: 2 |
|||
m_LightmapParameters: {fileID: 0} |
|||
m_LightmapsBakeMode: 1 |
|||
m_TextureCompression: 1 |
|||
m_FinalGather: 0 |
|||
m_FinalGatherFiltering: 1 |
|||
m_FinalGatherRayCount: 256 |
|||
m_ReflectionCompression: 2 |
|||
m_MixedBakeMode: 2 |
|||
m_BakeBackend: 1 |
|||
m_PVRSampling: 1 |
|||
m_PVRDirectSampleCount: 32 |
|||
m_PVRSampleCount: 500 |
|||
m_PVRBounces: 2 |
|||
m_PVREnvironmentSampleCount: 500 |
|||
m_PVREnvironmentReferencePointCount: 2048 |
|||
m_PVRFilteringMode: 2 |
|||
m_PVRDenoiserTypeDirect: 0 |
|||
m_PVRDenoiserTypeIndirect: 0 |
|||
m_PVRDenoiserTypeAO: 0 |
|||
m_PVRFilterTypeDirect: 0 |
|||
m_PVRFilterTypeIndirect: 0 |
|||
m_PVRFilterTypeAO: 0 |
|||
m_PVREnvironmentMIS: 0 |
|||
m_PVRCulling: 1 |
|||
m_PVRFilteringGaussRadiusDirect: 1 |
|||
m_PVRFilteringGaussRadiusIndirect: 5 |
|||
m_PVRFilteringGaussRadiusAO: 2 |
|||
m_PVRFilteringAtrousPositionSigmaDirect: 0.5 |
|||
m_PVRFilteringAtrousPositionSigmaIndirect: 2 |
|||
m_PVRFilteringAtrousPositionSigmaAO: 1 |
|||
m_ExportTrainingData: 0 |
|||
m_TrainingDataDestination: TrainingData |
|||
m_LightProbeSampleCountMultiplier: 4 |
|||
m_LightingDataAsset: {fileID: 0} |
|||
m_LightingSettings: {fileID: 0} |
|||
--- !u!196 &4 |
|||
NavMeshSettings: |
|||
serializedVersion: 2 |
|||
m_ObjectHideFlags: 0 |
|||
m_BuildSettings: |
|||
serializedVersion: 2 |
|||
agentTypeID: 0 |
|||
agentRadius: 0.5 |
|||
agentHeight: 2 |
|||
agentSlope: 45 |
|||
agentClimb: 0.4 |
|||
ledgeDropHeight: 0 |
|||
maxJumpAcrossDistance: 0 |
|||
minRegionArea: 2 |
|||
manualCellSize: 0 |
|||
cellSize: 0.16666667 |
|||
manualTileSize: 0 |
|||
tileSize: 256 |
|||
accuratePlacement: 0 |
|||
debug: |
|||
m_Flags: 0 |
|||
m_NavMeshData: {fileID: 0} |
|||
--- !u!1 &705507993 |
|||
GameObject: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInternal: {fileID: 0} |
|||
serializedVersion: 6 |
|||
m_Component: |
|||
- component: {fileID: 705507995} |
|||
- component: {fileID: 705507994} |
|||
m_Layer: 0 |
|||
m_Name: Directional Light |
|||
m_TagString: Untagged |
|||
m_Icon: {fileID: 0} |
|||
m_NavMeshLayer: 0 |
|||
m_StaticEditorFlags: 0 |
|||
m_IsActive: 1 |
|||
--- !u!108 &705507994 |
|||
Light: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInternal: {fileID: 0} |
|||
m_GameObject: {fileID: 705507993} |
|||
m_Enabled: 1 |
|||
serializedVersion: 8 |
|||
m_Type: 1 |
|||
m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} |
|||
m_Intensity: 1 |
|||
m_Range: 10 |
|||
m_SpotAngle: 30 |
|||
m_CookieSize: 10 |
|||
m_Shadows: |
|||
m_Type: 2 |
|||
m_Resolution: -1 |
|||
m_CustomResolution: -1 |
|||
m_Strength: 1 |
|||
m_Bias: 0.05 |
|||
m_NormalBias: 0.4 |
|||
m_NearPlane: 0.2 |
|||
m_Cookie: {fileID: 0} |
|||
m_DrawHalo: 0 |
|||
m_Flare: {fileID: 0} |
|||
m_RenderMode: 0 |
|||
m_CullingMask: |
|||
serializedVersion: 2 |
|||
m_Bits: 4294967295 |
|||
m_Lightmapping: 1 |
|||
m_LightShadowCasterMode: 0 |
|||
m_AreaSize: {x: 1, y: 1} |
|||
m_BounceIntensity: 1 |
|||
m_ColorTemperature: 6570 |
|||
m_UseColorTemperature: 0 |
|||
m_ShadowRadius: 0 |
|||
m_ShadowAngle: 0 |
|||
--- !u!4 &705507995 |
|||
Transform: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInternal: {fileID: 0} |
|||
m_GameObject: {fileID: 705507993} |
|||
m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} |
|||
m_LocalPosition: {x: 0, y: 3, z: 0} |
|||
m_LocalScale: {x: 1, y: 1, z: 1} |
|||
m_Children: [] |
|||
m_Father: {fileID: 0} |
|||
m_RootOrder: 1 |
|||
m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} |
|||
--- !u!1 &963194225 |
|||
GameObject: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInternal: {fileID: 0} |
|||
serializedVersion: 6 |
|||
m_Component: |
|||
- component: {fileID: 963194228} |
|||
- component: {fileID: 963194227} |
|||
- component: {fileID: 963194226} |
|||
m_Layer: 0 |
|||
m_Name: Main Camera |
|||
m_TagString: MainCamera |
|||
m_Icon: {fileID: 0} |
|||
m_NavMeshLayer: 0 |
|||
m_StaticEditorFlags: 0 |
|||
m_IsActive: 1 |
|||
--- !u!81 &963194226 |
|||
AudioListener: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInternal: {fileID: 0} |
|||
m_GameObject: {fileID: 963194225} |
|||
m_Enabled: 1 |
|||
--- !u!20 &963194227 |
|||
Camera: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInternal: {fileID: 0} |
|||
m_GameObject: {fileID: 963194225} |
|||
m_Enabled: 1 |
|||
serializedVersion: 2 |
|||
m_ClearFlags: 1 |
|||
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} |
|||
m_projectionMatrixMode: 1 |
|||
m_SensorSize: {x: 36, y: 24} |
|||
m_LensShift: {x: 0, y: 0} |
|||
m_GateFitMode: 2 |
|||
m_FocalLength: 50 |
|||
m_NormalizedViewPortRect: |
|||
serializedVersion: 2 |
|||
x: 0 |
|||
y: 0 |
|||
width: 1 |
|||
height: 1 |
|||
near clip plane: 0.3 |
|||
far clip plane: 1000 |
|||
field of view: 60 |
|||
orthographic: 0 |
|||
orthographic size: 5 |
|||
m_Depth: -1 |
|||
m_CullingMask: |
|||
serializedVersion: 2 |
|||
m_Bits: 4294967295 |
|||
m_RenderingPath: -1 |
|||
m_TargetTexture: {fileID: 0} |
|||
m_TargetDisplay: 0 |
|||
m_TargetEye: 3 |
|||
m_HDR: 1 |
|||
m_AllowMSAA: 1 |
|||
m_AllowDynamicResolution: 0 |
|||
m_ForceIntoRT: 0 |
|||
m_OcclusionCulling: 1 |
|||
m_StereoConvergence: 10 |
|||
m_StereoSeparation: 0.022 |
|||
--- !u!4 &963194228 |
|||
Transform: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInternal: {fileID: 0} |
|||
m_GameObject: {fileID: 963194225} |
|||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} |
|||
m_LocalPosition: {x: 0, y: 1, z: -10} |
|||
m_LocalScale: {x: 1, y: 1, z: 1} |
|||
m_Children: [] |
|||
m_Father: {fileID: 0} |
|||
m_RootOrder: 0 |
|||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} |
|||
@ -0,0 +1,7 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 9fc0d4010bbf28b4594072e72b8655ab |
|||
DefaultImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,8 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 899452302d6bfbd41905b6c899c7e545 |
|||
folderAsset: yes |
|||
DefaultImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,8 @@ |
|||
fileFormatVersion: 2 |
|||
guid: fe1c2c243614a5a4db5ced9f9ea2d7c4 |
|||
folderAsset: yes |
|||
DefaultImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,426 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
#ifndef FFX_COMMON_TYPES_H |
|||
#define FFX_COMMON_TYPES_H |
|||
|
|||
#if defined(FFX_CPU) |
|||
#define FFX_PARAMETER_IN |
|||
#define FFX_PARAMETER_OUT |
|||
#define FFX_PARAMETER_INOUT |
|||
#elif defined(FFX_HLSL) |
|||
#define FFX_PARAMETER_IN in |
|||
#define FFX_PARAMETER_OUT out |
|||
#define FFX_PARAMETER_INOUT inout |
|||
#elif defined(FFX_GLSL) |
|||
#define FFX_PARAMETER_IN in |
|||
#define FFX_PARAMETER_OUT out |
|||
#define FFX_PARAMETER_INOUT inout |
|||
#endif // #if defined(FFX_CPU) |
|||
|
|||
#if defined(FFX_CPU) |
|||
/// A typedef for a boolean value. |
|||
/// |
|||
/// @ingroup CPU |
|||
typedef bool FfxBoolean; |
|||
|
|||
/// A typedef for a unsigned 8bit integer. |
|||
/// |
|||
/// @ingroup CPU |
|||
typedef uint8_t FfxUInt8; |
|||
|
|||
/// A typedef for a unsigned 16bit integer. |
|||
/// |
|||
/// @ingroup CPU |
|||
typedef uint16_t FfxUInt16; |
|||
|
|||
/// A typedef for a unsigned 32bit integer. |
|||
/// |
|||
/// @ingroup CPU |
|||
typedef uint32_t FfxUInt32; |
|||
|
|||
/// A typedef for a unsigned 64bit integer. |
|||
/// |
|||
/// @ingroup CPU |
|||
typedef uint64_t FfxUInt64; |
|||
|
|||
/// A typedef for a signed 8bit integer. |
|||
/// |
|||
/// @ingroup CPU |
|||
typedef int8_t FfxInt8; |
|||
|
|||
/// A typedef for a signed 16bit integer. |
|||
/// |
|||
/// @ingroup CPU |
|||
typedef int16_t FfxInt16; |
|||
|
|||
/// A typedef for a signed 32bit integer. |
|||
/// |
|||
/// @ingroup CPU |
|||
typedef int32_t FfxInt32; |
|||
|
|||
/// A typedef for a signed 64bit integer. |
|||
/// |
|||
/// @ingroup CPU |
|||
typedef int64_t FfxInt64; |
|||
|
|||
/// A typedef for a floating point value. |
|||
/// |
|||
/// @ingroup CPU |
|||
typedef float FfxFloat32; |
|||
|
|||
/// A typedef for a 2-dimensional floating point value. |
|||
/// |
|||
/// @ingroup CPU |
|||
typedef float FfxFloat32x2[2]; |
|||
|
|||
/// A typedef for a 3-dimensional floating point value. |
|||
/// |
|||
/// @ingroup CPU |
|||
typedef float FfxFloat32x3[3]; |
|||
|
|||
/// A typedef for a 4-dimensional floating point value. |
|||
/// |
|||
/// @ingroup CPU |
|||
typedef float FfxFloat32x4[4]; |
|||
|
|||
/// A typedef for a 2-dimensional 32bit unsigned integer. |
|||
/// |
|||
/// @ingroup CPU |
|||
typedef uint32_t FfxUInt32x2[2]; |
|||
|
|||
/// A typedef for a 3-dimensional 32bit unsigned integer. |
|||
/// |
|||
/// @ingroup CPU |
|||
typedef uint32_t FfxUInt32x3[3]; |
|||
|
|||
/// A typedef for a 4-dimensional 32bit unsigned integer. |
|||
/// |
|||
/// @ingroup CPU |
|||
typedef uint32_t FfxUInt32x4[4]; |
|||
#endif // #if defined(FFX_CPU) |
|||
|
|||
#if defined(FFX_HLSL) |
|||
/// A typedef for a boolean value. |
|||
/// |
|||
/// @ingroup GPU |
|||
typedef bool FfxBoolean; |
|||
|
|||
#if FFX_HLSL_6_2 |
|||
typedef float32_t FfxFloat32; |
|||
typedef float32_t2 FfxFloat32x2; |
|||
typedef float32_t3 FfxFloat32x3; |
|||
typedef float32_t4 FfxFloat32x4; |
|||
|
|||
/// A typedef for a unsigned 32bit integer. |
|||
/// |
|||
/// @ingroup GPU |
|||
typedef uint32_t FfxUInt32; |
|||
typedef uint32_t2 FfxUInt32x2; |
|||
typedef uint32_t3 FfxUInt32x3; |
|||
typedef uint32_t4 FfxUInt32x4; |
|||
typedef int32_t FfxInt32; |
|||
typedef int32_t2 FfxInt32x2; |
|||
typedef int32_t3 FfxInt32x3; |
|||
typedef int32_t4 FfxInt32x4; |
|||
#else |
|||
#define FfxFloat32 float |
|||
#define FfxFloat32x2 float2 |
|||
#define FfxFloat32x3 float3 |
|||
#define FfxFloat32x4 float4 |
|||
|
|||
/// A typedef for a unsigned 32bit integer. |
|||
/// |
|||
/// @ingroup GPU |
|||
typedef uint FfxUInt32; |
|||
typedef uint2 FfxUInt32x2; |
|||
typedef uint3 FfxUInt32x3; |
|||
typedef uint4 FfxUInt32x4; |
|||
typedef int FfxInt32; |
|||
typedef int2 FfxInt32x2; |
|||
typedef int3 FfxInt32x3; |
|||
typedef int4 FfxInt32x4; |
|||
#endif // #if defined(FFX_HLSL_6_2) |
|||
|
|||
#if FFX_HALF |
|||
#if FFX_HLSL_6_2 |
|||
typedef float16_t FfxFloat16; |
|||
typedef float16_t2 FfxFloat16x2; |
|||
typedef float16_t3 FfxFloat16x3; |
|||
typedef float16_t4 FfxFloat16x4; |
|||
|
|||
/// A typedef for an unsigned 16bit integer. |
|||
/// |
|||
/// @ingroup GPU |
|||
typedef uint16_t FfxUInt16; |
|||
typedef uint16_t2 FfxUInt16x2; |
|||
typedef uint16_t3 FfxUInt16x3; |
|||
typedef uint16_t4 FfxUInt16x4; |
|||
|
|||
/// A typedef for a signed 16bit integer. |
|||
/// |
|||
/// @ingroup GPU |
|||
typedef int16_t FfxInt16; |
|||
typedef int16_t2 FfxInt16x2; |
|||
typedef int16_t3 FfxInt16x3; |
|||
typedef int16_t4 FfxInt16x4; |
|||
#else |
|||
typedef min16float FfxFloat16; |
|||
typedef min16float2 FfxFloat16x2; |
|||
typedef min16float3 FfxFloat16x3; |
|||
typedef min16float4 FfxFloat16x4; |
|||
|
|||
/// A typedef for an unsigned 16bit integer. |
|||
/// |
|||
/// @ingroup GPU |
|||
typedef min16uint FfxUInt16; |
|||
typedef min16uint2 FfxUInt16x2; |
|||
typedef min16uint3 FfxUInt16x3; |
|||
typedef min16uint4 FfxUInt16x4; |
|||
|
|||
/// A typedef for a signed 16bit integer. |
|||
/// |
|||
/// @ingroup GPU |
|||
typedef min16int FfxInt16; |
|||
typedef min16int2 FfxInt16x2; |
|||
typedef min16int3 FfxInt16x3; |
|||
typedef min16int4 FfxInt16x4; |
|||
#endif // FFX_HLSL_6_2 |
|||
#endif // FFX_HALF |
|||
#endif // #if defined(FFX_HLSL) |
|||
|
|||
#if defined(FFX_GLSL) |
|||
/// A typedef for a boolean value. |
|||
/// |
|||
/// @ingroup GPU |
|||
#define FfxBoolean bool |
|||
#define FfxFloat32 float |
|||
#define FfxFloat32x2 vec2 |
|||
#define FfxFloat32x3 vec3 |
|||
#define FfxFloat32x4 vec4 |
|||
#define FfxUInt32 uint |
|||
#define FfxUInt32x2 uvec2 |
|||
#define FfxUInt32x3 uvec3 |
|||
#define FfxUInt32x4 uvec4 |
|||
#define FfxInt32 int |
|||
#define FfxInt32x2 ivec2 |
|||
#define FfxInt32x3 ivec3 |
|||
#define FfxInt32x4 ivec4 |
|||
#if FFX_HALF |
|||
#define FfxFloat16 float16_t |
|||
#define FfxFloat16x2 f16vec2 |
|||
#define FfxFloat16x3 f16vec3 |
|||
#define FfxFloat16x4 f16vec4 |
|||
#define FfxUInt16 uint16_t |
|||
#define FfxUInt16x2 u16vec2 |
|||
#define FfxUInt16x3 u16vec3 |
|||
#define FfxUInt16x4 u16vec4 |
|||
#define FfxInt16 int16_t |
|||
#define FfxInt16x2 i16vec2 |
|||
#define FfxInt16x3 i16vec3 |
|||
#define FfxInt16x4 i16vec4 |
|||
#endif // FFX_HALF |
|||
#endif // #if defined(FFX_GLSL) |
|||
|
|||
// Global toggles: |
|||
// #define FFX_HALF (1) |
|||
// #define FFX_HLSL_6_2 (1) |
|||
|
|||
#if FFX_HALF |
|||
|
|||
#define FFX_MIN16_SCALAR( TypeName, BaseComponentType ) typedef min16##BaseComponentType TypeName; |
|||
#define FFX_MIN16_VECTOR( TypeName, BaseComponentType, COL ) typedef vector<min16##BaseComponentType, COL> TypeName; |
|||
#define FFX_MIN16_MATRIX( TypeName, BaseComponentType, ROW, COL ) typedef matrix<min16##BaseComponentType, ROW, COL> TypeName; |
|||
|
|||
#if FFX_HLSL_6_2 |
|||
|
|||
#define FFX_16BIT_SCALAR( TypeName, BaseComponentType ) typedef BaseComponentType##16_t TypeName; |
|||
#define FFX_16BIT_VECTOR( TypeName, BaseComponentType, COL ) typedef vector<BaseComponentType##16_t, COL> TypeName; |
|||
#define FFX_16BIT_MATRIX( TypeName, BaseComponentType, ROW, COL ) typedef matrix<BaseComponentType##16_t, ROW, COL> TypeName; |
|||
|
|||
#else //FFX_HLSL_6_2 |
|||
|
|||
#define FFX_16BIT_SCALAR( TypeName, BaseComponentType ) FFX_MIN16_SCALAR( TypeName, BaseComponentType ); |
|||
#define FFX_16BIT_VECTOR( TypeName, BaseComponentType, COL ) FFX_MIN16_VECTOR( TypeName, BaseComponentType, COL ); |
|||
#define FFX_16BIT_MATRIX( TypeName, BaseComponentType, ROW, COL ) FFX_MIN16_MATRIX( TypeName, BaseComponentType, ROW, COL ); |
|||
|
|||
#endif //FFX_HLSL_6_2 |
|||
|
|||
#else //FFX_HALF |
|||
|
|||
#define FFX_MIN16_SCALAR( TypeName, BaseComponentType ) typedef BaseComponentType TypeName; |
|||
#define FFX_MIN16_VECTOR( TypeName, BaseComponentType, COL ) typedef vector<BaseComponentType, COL> TypeName; |
|||
#define FFX_MIN16_MATRIX( TypeName, BaseComponentType, ROW, COL ) typedef matrix<BaseComponentType, ROW, COL> TypeName; |
|||
|
|||
#define FFX_16BIT_SCALAR( TypeName, BaseComponentType ) typedef BaseComponentType TypeName; |
|||
#define FFX_16BIT_VECTOR( TypeName, BaseComponentType, COL ) typedef vector<BaseComponentType, COL> TypeName; |
|||
#define FFX_16BIT_MATRIX( TypeName, BaseComponentType, ROW, COL ) typedef matrix<BaseComponentType, ROW, COL> TypeName; |
|||
|
|||
#endif //FFX_HALF |
|||
|
|||
#if defined(FFX_GPU) |
|||
// Common typedefs: |
|||
#if defined(FFX_HLSL) |
|||
FFX_MIN16_SCALAR( FFX_MIN16_F , float ); |
|||
FFX_MIN16_VECTOR( FFX_MIN16_F2, float, 2 ); |
|||
FFX_MIN16_VECTOR( FFX_MIN16_F3, float, 3 ); |
|||
FFX_MIN16_VECTOR( FFX_MIN16_F4, float, 4 ); |
|||
|
|||
FFX_MIN16_SCALAR( FFX_MIN16_I, int ); |
|||
FFX_MIN16_VECTOR( FFX_MIN16_I2, int, 2 ); |
|||
FFX_MIN16_VECTOR( FFX_MIN16_I3, int, 3 ); |
|||
FFX_MIN16_VECTOR( FFX_MIN16_I4, int, 4 ); |
|||
|
|||
FFX_MIN16_SCALAR( FFX_MIN16_U, uint ); |
|||
FFX_MIN16_VECTOR( FFX_MIN16_U2, uint, 2 ); |
|||
FFX_MIN16_VECTOR( FFX_MIN16_U3, uint, 3 ); |
|||
FFX_MIN16_VECTOR( FFX_MIN16_U4, uint, 4 ); |
|||
|
|||
FFX_16BIT_SCALAR( FFX_F16_t , float ); |
|||
FFX_16BIT_VECTOR( FFX_F16_t2, float, 2 ); |
|||
FFX_16BIT_VECTOR( FFX_F16_t3, float, 3 ); |
|||
FFX_16BIT_VECTOR( FFX_F16_t4, float, 4 ); |
|||
|
|||
FFX_16BIT_SCALAR( FFX_I16_t, int ); |
|||
FFX_16BIT_VECTOR( FFX_I16_t2, int, 2 ); |
|||
FFX_16BIT_VECTOR( FFX_I16_t3, int, 3 ); |
|||
FFX_16BIT_VECTOR( FFX_I16_t4, int, 4 ); |
|||
|
|||
FFX_16BIT_SCALAR( FFX_U16_t, uint ); |
|||
FFX_16BIT_VECTOR( FFX_U16_t2, uint, 2 ); |
|||
FFX_16BIT_VECTOR( FFX_U16_t3, uint, 3 ); |
|||
FFX_16BIT_VECTOR( FFX_U16_t4, uint, 4 ); |
|||
|
|||
#define TYPEDEF_MIN16_TYPES(Prefix) \ |
|||
typedef FFX_MIN16_F Prefix##_F; \ |
|||
typedef FFX_MIN16_F2 Prefix##_F2; \ |
|||
typedef FFX_MIN16_F3 Prefix##_F3; \ |
|||
typedef FFX_MIN16_F4 Prefix##_F4; \ |
|||
typedef FFX_MIN16_I Prefix##_I; \ |
|||
typedef FFX_MIN16_I2 Prefix##_I2; \ |
|||
typedef FFX_MIN16_I3 Prefix##_I3; \ |
|||
typedef FFX_MIN16_I4 Prefix##_I4; \ |
|||
typedef FFX_MIN16_U Prefix##_U; \ |
|||
typedef FFX_MIN16_U2 Prefix##_U2; \ |
|||
typedef FFX_MIN16_U3 Prefix##_U3; \ |
|||
typedef FFX_MIN16_U4 Prefix##_U4; |
|||
|
|||
#define TYPEDEF_16BIT_TYPES(Prefix) \ |
|||
typedef FFX_16BIT_F Prefix##_F; \ |
|||
typedef FFX_16BIT_F2 Prefix##_F2; \ |
|||
typedef FFX_16BIT_F3 Prefix##_F3; \ |
|||
typedef FFX_16BIT_F4 Prefix##_F4; \ |
|||
typedef FFX_16BIT_I Prefix##_I; \ |
|||
typedef FFX_16BIT_I2 Prefix##_I2; \ |
|||
typedef FFX_16BIT_I3 Prefix##_I3; \ |
|||
typedef FFX_16BIT_I4 Prefix##_I4; \ |
|||
typedef FFX_16BIT_U Prefix##_U; \ |
|||
typedef FFX_16BIT_U2 Prefix##_U2; \ |
|||
typedef FFX_16BIT_U3 Prefix##_U3; \ |
|||
typedef FFX_16BIT_U4 Prefix##_U4; |
|||
|
|||
#define TYPEDEF_FULL_PRECISION_TYPES(Prefix) \ |
|||
typedef FfxFloat32 Prefix##_F; \ |
|||
typedef FfxFloat32x2 Prefix##_F2; \ |
|||
typedef FfxFloat32x3 Prefix##_F3; \ |
|||
typedef FfxFloat32x4 Prefix##_F4; \ |
|||
typedef FfxInt32 Prefix##_I; \ |
|||
typedef FfxInt32x2 Prefix##_I2; \ |
|||
typedef FfxInt32x3 Prefix##_I3; \ |
|||
typedef FfxInt32x4 Prefix##_I4; \ |
|||
typedef FfxUInt32 Prefix##_U; \ |
|||
typedef FfxUInt32x2 Prefix##_U2; \ |
|||
typedef FfxUInt32x3 Prefix##_U3; \ |
|||
typedef FfxUInt32x4 Prefix##_U4; |
|||
#endif // #if defined(FFX_HLSL) |
|||
|
|||
#if defined(FFX_GLSL) |
|||
|
|||
#if FFX_HALF |
|||
|
|||
#define FFX_MIN16_F float16_t |
|||
#define FFX_MIN16_F2 f16vec2 |
|||
#define FFX_MIN16_F3 f16vec3 |
|||
#define FFX_MIN16_F4 f16vec4 |
|||
|
|||
#define FFX_MIN16_I int16_t |
|||
#define FFX_MIN16_I2 i16vec2 |
|||
#define FFX_MIN16_I3 i16vec3 |
|||
#define FFX_MIN16_I4 i16vec4 |
|||
|
|||
#define FFX_MIN16_U uint16_t |
|||
#define FFX_MIN16_U2 u16vec2 |
|||
#define FFX_MIN16_U3 u16vec3 |
|||
#define FFX_MIN16_U4 u16vec4 |
|||
|
|||
#define FFX_16BIT_F float16_t |
|||
#define FFX_16BIT_F2 f16vec2 |
|||
#define FFX_16BIT_F3 f16vec3 |
|||
#define FFX_16BIT_F4 f16vec4 |
|||
|
|||
#define FFX_16BIT_I int16_t |
|||
#define FFX_16BIT_I2 i16vec2 |
|||
#define FFX_16BIT_I3 i16vec3 |
|||
#define FFX_16BIT_I4 i16vec4 |
|||
|
|||
#define FFX_16BIT_U uint16_t |
|||
#define FFX_16BIT_U2 u16vec2 |
|||
#define FFX_16BIT_U3 u16vec3 |
|||
#define FFX_16BIT_U4 u16vec4 |
|||
|
|||
#else // FFX_HALF |
|||
|
|||
#define FFX_MIN16_F float |
|||
#define FFX_MIN16_F2 vec2 |
|||
#define FFX_MIN16_F3 vec3 |
|||
#define FFX_MIN16_F4 vec4 |
|||
|
|||
#define FFX_MIN16_I int |
|||
#define FFX_MIN16_I2 ivec2 |
|||
#define FFX_MIN16_I3 ivec3 |
|||
#define FFX_MIN16_I4 ivec4 |
|||
|
|||
#define FFX_MIN16_U uint |
|||
#define FFX_MIN16_U2 uvec2 |
|||
#define FFX_MIN16_U3 uvec3 |
|||
#define FFX_MIN16_U4 uvec4 |
|||
|
|||
#define FFX_16BIT_F float |
|||
#define FFX_16BIT_F2 vec2 |
|||
#define FFX_16BIT_F3 vec3 |
|||
#define FFX_16BIT_F4 vec4 |
|||
|
|||
#define FFX_16BIT_I int |
|||
#define FFX_16BIT_I2 ivec2 |
|||
#define FFX_16BIT_I3 ivec3 |
|||
#define FFX_16BIT_I4 ivec4 |
|||
|
|||
#define FFX_16BIT_U uint |
|||
#define FFX_16BIT_U2 uvec2 |
|||
#define FFX_16BIT_U3 uvec3 |
|||
#define FFX_16BIT_U4 uvec4 |
|||
|
|||
#endif // FFX_HALF |
|||
|
|||
#endif // #if defined(FFX_GLSL) |
|||
|
|||
#endif // #if defined(FFX_GPU) |
|||
#endif // #ifndef FFX_COMMON_TYPES_H |
|||
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: cdf3230fbd57f114488da1c8ae7a85f3 |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,52 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
/// @defgroup Core |
|||
/// @defgroup HLSL |
|||
/// @defgroup GLSL |
|||
/// @defgroup GPU |
|||
/// @defgroup CPU |
|||
/// @defgroup CAS |
|||
/// @defgroup FSR1 |
|||
|
|||
#if !defined(FFX_CORE_H) |
|||
#define FFX_CORE_H |
|||
|
|||
#include "ffx_common_types.h" |
|||
|
|||
#if defined(FFX_CPU) |
|||
#include "ffx_core_cpu.h" |
|||
#endif // #if defined(FFX_CPU) |
|||
|
|||
#if defined(FFX_GLSL) && defined(FFX_GPU) |
|||
#include "ffx_core_glsl.h" |
|||
#endif // #if defined(FFX_GLSL) && defined(FFX_GPU) |
|||
|
|||
#if defined(FFX_HLSL) && defined(FFX_GPU) |
|||
#include "ffx_core_hlsl.h" |
|||
#endif // #if defined(FFX_HLSL) && defined(FFX_GPU) |
|||
|
|||
#if defined(FFX_GPU) |
|||
#include "ffx_core_gpu_common.h" |
|||
#include "ffx_core_gpu_common_half.h" |
|||
#include "ffx_core_portability.h" |
|||
#endif // #if defined(FFX_GPU) |
|||
#endif // #if !defined(FFX_CORE_H) |
|||
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 646b382e52e76844d928b5530e3e7586 |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,328 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
/// A define for a true value in a boolean expression. |
|||
/// |
|||
/// @ingroup CPU |
|||
#define FFX_TRUE (1) |
|||
|
|||
/// A define for a false value in a boolean expression. |
|||
/// |
|||
/// @ingroup CPU |
|||
#define FFX_FALSE (0) |
|||
|
|||
#if !defined(FFX_STATIC) |
|||
/// A define to abstract declaration of static variables and functions. |
|||
/// |
|||
/// @ingroup CPU |
|||
#define FFX_STATIC static |
|||
#endif // #if !defined(FFX_STATIC) |
|||
|
|||
/// Interpret the bit layout of an IEEE-754 floating point value as an unsigned integer. |
|||
/// |
|||
/// @param [in] x A 32bit floating value. |
|||
/// |
|||
/// @returns |
|||
/// An unsigned 32bit integer value containing the bit pattern of <c><i>x</i></c>. |
|||
/// |
|||
/// @ingroup CPU |
|||
FFX_STATIC FfxUInt32 ffxAsUInt32(FfxFloat32 x) |
|||
{ |
|||
union |
|||
{ |
|||
FfxFloat32 f; |
|||
FfxUInt32 u; |
|||
} bits; |
|||
|
|||
bits.f = x; |
|||
return bits.u; |
|||
} |
|||
|
|||
FFX_STATIC FfxFloat32 ffxDot2(FfxFloat32x2 a, FfxFloat32x2 b) |
|||
{ |
|||
return a[0] * b[0] + a[1] * b[1]; |
|||
} |
|||
|
|||
FFX_STATIC FfxFloat32 ffxDot3(FfxFloat32x3 a, FfxFloat32x3 b) |
|||
{ |
|||
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; |
|||
} |
|||
|
|||
FFX_STATIC FfxFloat32 ffxDot4(FfxFloat32x4 a, FfxFloat32x4 b) |
|||
{ |
|||
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; |
|||
} |
|||
|
|||
/// Compute the linear interopation between two values. |
|||
/// |
|||
/// Implemented by calling the GLSL <c><i>mix</i></c> instrinsic function. Implements the |
|||
/// following math: |
|||
/// |
|||
/// (1 - t) * x + t * y |
|||
/// |
|||
/// @param [in] x The first value to lerp between. |
|||
/// @param [in] y The second value to lerp between. |
|||
/// @param [in] t The value to determine how much of <c><i>x</i></c> and how much of <c><i>y</i></c>. |
|||
/// |
|||
/// @returns |
|||
/// A linearly interpolated value between <c><i>x</i></c> and <c><i>y</i></c> according to <c><i>t</i></c>. |
|||
/// |
|||
/// @ingroup CPU |
|||
FFX_STATIC FfxFloat32 ffxLerp(FfxFloat32 x, FfxFloat32 y, FfxFloat32 t) |
|||
{ |
|||
return y * t + (-x * t + x); |
|||
} |
|||
|
|||
/// Compute the reciprocal of a value. |
|||
/// |
|||
/// @param [in] x The value to compute the reciprocal for. |
|||
/// |
|||
/// @returns |
|||
/// The reciprocal value of <c><i>x</i></c>. |
|||
/// |
|||
/// @ingroup CPU |
|||
FFX_STATIC FfxFloat32 ffxReciprocal(FfxFloat32 a) |
|||
{ |
|||
return 1.0f / a; |
|||
} |
|||
|
|||
/// Compute the square root of a value. |
|||
/// |
|||
/// @param [in] x The first value to compute the min of. |
|||
/// |
|||
/// @returns |
|||
/// The the square root of <c><i>x</i></c>. |
|||
/// |
|||
/// @ingroup CPU |
|||
FFX_STATIC FfxFloat32 ffxSqrt(FfxFloat32 x) |
|||
{ |
|||
return sqrt(x); |
|||
} |
|||
|
|||
FFX_STATIC FfxUInt32 AShrSU1(FfxUInt32 a, FfxUInt32 b) |
|||
{ |
|||
return FfxUInt32(FfxInt32(a) >> FfxInt32(b)); |
|||
} |
|||
|
|||
/// Compute the factional part of a decimal value. |
|||
/// |
|||
/// This function calculates <c><i>x - floor(x)</i></c>. |
|||
/// |
|||
/// @param [in] x The value to compute the fractional part from. |
|||
/// |
|||
/// @returns |
|||
/// The fractional part of <c><i>x</i></c>. |
|||
/// |
|||
/// @ingroup CPU |
|||
FFX_STATIC FfxFloat32 ffxFract(FfxFloat32 a) |
|||
{ |
|||
return a - floor(a); |
|||
} |
|||
|
|||
/// Compute the reciprocal square root of a value. |
|||
/// |
|||
/// @param [in] x The value to compute the reciprocal for. |
|||
/// |
|||
/// @returns |
|||
/// The reciprocal square root value of <c><i>x</i></c>. |
|||
/// |
|||
/// @ingroup CPU |
|||
FFX_STATIC FfxFloat32 rsqrt(FfxFloat32 a) |
|||
{ |
|||
return ffxReciprocal(ffxSqrt(a)); |
|||
} |
|||
|
|||
FFX_STATIC FfxFloat32 ffxMin(FfxFloat32 x, FfxFloat32 y) |
|||
{ |
|||
return x < y ? x : y; |
|||
} |
|||
|
|||
FFX_STATIC FfxUInt32 ffxMin(FfxUInt32 x, FfxUInt32 y) |
|||
{ |
|||
return x < y ? x : y; |
|||
} |
|||
|
|||
FFX_STATIC FfxFloat32 ffxMax(FfxFloat32 x, FfxFloat32 y) |
|||
{ |
|||
return x > y ? x : y; |
|||
} |
|||
|
|||
FFX_STATIC FfxUInt32 ffxMax(FfxUInt32 x, FfxUInt32 y) |
|||
{ |
|||
return x > y ? x : y; |
|||
} |
|||
|
|||
/// Clamp a value to a [0..1] range. |
|||
/// |
|||
/// @param [in] x The value to clamp to [0..1] range. |
|||
/// |
|||
/// @returns |
|||
/// The clamped version of <c><i>x</i></c>. |
|||
/// |
|||
/// @ingroup CPU |
|||
FFX_STATIC FfxFloat32 ffxSaturate(FfxFloat32 a) |
|||
{ |
|||
return ffxMin(1.0f, ffxMax(0.0f, a)); |
|||
} |
|||
|
|||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|||
|
|||
FFX_STATIC void opAAddOneF3(FfxFloat32x3 d, FfxFloat32x3 a, FfxFloat32 b) |
|||
{ |
|||
d[0] = a[0] + b; |
|||
d[1] = a[1] + b; |
|||
d[2] = a[2] + b; |
|||
return; |
|||
} |
|||
|
|||
FFX_STATIC void opACpyF3(FfxFloat32x3 d, FfxFloat32x3 a) |
|||
{ |
|||
d[0] = a[0]; |
|||
d[1] = a[1]; |
|||
d[2] = a[2]; |
|||
return; |
|||
} |
|||
|
|||
FFX_STATIC void opAMulF3(FfxFloat32x3 d, FfxFloat32x3 a, FfxFloat32x3 b) |
|||
{ |
|||
d[0] = a[0] * b[0]; |
|||
d[1] = a[1] * b[1]; |
|||
d[2] = a[2] * b[2]; |
|||
return; |
|||
} |
|||
|
|||
FFX_STATIC void opAMulOneF3(FfxFloat32x3 d, FfxFloat32x3 a, FfxFloat32 b) |
|||
{ |
|||
d[0] = a[0] * b; |
|||
d[1] = a[1] * b; |
|||
d[2] = a[2] * b; |
|||
return; |
|||
} |
|||
|
|||
FFX_STATIC void opARcpF3(FfxFloat32x3 d, FfxFloat32x3 a) |
|||
{ |
|||
d[0] = ffxReciprocal(a[0]); |
|||
d[1] = ffxReciprocal(a[1]); |
|||
d[2] = ffxReciprocal(a[2]); |
|||
return; |
|||
} |
|||
|
|||
/// Convert FfxFloat32 to half (in lower 16-bits of output). |
|||
/// |
|||
/// This function implements the same fast technique that is documented here: ftp://ftp.fox-toolkit.org/pub/fasthalffloatconversion.pdf |
|||
/// |
|||
/// The function supports denormals. |
|||
/// |
|||
/// Some conversion rules are to make computations possibly "safer" on the GPU, |
|||
/// -INF & -NaN -> -65504 |
|||
/// +INF & +NaN -> +65504 |
|||
/// |
|||
/// @param [in] f The 32bit floating point value to convert. |
|||
/// |
|||
/// @returns |
|||
/// The closest 16bit floating point value to <c><i>f</i></c>. |
|||
/// |
|||
/// @ingroup CPU |
|||
FFX_STATIC FfxUInt32 f32tof16(FfxFloat32 f) |
|||
{ |
|||
static FfxUInt16 base[512] = { |
|||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
|||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
|||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
|||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
|||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
|||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, |
|||
0x0800, 0x0c00, 0x1000, 0x1400, 0x1800, 0x1c00, 0x2000, 0x2400, 0x2800, 0x2c00, 0x3000, 0x3400, 0x3800, 0x3c00, 0x4000, 0x4400, 0x4800, 0x4c00, 0x5000, |
|||
0x5400, 0x5800, 0x5c00, 0x6000, 0x6400, 0x6800, 0x6c00, 0x7000, 0x7400, 0x7800, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, |
|||
0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, |
|||
0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, |
|||
0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, |
|||
0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, |
|||
0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, |
|||
0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, |
|||
0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, |
|||
0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, |
|||
0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, |
|||
0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, |
|||
0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8001, 0x8002, |
|||
0x8004, 0x8008, 0x8010, 0x8020, 0x8040, 0x8080, 0x8100, 0x8200, 0x8400, 0x8800, 0x8c00, 0x9000, 0x9400, 0x9800, 0x9c00, 0xa000, 0xa400, 0xa800, 0xac00, |
|||
0xb000, 0xb400, 0xb800, 0xbc00, 0xc000, 0xc400, 0xc800, 0xcc00, 0xd000, 0xd400, 0xd800, 0xdc00, 0xe000, 0xe400, 0xe800, 0xec00, 0xf000, 0xf400, 0xf800, |
|||
0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, |
|||
0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, |
|||
0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, |
|||
0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, |
|||
0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, |
|||
0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff, 0xfbff |
|||
}; |
|||
|
|||
static FfxUInt8 shift[512] = { |
|||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, |
|||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, |
|||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, |
|||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, |
|||
0x18, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, |
|||
0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, |
|||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, |
|||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, |
|||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, |
|||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, |
|||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, |
|||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, |
|||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, |
|||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, |
|||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, |
|||
0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, |
|||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, |
|||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, |
|||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, |
|||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, |
|||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 |
|||
}; |
|||
|
|||
union |
|||
{ |
|||
FfxFloat32 f; |
|||
FfxUInt32 u; |
|||
} bits; |
|||
|
|||
bits.f = f; |
|||
FfxUInt32 u = bits.u; |
|||
FfxUInt32 i = u >> 23; |
|||
return (FfxUInt32)(base[i]) + ((u & 0x7fffff) >> shift[i]); |
|||
} |
|||
|
|||
/// Pack 2x32-bit floating point values in a single 32bit value. |
|||
/// |
|||
/// This function first converts each component of <c><i>value</i></c> into their nearest 16-bit floating |
|||
/// point representation, and then stores the X and Y components in the lower and upper 16 bits of the |
|||
/// 32bit unsigned integer respectively. |
|||
/// |
|||
/// @param [in] value A 2-dimensional floating point value to convert and pack. |
|||
/// |
|||
/// @returns |
|||
/// A packed 32bit value containing 2 16bit floating point values. |
|||
/// |
|||
/// @ingroup CPU |
|||
FFX_STATIC FfxUInt32 packHalf2x16(FfxFloat32x2 a) |
|||
{ |
|||
return f32tof16(a[0]) + (f32tof16(a[1]) << 16); |
|||
} |
|||
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 5e03235b410e0b344b3de52efe50de9b |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
2784
Assets/Shaders/FSR2/ffx_core_gpu_common.h
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 8ca16c7c1627e754cb45dd6c91cd7b5b |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
2978
Assets/Shaders/FSR2/ffx_core_gpu_common_half.h
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 3df3a1ba6be641845a6139e19a3f6000 |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
1527
Assets/Shaders/FSR2/ffx_core_hlsl.h
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 30b6dcd5041405a468ec871a19b8fee4 |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,50 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
FfxFloat32x3 opAAddOneF3(FfxFloat32x3 d, FfxFloat32x3 a, FfxFloat32 b) |
|||
{ |
|||
d = a + ffxBroadcast3(b); |
|||
return d; |
|||
} |
|||
|
|||
FfxFloat32x3 opACpyF3(FfxFloat32x3 d, FfxFloat32x3 a) |
|||
{ |
|||
d = a; |
|||
return d; |
|||
} |
|||
|
|||
FfxFloat32x3 opAMulF3(FfxFloat32x3 d, FfxFloat32x3 a, FfxFloat32x3 b) |
|||
{ |
|||
d = a * b; |
|||
return d; |
|||
} |
|||
|
|||
FfxFloat32x3 opAMulOneF3(FfxFloat32x3 d, FfxFloat32x3 a, FfxFloat32 b) |
|||
{ |
|||
d = a * ffxBroadcast3(b); |
|||
return d; |
|||
} |
|||
|
|||
FfxFloat32x3 opARcpF3(FfxFloat32x3 d, FfxFloat32x3 a) |
|||
{ |
|||
d = rcp(a); |
|||
return d; |
|||
} |
|||
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 6370ecd01d478c543865dc098810590c |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
1246
Assets/Shaders/FSR2/ffx_fsr1.h
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: b1ff8d458fc2ffe42a18cd4b71986e64 |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,279 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
FFX_MIN16_F4 WrapDepthClipMask(FFX_MIN16_I2 iPxSample) |
|||
{ |
|||
return FFX_MIN16_F4(LoadDepthClip(iPxSample).r, 0, 0, 0); |
|||
} |
|||
|
|||
DeclareCustomFetchBilinearSamples(FetchDepthClipMaskSamples, WrapDepthClipMask) |
|||
DeclareCustomTextureSample(DepthClipMaskSample, Bilinear, FetchDepthClipMaskSamples) |
|||
|
|||
FFX_MIN16_F4 WrapTransparencyAndCompositionMask(FFX_MIN16_I2 iPxSample) |
|||
{ |
|||
return FFX_MIN16_F4(LoadTransparencyAndCompositionMask(iPxSample).r, 0, 0, 0); |
|||
} |
|||
|
|||
DeclareCustomFetchBilinearSamples(FetchTransparencyAndCompositionMaskSamples, WrapTransparencyAndCompositionMask) |
|||
DeclareCustomTextureSample(TransparencyAndCompositionMaskSample, Bilinear, FetchTransparencyAndCompositionMaskSamples) |
|||
|
|||
FfxFloat32x4 WrapLumaStabilityFactor(FFX_MIN16_I2 iPxSample) |
|||
{ |
|||
return FfxFloat32x4(LoadLumaStabilityFactor(iPxSample), 0, 0, 0); |
|||
} |
|||
|
|||
DeclareCustomFetchBilinearSamples(FetchLumaStabilitySamples, WrapLumaStabilityFactor) |
|||
DeclareCustomTextureSample(LumaStabilityFactorSample, Bilinear, FetchLumaStabilitySamples) |
|||
|
|||
FfxFloat32 GetPxHrVelocity(FfxFloat32x2 fMotionVector) |
|||
{ |
|||
return length(fMotionVector * DisplaySize()); |
|||
} |
|||
|
|||
void Accumulate(FFX_MIN16_I2 iPxHrPos, FFX_PARAMETER_INOUT FfxFloat32x4 fHistory, FFX_PARAMETER_IN FfxFloat32x4 fUpsampled, FFX_PARAMETER_IN FfxFloat32 fDepthClipFactor, FFX_PARAMETER_IN FfxFloat32 fHrVelocity) |
|||
{ |
|||
|
|||
fHistory.w = fHistory.w + fUpsampled.w; |
|||
|
|||
fUpsampled.rgb = YCoCgToRGB(fUpsampled.rgb); |
|||
|
|||
const FfxFloat32 fAlpha = fUpsampled.w / fHistory.w; |
|||
fHistory.rgb = ffxLerp(fHistory.rgb, fUpsampled.rgb, fAlpha); |
|||
|
|||
FfxFloat32 fMaxAverageWeight = ffxLerp(MaxAccumulationWeight(), accumulationMaxOnMotion, ffxSaturate(fHrVelocity * 10.0f)); |
|||
fHistory.w = ffxMin(fHistory.w, fMaxAverageWeight); |
|||
} |
|||
|
|||
void RectifyHistory( |
|||
RectificationBoxData clippingBox, |
|||
inout FfxFloat32x4 fHistory, |
|||
FFX_PARAMETER_IN LOCK_STATUS_T fLockStatus, |
|||
FFX_PARAMETER_IN UPSAMPLE_F fDepthClipFactor, |
|||
FFX_PARAMETER_IN UPSAMPLE_F fLumaStabilityFactor, |
|||
FFX_PARAMETER_IN UPSAMPLE_F fLuminanceDiff, |
|||
FFX_PARAMETER_IN UPSAMPLE_F fUpsampleWeight, |
|||
FFX_PARAMETER_IN FfxFloat32 fLockContributionThisFrame) |
|||
{ |
|||
UPSAMPLE_F fScaleFactorInfluence = UPSAMPLE_F(1.0f / DownscaleFactor().x - 1); |
|||
UPSAMPLE_F fBoxScale = UPSAMPLE_F(1.0f) + (UPSAMPLE_F(0.5f) * fScaleFactorInfluence); |
|||
|
|||
FFX_MIN16_F3 fScaledBoxVec = clippingBox.boxVec * fBoxScale; |
|||
UPSAMPLE_F3 boxMin = clippingBox.boxCenter - fScaledBoxVec; |
|||
UPSAMPLE_F3 boxMax = clippingBox.boxCenter + fScaledBoxVec; |
|||
UPSAMPLE_F3 boxCenter = clippingBox.boxCenter; |
|||
UPSAMPLE_F boxVecSize = length(clippingBox.boxVec); |
|||
|
|||
boxMin = ffxMax(clippingBox.aabbMin, boxMin); |
|||
boxMax = ffxMin(clippingBox.aabbMax, boxMax); |
|||
|
|||
UPSAMPLE_F3 distToClampOutside = UPSAMPLE_F3(ffxMax(ffxMax(UPSAMPLE_F3_BROADCAST(0.0f), boxMin - UPSAMPLE_F3(fHistory.xyz)), ffxMax(UPSAMPLE_F3_BROADCAST(0.0f), UPSAMPLE_F3(fHistory.xyz) - boxMax))); |
|||
|
|||
if (any(FFX_GREATER_THAN(distToClampOutside, UPSAMPLE_F3_BROADCAST(0.0f)))) { |
|||
|
|||
const UPSAMPLE_F3 clampedHistorySample = clamp(UPSAMPLE_F3(fHistory.xyz), boxMin, boxMax); |
|||
|
|||
UPSAMPLE_F3 clippedHistoryToBoxCenter = abs(clampedHistorySample - boxCenter); |
|||
UPSAMPLE_F3 historyToBoxCenter = abs(UPSAMPLE_F3(fHistory.xyz) - boxCenter); |
|||
UPSAMPLE_F3 HistoryColorWeight; |
|||
HistoryColorWeight.x = historyToBoxCenter.x > UPSAMPLE_F(0) ? clippedHistoryToBoxCenter.x / historyToBoxCenter.x : UPSAMPLE_F(0.0f); |
|||
HistoryColorWeight.y = historyToBoxCenter.y > UPSAMPLE_F(0) ? clippedHistoryToBoxCenter.y / historyToBoxCenter.y : UPSAMPLE_F(0.0f); |
|||
HistoryColorWeight.z = historyToBoxCenter.z > UPSAMPLE_F(0) ? clippedHistoryToBoxCenter.z / historyToBoxCenter.z : UPSAMPLE_F(0.0f); |
|||
|
|||
UPSAMPLE_F3 fHistoryContribution = HistoryColorWeight; |
|||
|
|||
// only lock luma |
|||
fHistoryContribution += UPSAMPLE_F3_BROADCAST(ffxMax(UPSAMPLE_F(fLockContributionThisFrame), fLumaStabilityFactor)); |
|||
fHistoryContribution *= (fDepthClipFactor * fDepthClipFactor); |
|||
|
|||
fHistory.xyz = FfxFloat32x3(ffxLerp(clampedHistorySample.xyz, fHistory.xyz, ffxSaturate(fHistoryContribution))); |
|||
} |
|||
} |
|||
|
|||
void WriteUpscaledOutput(FFX_MIN16_I2 iPxHrPos, FfxFloat32x3 fUpscaledColor) |
|||
{ |
|||
StoreUpscaledOutput(iPxHrPos, fUpscaledColor); |
|||
} |
|||
|
|||
FfxFloat32 GetLumaStabilityFactor(FfxFloat32x2 fHrUv, FfxFloat32 fHrVelocity) |
|||
{ |
|||
FfxFloat32 fLumaStabilityFactor = SampleLumaStabilityFactor(fHrUv); |
|||
|
|||
// Only apply on still, have to reproject luma history resource if we want it to work on motion |
|||
fLumaStabilityFactor *= FfxFloat32(fHrVelocity < 0.1f); |
|||
|
|||
return fLumaStabilityFactor; |
|||
} |
|||
|
|||
FfxFloat32 GetLockContributionThisFrame(FfxFloat32x2 fUvCoord, FfxFloat32 fAccumulationMask, FfxFloat32 fParticleMask, LOCK_STATUS_T fLockStatus) |
|||
{ |
|||
const UPSAMPLE_F fNormalizedLockLifetime = GetNormalizedRemainingLockLifetime(fLockStatus); |
|||
|
|||
// Rectify on lock frame |
|||
FfxFloat32 fLockContributionThisFrame = ffxSaturate(fNormalizedLockLifetime * UPSAMPLE_F(4)); |
|||
|
|||
fLockContributionThisFrame *= (1.0f - fParticleMask); |
|||
//Take down contribution in transparent areas |
|||
fLockContributionThisFrame *= FfxFloat32(fAccumulationMask.r > 0.1f); |
|||
|
|||
return fLockContributionThisFrame; |
|||
} |
|||
|
|||
void FinalizeLockStatus(FFX_MIN16_I2 iPxHrPos, LOCK_STATUS_T fLockStatus, FfxFloat32 fUpsampledWeight) |
|||
{ |
|||
// Increase trust |
|||
const UPSAMPLE_F fTrustIncreaseLanczosMax = UPSAMPLE_F(12); // same increase no matter the MaxAccumulationWeight() value. |
|||
const UPSAMPLE_F fTrustIncrease = UPSAMPLE_F(fUpsampledWeight / fTrustIncreaseLanczosMax); |
|||
fLockStatus[LOCK_TRUST] = ffxMin(LOCK_STATUS_F1(1), fLockStatus[LOCK_TRUST] + fTrustIncrease); |
|||
|
|||
// Decrease lock lifetime |
|||
const UPSAMPLE_F fLifetimeDecreaseLanczosMax = UPSAMPLE_F(JitterSequenceLength()) * UPSAMPLE_F(averageLanczosWeightPerFrame); |
|||
const UPSAMPLE_F fLifetimeDecrease = UPSAMPLE_F(fUpsampledWeight / fLifetimeDecreaseLanczosMax); |
|||
fLockStatus[LOCK_LIFETIME_REMAINING] = ffxMax(LOCK_STATUS_F1(0), fLockStatus[LOCK_LIFETIME_REMAINING] - fLifetimeDecrease); |
|||
|
|||
StoreLockStatus(iPxHrPos, fLockStatus); |
|||
} |
|||
|
|||
UPSAMPLE_F ComputeMaxAccumulationWeight(UPSAMPLE_F fHrVelocity, UPSAMPLE_F fReactiveMax, UPSAMPLE_F fDepthClipFactor, UPSAMPLE_F fLuminanceDiff, LockState lockState) { |
|||
|
|||
UPSAMPLE_F normalizedMinimum = UPSAMPLE_F(accumulationMaxOnMotion) / UPSAMPLE_F(MaxAccumulationWeight()); |
|||
|
|||
UPSAMPLE_F fReactiveMaxAccumulationWeight = UPSAMPLE_F(1) - fReactiveMax; |
|||
UPSAMPLE_F fMotionMaxAccumulationWeight = ffxLerp(UPSAMPLE_F(1), normalizedMinimum, ffxSaturate(fHrVelocity * UPSAMPLE_F(10))); |
|||
UPSAMPLE_F fDepthClipMaxAccumulationWeight = fDepthClipFactor; |
|||
|
|||
UPSAMPLE_F fLuminanceDiffMaxAccumulationWeight = ffxSaturate(ffxMax(normalizedMinimum, UPSAMPLE_F(1) - fLuminanceDiff)); |
|||
|
|||
UPSAMPLE_F maxAccumulation = UPSAMPLE_F(MaxAccumulationWeight()) * ffxMin( |
|||
ffxMin(fReactiveMaxAccumulationWeight, fMotionMaxAccumulationWeight), |
|||
ffxMin(fDepthClipMaxAccumulationWeight, fLuminanceDiffMaxAccumulationWeight) |
|||
); |
|||
|
|||
return (lockState.NewLock && !lockState.WasLockedPrevFrame) ? UPSAMPLE_F(accumulationMaxOnMotion) : maxAccumulation; |
|||
} |
|||
|
|||
UPSAMPLE_F2 ComputeKernelWeight(in UPSAMPLE_F fHistoryWeight, in UPSAMPLE_F fDepthClipFactor, in UPSAMPLE_F fReactivityFactor) { |
|||
UPSAMPLE_F fKernelSizeBias = ffxSaturate(ffxMax(UPSAMPLE_F(0), fHistoryWeight - UPSAMPLE_F(0.5)) / UPSAMPLE_F(3)); |
|||
|
|||
//high bias on disocclusions |
|||
|
|||
UPSAMPLE_F fOneMinusReactiveMax = UPSAMPLE_F(1) - fReactivityFactor; |
|||
UPSAMPLE_F2 fKernelWeight = UPSAMPLE_F(1) + (UPSAMPLE_F(1.0f) / UPSAMPLE_F2(DownscaleFactor()) - UPSAMPLE_F(1)) * UPSAMPLE_F(fKernelSizeBias) * fOneMinusReactiveMax; |
|||
|
|||
//average value on disocclusion, to help decrease high value sample importance wait for accumulation to kick in |
|||
fKernelWeight *= FFX_BROADCAST_MIN_FLOAT16X2(UPSAMPLE_F(0.5) + fDepthClipFactor * UPSAMPLE_F(0.5)); |
|||
|
|||
return ffxMin(FFX_BROADCAST_MIN_FLOAT16X2(1.99), fKernelWeight); |
|||
} |
|||
|
|||
void Accumulate(FFX_MIN16_I2 iPxHrPos) |
|||
{ |
|||
const FfxFloat32x2 fSamplePosHr = iPxHrPos + 0.5f; |
|||
const FfxFloat32x2 fPxLrPos = fSamplePosHr * DownscaleFactor(); // Source resolution output pixel center position |
|||
const FfxInt32x2 iPxLrPos = FfxInt32x2(floor(fPxLrPos)); // TODO: what about weird upscale factors... |
|||
|
|||
const FfxFloat32x2 fSamplePosUnjitterLr = (FfxFloat32x2(iPxLrPos) + FfxFloat32x2(0.5f, 0.5f)) - Jitter(); // This is the un-jittered position of the sample at offset 0,0 |
|||
|
|||
const FfxFloat32x2 fLrUvJittered = (fPxLrPos + Jitter()) / RenderSize(); |
|||
|
|||
const FfxFloat32x2 fHrUv = (iPxHrPos + 0.5f) / DisplaySize(); |
|||
const FfxFloat32x2 fMotionVector = GetMotionVector(iPxHrPos, fHrUv); |
|||
|
|||
const FfxFloat32 fHrVelocity = GetPxHrVelocity(fMotionVector); |
|||
const FfxFloat32 fDepthClipFactor = ffxSaturate(SampleDepthClip(fLrUvJittered)); |
|||
const FfxFloat32 fLumaStabilityFactor = GetLumaStabilityFactor(fHrUv, fHrVelocity); |
|||
const FfxFloat32 fAccumulationMask = 1.0f - TransparencyAndCompositionMaskSample(fLrUvJittered, RenderSize()).r; |
|||
|
|||
FfxInt32x2 offsetTL; |
|||
offsetTL.x = (fSamplePosUnjitterLr.x > fPxLrPos.x) ? FfxInt32(0) : FfxInt32(1); |
|||
offsetTL.y = (fSamplePosUnjitterLr.y > fPxLrPos.y) ? FfxInt32(0) : FfxInt32(1); |
|||
|
|||
const UPSAMPLE_F fReactiveMax = UPSAMPLE_F(1) - Pow3(UPSAMPLE_F(1) - LoadReactiveMax(FFX_MIN16_I2(iPxLrPos + offsetTL))); |
|||
|
|||
FfxFloat32x4 fHistoryColorAndWeight = FfxFloat32x4(0.0f, 0.0f, 0.0f, 0.0f); |
|||
LOCK_STATUS_T fLockStatus = CreateNewLockSample(); |
|||
FfxBoolean bIsExistingSample = FFX_TRUE; |
|||
|
|||
FfxFloat32x2 fReprojectedHrUv = FfxFloat32x2(0, 0); |
|||
ComputeReprojectedUVs(iPxHrPos, fMotionVector, fReprojectedHrUv, bIsExistingSample); |
|||
|
|||
if (bIsExistingSample) { |
|||
ReprojectHistoryColor(iPxHrPos, fReprojectedHrUv, fHistoryColorAndWeight); |
|||
ReprojectHistoryLockStatus(iPxHrPos, fReprojectedHrUv, fLockStatus); |
|||
} |
|||
|
|||
FFX_MIN16_F fLuminanceDiff = FFX_MIN16_F(0.0f); |
|||
|
|||
LockState lockState = PostProcessLockStatus(iPxHrPos, fLrUvJittered, FFX_MIN16_F(fDepthClipFactor), fHrVelocity, fHistoryColorAndWeight.w, fLockStatus, fLuminanceDiff); |
|||
|
|||
fHistoryColorAndWeight.w = ffxMin(fHistoryColorAndWeight.w, ComputeMaxAccumulationWeight( |
|||
UPSAMPLE_F(fHrVelocity), fReactiveMax, UPSAMPLE_F(fDepthClipFactor), UPSAMPLE_F(fLuminanceDiff), lockState |
|||
)); |
|||
|
|||
const UPSAMPLE_F fNormalizedLockLifetime = GetNormalizedRemainingLockLifetime(fLockStatus); |
|||
|
|||
// Kill accumulation based on shading change |
|||
fHistoryColorAndWeight.w = ffxMin(fHistoryColorAndWeight.w, FFX_MIN16_F(ffxMax(0.0f, MaxAccumulationWeight() * ffxPow(UPSAMPLE_F(1) - fLuminanceDiff, 2.0f / 1.0f)))); |
|||
|
|||
// Load upsampled input color |
|||
RectificationBoxData clippingBox; |
|||
|
|||
FfxFloat32 fKernelBias = fAccumulationMask * ffxSaturate(ffxMax(0.0f, fHistoryColorAndWeight.w - 0.5f) / 3.0f); |
|||
|
|||
FfxFloat32 fReactiveWeighted = 0; |
|||
|
|||
// No trust in reactive areas |
|||
fLockStatus[LOCK_TRUST] = ffxMin(fLockStatus[LOCK_TRUST], LOCK_STATUS_F1(1.0f) - LOCK_STATUS_F1(pow(fReactiveMax, 1.0f / 3.0f))); |
|||
fLockStatus[LOCK_TRUST] = ffxMin(fLockStatus[LOCK_TRUST], LOCK_STATUS_F1(fDepthClipFactor)); |
|||
|
|||
UPSAMPLE_F2 fKernelWeight = ComputeKernelWeight(UPSAMPLE_F(fHistoryColorAndWeight.w), UPSAMPLE_F(fDepthClipFactor), ffxMax((UPSAMPLE_F(1) - fLockStatus[LOCK_TRUST]), fReactiveMax)); |
|||
|
|||
UPSAMPLE_F4 fUpsampledColorAndWeight = ComputeUpsampledColorAndWeight(iPxHrPos, fKernelWeight, clippingBox); |
|||
|
|||
|
|||
FfxFloat32 fLockContributionThisFrame = GetLockContributionThisFrame(fHrUv, fAccumulationMask, fReactiveMax, fLockStatus); |
|||
|
|||
// Update accumulation and rectify history |
|||
if (fHistoryColorAndWeight.w > 0.0f) { |
|||
|
|||
RectifyHistory(clippingBox, fHistoryColorAndWeight, fLockStatus, UPSAMPLE_F(fDepthClipFactor), UPSAMPLE_F(fLumaStabilityFactor), UPSAMPLE_F(fLuminanceDiff), fUpsampledColorAndWeight.w, fLockContributionThisFrame); |
|||
|
|||
fHistoryColorAndWeight.rgb = YCoCgToRGB(fHistoryColorAndWeight.rgb); |
|||
} |
|||
|
|||
Accumulate(iPxHrPos, fHistoryColorAndWeight, fUpsampledColorAndWeight, fDepthClipFactor, fHrVelocity); |
|||
|
|||
//Subtract accumulation weight in reactive areas |
|||
fHistoryColorAndWeight.w -= FfxFloat32(fUpsampledColorAndWeight.w * fReactiveMax); |
|||
|
|||
#if FFX_FSR2_OPTION_HDR_COLOR_INPUT |
|||
fHistoryColorAndWeight.rgb = InverseTonemap(fHistoryColorAndWeight.rgb); |
|||
#endif |
|||
fHistoryColorAndWeight.rgb /= Exposure(); |
|||
|
|||
FinalizeLockStatus(iPxHrPos, fLockStatus, fUpsampledColorAndWeight.w); |
|||
|
|||
StoreInternalColorAndWeight(iPxHrPos, fHistoryColorAndWeight); |
|||
|
|||
// Output final color when RCAS is disabled |
|||
#if FFX_FSR2_OPTION_APPLY_SHARPENING == 0 |
|||
WriteUpscaledOutput(iPxHrPos, fHistoryColorAndWeight.rgb); |
|||
#endif |
|||
} |
|||
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 83c949d45c1701541a93a43af9bb13fc |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,90 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
// FSR2 pass 5 |
|||
// SRV 4 : FSR2_Exposure : r_exposure |
|||
// SRV 6 : m_UpscaleTransparencyAndComposition : r_transparency_and_composition_mask |
|||
// SRV 8 : FSR2_DilatedVelocity : r_dilated_motion_vectors |
|||
// SRV 10 : FSR2_InternalUpscaled2 : r_internal_upscaled_color |
|||
// SRV 11 : FSR2_LockStatus2 : r_lock_status |
|||
// SRV 12 : FSR2_DepthClip : r_depth_clip |
|||
// SRV 13 : FSR2_PreparedInputColor : r_prepared_input_color |
|||
// SRV 14 : FSR2_LumaHistory : r_luma_history |
|||
// SRV 16 : FSR2_LanczosLutData : r_lanczos_lut |
|||
// SRV 26 : FSR2_MaximumUpsampleBias : r_upsample_maximum_bias_lut |
|||
// SRV 27 : FSR2_ReactiveMaskMax : r_reactive_max |
|||
// SRV 28 : FSR2_ExposureMips : r_imgMips |
|||
// UAV 10 : FSR2_InternalUpscaled1 : rw_internal_upscaled_color |
|||
// UAV 11 : FSR2_LockStatus1 : rw_lock_status |
|||
// UAV 18 : DisplayOutput : rw_upscaled_output |
|||
// CB 0 : cbFSR2 |
|||
// CB 1 : FSR2DispatchOffsets |
|||
|
|||
#define FSR2_BIND_SRV_EXPOSURE 0 |
|||
#define FSR2_BIND_SRV_TRANSPARENCY_AND_COMPOSITION_MASK 1 |
|||
#define FSR2_BIND_SRV_DILATED_MOTION_VECTORS 2 |
|||
#define FSR2_BIND_SRV_INTERNAL_UPSCALED 3 |
|||
#define FSR2_BIND_SRV_LOCK_STATUS 4 |
|||
#define FSR2_BIND_SRV_DEPTH_CLIP 5 |
|||
#define FSR2_BIND_SRV_PREPARED_INPUT_COLOR 6 |
|||
#define FSR2_BIND_SRV_LUMA_HISTORY 7 |
|||
#define FSR2_BIND_SRV_LANCZOS_LUT 8 |
|||
#define FSR2_BIND_SRV_UPSCALE_MAXIMUM_BIAS_LUT 9 |
|||
#define FSR2_BIND_SRV_REACTIVE_MAX 10 |
|||
#define FSR2_BIND_SRV_EXPOSURE_MIPS 11 |
|||
#define FSR2_BIND_UAV_INTERNAL_UPSCALED 0 |
|||
#define FSR2_BIND_UAV_LOCK_STATUS 1 |
|||
#define FSR2_BIND_UAV_UPSCALED_OUTPUT 2 |
|||
|
|||
#define FSR2_BIND_CB_FSR2 0 |
|||
|
|||
#include "ffx_fsr2_callbacks_hlsl.h" |
|||
#include "ffx_fsr2_common.h" |
|||
#include "ffx_fsr2_sample.h" |
|||
#include "ffx_fsr2_upsample.h" |
|||
#include "ffx_fsr2_postprocess_lock_status.h" |
|||
#include "ffx_fsr2_reproject.h" |
|||
#include "ffx_fsr2_accumulate.h" |
|||
|
|||
#ifndef FFX_FSR2_THREAD_GROUP_WIDTH |
|||
#define FFX_FSR2_THREAD_GROUP_WIDTH 8 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_WIDTH |
|||
#ifndef FFX_FSR2_THREAD_GROUP_HEIGHT |
|||
#define FFX_FSR2_THREAD_GROUP_HEIGHT 8 |
|||
#endif // FFX_FSR2_THREAD_GROUP_HEIGHT |
|||
#ifndef FFX_FSR2_THREAD_GROUP_DEPTH |
|||
#define FFX_FSR2_THREAD_GROUP_DEPTH 1 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_DEPTH |
|||
#ifndef FFX_FSR2_NUM_THREADS |
|||
#define FFX_FSR2_NUM_THREADS [numthreads(FFX_FSR2_THREAD_GROUP_WIDTH, FFX_FSR2_THREAD_GROUP_HEIGHT, FFX_FSR2_THREAD_GROUP_DEPTH)] |
|||
#endif // #ifndef FFX_FSR2_NUM_THREADS |
|||
|
|||
FFX_FSR2_NUM_THREADS |
|||
FFX_FSR2_EMBED_ROOTSIG_CONTENT |
|||
void CS(uint2 uGroupId : SV_GroupID, uint2 uGroupThreadId : SV_GroupThreadID) |
|||
{ |
|||
const uint GroupRows = (uint(DisplaySize().y) + FFX_FSR2_THREAD_GROUP_HEIGHT - 1) / FFX_FSR2_THREAD_GROUP_HEIGHT; |
|||
uGroupId.y = GroupRows - uGroupId.y - 1; |
|||
|
|||
uint2 uDispatchThreadId = uGroupId * uint2(FFX_FSR2_THREAD_GROUP_WIDTH, FFX_FSR2_THREAD_GROUP_HEIGHT) + uGroupThreadId; |
|||
|
|||
Accumulate(min16int2(uDispatchThreadId)); |
|||
} |
|||
@ -0,0 +1,7 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 23360fd4b08e817458bc8523b94c47e0 |
|||
ShaderIncludeImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,87 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
#define FSR2_BIND_SRV_PRE_ALPHA_COLOR 0 |
|||
#define FSR2_BIND_SRV_POST_ALPHA_COLOR 1 |
|||
#define FSR2_BIND_UAV_REACTIVE 0 |
|||
#define FSR2_BIND_CB_FSR2 0 |
|||
|
|||
#include "ffx_fsr2_callbacks_hlsl.cginc" |
|||
#include "ffx_fsr2_common.cginc" |
|||
|
|||
#pragma kernel CS |
|||
|
|||
Texture2D<float4> r_input_color_pre_alpha : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_PRE_ALPHA_COLOR); |
|||
Texture2D<float4> r_input_color_post_alpha : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_POST_ALPHA_COLOR); |
|||
RWTexture2D<float> rw_output_reactive_mask : FFX_FSR2_DECLARE_UAV(FSR2_BIND_UAV_REACTIVE); |
|||
|
|||
#ifndef FFX_FSR2_THREAD_GROUP_WIDTH |
|||
#define FFX_FSR2_THREAD_GROUP_WIDTH 8 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_WIDTH |
|||
#ifndef FFX_FSR2_THREAD_GROUP_HEIGHT |
|||
#define FFX_FSR2_THREAD_GROUP_HEIGHT 8 |
|||
#endif // FFX_FSR2_THREAD_GROUP_HEIGHT |
|||
#ifndef FFX_FSR2_THREAD_GROUP_DEPTH |
|||
#define FFX_FSR2_THREAD_GROUP_DEPTH 1 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_DEPTH |
|||
#ifndef FFX_FSR2_NUM_THREADS |
|||
#define FFX_FSR2_NUM_THREADS [numthreads(FFX_FSR2_THREAD_GROUP_WIDTH, FFX_FSR2_THREAD_GROUP_HEIGHT, FFX_FSR2_THREAD_GROUP_DEPTH)] |
|||
#endif // #ifndef FFX_FSR2_NUM_THREADS |
|||
|
|||
cbuffer cbGenerateReactive : register(b0) |
|||
{ |
|||
float scale; |
|||
float threshold; |
|||
uint flags; |
|||
float _padding_; |
|||
}; |
|||
|
|||
FFX_FSR2_NUM_THREADS |
|||
FFX_FSR2_EMBED_ROOTSIG_CONTENT |
|||
void CS(uint2 uGroupId : SV_GroupID, uint2 uGroupThreadId : SV_GroupThreadID) |
|||
{ |
|||
uint2 uDispatchThreadId = uGroupId * uint2(FFX_FSR2_THREAD_GROUP_WIDTH, FFX_FSR2_THREAD_GROUP_HEIGHT) + uGroupThreadId; |
|||
|
|||
float3 ColorPreAlpha = r_input_color_pre_alpha[uDispatchThreadId].rgb; |
|||
float3 ColorPostAlpha = r_input_color_post_alpha[uDispatchThreadId].rgb; |
|||
|
|||
if (flags & FFX_FSR2_AUTOREACTIVEFLAGS_APPLY_TONEMAP) |
|||
{ |
|||
ColorPreAlpha = Tonemap(ColorPreAlpha); |
|||
ColorPostAlpha = Tonemap(ColorPostAlpha); |
|||
} |
|||
|
|||
if (flags & FFX_FSR2_AUTOREACTIVEFLAGS_APPLY_INVERSETONEMAP) |
|||
{ |
|||
ColorPreAlpha = InverseTonemap(ColorPreAlpha); |
|||
ColorPostAlpha = InverseTonemap(ColorPostAlpha); |
|||
} |
|||
|
|||
float out_reactive_value = 0.f; |
|||
float3 delta = abs(ColorPostAlpha - ColorPreAlpha); |
|||
|
|||
out_reactive_value = (flags & FFX_FSR2_AUTOREACTIVEFLAGS_USE_COMPONENTS_MAX) ? max(delta.x, max(delta.y, delta.z)) : length(delta); |
|||
out_reactive_value *= scale; |
|||
|
|||
out_reactive_value = (flags & FFX_FSR2_AUTOREACTIVEFLAGS_APPLY_THRESHOLD) ? (out_reactive_value < threshold ? 0 : 1) : out_reactive_value; |
|||
|
|||
rw_output_reactive_mask[uDispatchThreadId] = out_reactive_value; |
|||
} |
|||
@ -0,0 +1,8 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 912357a9240b1ef47a19dbddd659582f |
|||
ComputeShaderImporter: |
|||
externalObjects: {} |
|||
preprocessorOverride: 0 |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,933 @@ |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_SRV_DEPTH' with 'defined (FSR2_BIND_SRV_DEPTH)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_SRV_DEPTH_CLIP' with 'defined (FSR2_BIND_SRV_DEPTH_CLIP)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_SRV_DILATED_DEPTH' with 'defined (FSR2_BIND_SRV_DILATED_DEPTH)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_SRV_DILATED_MOTION_VECTORS' with 'defined (FSR2_BIND_SRV_DILATED_MOTION_VECTORS)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_SRV_EXPOSURE' with 'defined (FSR2_BIND_SRV_EXPOSURE)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_SRV_EXPOSURE_MIPS' with 'defined (FSR2_BIND_SRV_EXPOSURE_MIPS)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_SRV_INPUT_COLOR' with 'defined (FSR2_BIND_SRV_INPUT_COLOR)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_SRV_INTERNAL_UPSCALED' with 'defined (FSR2_BIND_SRV_INTERNAL_UPSCALED)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_SRV_LANCZOS_LUT' with 'defined (FSR2_BIND_SRV_LANCZOS_LUT)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_SRV_LOCK_STATUS' with 'defined (FSR2_BIND_SRV_LOCK_STATUS)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_SRV_LUMA_HISTORY' with 'defined (FSR2_BIND_SRV_LUMA_HISTORY)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_SRV_MOTION_VECTORS' with 'defined (FSR2_BIND_SRV_MOTION_VECTORS)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_SRV_PREPARED_INPUT_COLOR' with 'defined (FSR2_BIND_SRV_PREPARED_INPUT_COLOR)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_SRV_RCAS_INPUT' with 'defined (FSR2_BIND_SRV_RCAS_INPUT)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_SRV_REACTIVE_MASK' with 'defined (FSR2_BIND_SRV_REACTIVE_MASK)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_SRV_REACTIVE_MAX' with 'defined (FSR2_BIND_SRV_REACTIVE_MAX)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_SRV_RECONSTRUCTED_PREV_NEAREST_DEPTH' with 'defined (FSR2_BIND_SRV_RECONSTRUCTED_PREV_NEAREST_DEPTH)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_SRV_TRANSPARENCY_AND_COMPOSITION_MASK' with 'defined (FSR2_BIND_SRV_TRANSPARENCY_AND_COMPOSITION_MASK)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_SRV_UPSCALE_MAXIMUM_BIAS_LUT' with 'defined (FSR2_BIND_SRV_UPSCALE_MAXIMUM_BIAS_LUT)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_UAV_DEPTH_CLIP' with 'defined (FSR2_BIND_UAV_DEPTH_CLIP)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_UAV_DILATED_DEPTH' with 'defined (FSR2_BIND_UAV_DILATED_DEPTH)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_UAV_DILATED_MOTION_VECTORS' with 'defined (FSR2_BIND_UAV_DILATED_MOTION_VECTORS)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_UAV_EXPOSURE' with 'defined (FSR2_BIND_UAV_EXPOSURE)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_UAV_EXPOSURE_MIP_5' with 'defined (FSR2_BIND_UAV_EXPOSURE_MIP_5)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_UAV_EXPOSURE_MIP_LUMA_CHANGE' with 'defined (FSR2_BIND_UAV_EXPOSURE_MIP_LUMA_CHANGE)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_UAV_INTERNAL_UPSCALED' with 'defined (FSR2_BIND_UAV_INTERNAL_UPSCALED)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_UAV_LOCK_STATUS' with 'defined (FSR2_BIND_UAV_LOCK_STATUS)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_UAV_LUMA_HISTORY' with 'defined (FSR2_BIND_UAV_LUMA_HISTORY)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_UAV_PREPARED_INPUT_COLOR' with 'defined (FSR2_BIND_UAV_PREPARED_INPUT_COLOR)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_UAV_REACTIVE_MASK_MAX' with 'defined (FSR2_BIND_UAV_REACTIVE_MASK_MAX)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_UAV_RECONSTRUCTED_PREV_NEAREST_DEPTH' with 'defined (FSR2_BIND_UAV_RECONSTRUCTED_PREV_NEAREST_DEPTH)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_UAV_SPD_GLOBAL_ATOMIC' with 'defined (FSR2_BIND_UAV_SPD_GLOBAL_ATOMIC)' |
|||
// Upgrade NOTE: replaced 'defined FSR2_BIND_UAV_UPSCALED_OUTPUT' with 'defined (FSR2_BIND_UAV_UPSCALED_OUTPUT)' |
|||
|
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
#include "ffx_fsr2_resources.h" |
|||
|
|||
#if defined(FFX_GPU) |
|||
#ifdef __hlsl_dx_compiler |
|||
#pragma dxc diagnostic push |
|||
#pragma dxc diagnostic ignored "-Wambig-lit-shift" |
|||
#endif //__hlsl_dx_compiler |
|||
#include "ffx_core.h" |
|||
#ifdef __hlsl_dx_compiler |
|||
#pragma dxc diagnostic pop |
|||
#endif //__hlsl_dx_compiler |
|||
#endif // #if defined(FFX_GPU) |
|||
|
|||
#if defined(FFX_GPU) |
|||
#ifndef FFX_FSR2_PREFER_WAVE64 |
|||
#define FFX_FSR2_PREFER_WAVE64 |
|||
#endif // #if defined(FFX_GPU) |
|||
|
|||
#if defined(FFX_GPU) |
|||
#pragma warning(disable: 3205) // conversion from larger type to smaller |
|||
#endif // #if defined(FFX_GPU) |
|||
|
|||
#define DECLARE_SRV_REGISTER(regIndex) t##regIndex |
|||
#define DECLARE_UAV_REGISTER(regIndex) u##regIndex |
|||
#define DECLARE_CB_REGISTER(regIndex) b##regIndex |
|||
#define FFX_FSR2_DECLARE_SRV(regIndex) register(DECLARE_SRV_REGISTER(regIndex)) |
|||
#define FFX_FSR2_DECLARE_UAV(regIndex) register(DECLARE_UAV_REGISTER(regIndex)) |
|||
#define FFX_FSR2_DECLARE_CB(regIndex) register(DECLARE_CB_REGISTER(regIndex)) |
|||
|
|||
#if defined(FSR2_BIND_CB_FSR2) |
|||
cbuffer cbFSR2 : FFX_FSR2_DECLARE_CB(FSR2_BIND_CB_FSR2) |
|||
{ |
|||
|
|||
FfxInt32x2 iRenderSize; |
|||
FfxInt32x2 iDisplaySize; |
|||
FfxUInt32x2 uLumaMipDimensions; |
|||
FfxUInt32 uLumaMipLevelToUse; |
|||
FfxUInt32 uFrameIndex; |
|||
FfxFloat32x2 fDisplaySizeRcp; |
|||
FfxFloat32x2 fJitter; |
|||
FfxFloat32x4 fDeviceToViewDepth; |
|||
FfxFloat32x2 depthclip_uv_scale; |
|||
FfxFloat32x2 postprocessed_lockstatus_uv_scale; |
|||
FfxFloat32x2 reactive_mask_dim_rcp; |
|||
FfxFloat32x2 MotionVectorScale; |
|||
FfxFloat32x2 fDownscaleFactor; |
|||
FfxFloat32 fPreExposure; |
|||
FfxFloat32 fTanHalfFOV; |
|||
FfxFloat32x2 fMotionVectorJitterCancellation; |
|||
FfxFloat32 fJitterSequenceLength; |
|||
FfxFloat32 fLockInitialLifetime; |
|||
FfxFloat32 fLockTickDelta; |
|||
FfxFloat32 fDeltaTime; |
|||
FfxFloat32 fDynamicResChangeFactor; |
|||
FfxFloat32 fLumaMipRcp; |
|||
#define FFX_FSR2_CONSTANT_BUFFER_1_SIZE 36 // Number of 32-bit values. This must be kept in sync with the cbFSR2 size. |
|||
}; |
|||
#else |
|||
#define iRenderSize 0 |
|||
#define iDisplaySize 0 |
|||
#define uLumaMipDimensions 0 |
|||
#define uLumaMipLevelToUse 0 |
|||
#define uFrameIndex 0 |
|||
#define fDisplaySizeRcp 0 |
|||
#define fJitter 0 |
|||
#define fDeviceToViewDepth FfxFloat32x4(0,0,0,0) |
|||
#define depthclip_uv_scale 0 |
|||
#define postprocessed_lockstatus_uv_scale 0 |
|||
#define reactive_mask_dim_rcp 0 |
|||
#define MotionVectorScale 0 |
|||
#define fDownscaleFactor 0 |
|||
#define fPreExposure 0 |
|||
#define fTanHalfFOV 0 |
|||
#define fMotionVectorJitterCancellation 0 |
|||
#define fJitterSequenceLength 0 |
|||
#define fLockInitialLifetime 0 |
|||
#define fLockTickDelta 0 |
|||
#define fDeltaTime 0 |
|||
#define fDynamicResChangeFactor 0 |
|||
#define fLumaMipRcp 0 |
|||
#endif |
|||
|
|||
#if defined(FFX_GPU) |
|||
#define FFX_FSR2_ROOTSIG_STRINGIFY(p) FFX_FSR2_ROOTSIG_STR(p) |
|||
#define FFX_FSR2_ROOTSIG_STR(p) #p |
|||
#define FFX_FSR2_ROOTSIG [RootSignature( "DescriptorTable(UAV(u0, numDescriptors = " FFX_FSR2_ROOTSIG_STRINGIFY(FFX_FSR2_RESOURCE_IDENTIFIER_COUNT) ")), " \ |
|||
"DescriptorTable(SRV(t0, numDescriptors = " FFX_FSR2_ROOTSIG_STRINGIFY(FFX_FSR2_RESOURCE_IDENTIFIER_COUNT) ")), " \ |
|||
"RootConstants(num32BitConstants=" FFX_FSR2_ROOTSIG_STRINGIFY(FFX_FSR2_CONSTANT_BUFFER_1_SIZE) ", b0), " \ |
|||
"StaticSampler(s0, filter = FILTER_MIN_MAG_MIP_POINT, " \ |
|||
"addressU = TEXTURE_ADDRESS_CLAMP, " \ |
|||
"addressV = TEXTURE_ADDRESS_CLAMP, " \ |
|||
"addressW = TEXTURE_ADDRESS_CLAMP, " \ |
|||
"comparisonFunc = COMPARISON_NEVER, " \ |
|||
"borderColor = STATIC_BORDER_COLOR_TRANSPARENT_BLACK), " \ |
|||
"StaticSampler(s1, filter = FILTER_MIN_MAG_MIP_LINEAR, " \ |
|||
"addressU = TEXTURE_ADDRESS_CLAMP, " \ |
|||
"addressV = TEXTURE_ADDRESS_CLAMP, " \ |
|||
"addressW = TEXTURE_ADDRESS_CLAMP, " \ |
|||
"comparisonFunc = COMPARISON_NEVER, " \ |
|||
"borderColor = STATIC_BORDER_COLOR_TRANSPARENT_BLACK)" )] |
|||
|
|||
#define FFX_FSR2_CONSTANT_BUFFER_2_SIZE 6 // Number of 32-bit values. This must be kept in sync with max( cbRCAS , cbSPD) size. |
|||
|
|||
#define FFX_FSR2_CB2_ROOTSIG [RootSignature( "DescriptorTable(UAV(u0, numDescriptors = " FFX_FSR2_ROOTSIG_STRINGIFY(FFX_FSR2_RESOURCE_IDENTIFIER_COUNT) ")), " \ |
|||
"DescriptorTable(SRV(t0, numDescriptors = " FFX_FSR2_ROOTSIG_STRINGIFY(FFX_FSR2_RESOURCE_IDENTIFIER_COUNT) ")), " \ |
|||
"RootConstants(num32BitConstants=" FFX_FSR2_ROOTSIG_STRINGIFY(FFX_FSR2_CONSTANT_BUFFER_1_SIZE) ", b0), " \ |
|||
"RootConstants(num32BitConstants=" FFX_FSR2_ROOTSIG_STRINGIFY(FFX_FSR2_CONSTANT_BUFFER_2_SIZE) ", b1), " \ |
|||
"StaticSampler(s0, filter = FILTER_MIN_MAG_MIP_POINT, " \ |
|||
"addressU = TEXTURE_ADDRESS_CLAMP, " \ |
|||
"addressV = TEXTURE_ADDRESS_CLAMP, " \ |
|||
"addressW = TEXTURE_ADDRESS_CLAMP, " \ |
|||
"comparisonFunc = COMPARISON_NEVER, " \ |
|||
"borderColor = STATIC_BORDER_COLOR_TRANSPARENT_BLACK), " \ |
|||
"StaticSampler(s1, filter = FILTER_MIN_MAG_MIP_LINEAR, " \ |
|||
"addressU = TEXTURE_ADDRESS_CLAMP, " \ |
|||
"addressV = TEXTURE_ADDRESS_CLAMP, " \ |
|||
"addressW = TEXTURE_ADDRESS_CLAMP, " \ |
|||
"comparisonFunc = COMPARISON_NEVER, " \ |
|||
"borderColor = STATIC_BORDER_COLOR_TRANSPARENT_BLACK)" )] |
|||
#if defined(FFX_FSR2_EMBED_ROOTSIG) |
|||
#define FFX_FSR2_EMBED_ROOTSIG_CONTENT FFX_FSR2_ROOTSIG |
|||
#define FFX_FSR2_EMBED_CB2_ROOTSIG_CONTENT FFX_FSR2_CB2_ROOTSIG |
|||
#else |
|||
#define FFX_FSR2_EMBED_ROOTSIG_CONTENT |
|||
#define FFX_FSR2_EMBED_CB2_ROOTSIG_CONTENT |
|||
#endif // #if FFX_FSR2_EMBED_ROOTSIG |
|||
#endif // #if defined(FFX_GPU) |
|||
|
|||
|
|||
FfxFloat32 LumaMipRcp() |
|||
{ |
|||
return fLumaMipRcp; |
|||
} |
|||
|
|||
uint2 LumaMipDimensions() |
|||
{ |
|||
return uLumaMipDimensions; |
|||
} |
|||
|
|||
FfxUInt32 LumaMipLevelToUse() |
|||
{ |
|||
return uLumaMipLevelToUse; |
|||
} |
|||
|
|||
FfxFloat32x2 DownscaleFactor() |
|||
{ |
|||
return fDownscaleFactor; |
|||
} |
|||
|
|||
FfxFloat32x2 Jitter() |
|||
{ |
|||
return fJitter; |
|||
} |
|||
|
|||
FfxFloat32x2 MotionVectorJitterCancellation() |
|||
{ |
|||
return fMotionVectorJitterCancellation; |
|||
} |
|||
|
|||
int2 RenderSize() |
|||
{ |
|||
return iRenderSize; |
|||
} |
|||
|
|||
int2 DisplaySize() |
|||
{ |
|||
return iDisplaySize; |
|||
} |
|||
|
|||
FfxFloat32x2 DisplaySizeRcp() |
|||
{ |
|||
return fDisplaySizeRcp; |
|||
} |
|||
|
|||
FfxFloat32 JitterSequenceLength() |
|||
{ |
|||
return fJitterSequenceLength; |
|||
} |
|||
|
|||
FfxFloat32 LockInitialLifetime() |
|||
{ |
|||
return fLockInitialLifetime; |
|||
} |
|||
|
|||
FfxFloat32 LockTickDelta() |
|||
{ |
|||
return fLockTickDelta; |
|||
} |
|||
|
|||
FfxFloat32 DeltaTime() |
|||
{ |
|||
return fDeltaTime; |
|||
} |
|||
|
|||
FfxFloat32 MaxAccumulationWeight() |
|||
{ |
|||
const FfxFloat32 averageLanczosWeightPerFrame = 0.74f; // Average lanczos weight for jitter accumulated samples |
|||
|
|||
return 12; //32.0f * averageLanczosWeightPerFrame; |
|||
} |
|||
|
|||
FfxFloat32 DynamicResChangeFactor() |
|||
{ |
|||
return fDynamicResChangeFactor; |
|||
} |
|||
|
|||
FfxUInt32 FrameIndex() |
|||
{ |
|||
return uFrameIndex; |
|||
} |
|||
|
|||
SamplerState s_PointClamp : register(s0); |
|||
SamplerState s_LinearClamp : register(s1); |
|||
|
|||
|
|||
typedef FFX_MIN16_F4 PREPARED_INPUT_COLOR_T; |
|||
typedef FFX_MIN16_F3 PREPARED_INPUT_COLOR_F3; |
|||
typedef FFX_MIN16_F PREPARED_INPUT_COLOR_F1; |
|||
|
|||
typedef FfxFloat32x3 UPSAMPLED_COLOR_T; |
|||
|
|||
#define RW_UPSAMPLED_WEIGHT_T FfxFloat32 |
|||
|
|||
typedef FFX_MIN16_F3 LOCK_STATUS_T; |
|||
typedef FFX_MIN16_F LOCK_STATUS_F1; |
|||
|
|||
// SRVs |
|||
#if defined(FFX_INTERNAL) |
|||
Texture2D<FfxFloat32x4> r_input_color_jittered : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_INPUT_COLOR); |
|||
Texture2D<FfxFloat32x4> r_motion_vectors : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_INPUT_MOTION_VECTORS); |
|||
Texture2D<FfxFloat32> r_depth : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_INPUT_DEPTH); |
|||
Texture2D<FfxFloat32x2> r_exposure : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_INPUT_EXPOSURE); |
|||
Texture2D<FFX_MIN16_F> r_reactive_mask : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_INPUT_REACTIVE_MASK); |
|||
Texture2D<FFX_MIN16_F> r_transparency_and_composition_mask : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_INPUT_TRANSPARENCY_AND_COMPOSITION_MASK); |
|||
Texture2D<FfxUInt32> r_ReconstructedPrevNearestDepth : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_RECONSTRUCTED_PREVIOUS_NEAREST_DEPTH); |
|||
Texture2D<FfxFloat32x2> r_dilated_motion_vectors : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_DILATED_MOTION_VECTORS); |
|||
Texture2D<FfxFloat32> r_dilatedDepth : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_DILATED_DEPTH); |
|||
Texture2D<FFX_MIN16_F4> r_internal_upscaled_color : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_INTERNAL_UPSCALED_COLOR); |
|||
Texture2D<LOCK_STATUS_T> r_lock_status : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_LOCK_STATUS); |
|||
Texture2D<FfxFloat32> r_depth_clip : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_DEPTH_CLIP); |
|||
Texture2D<PREPARED_INPUT_COLOR_T> r_prepared_input_color : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_PREPARED_INPUT_COLOR); |
|||
Texture2D<unorm FfxFloat32x4> r_luma_history : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_LUMA_HISTORY); |
|||
Texture2D<FfxFloat32x4> r_rcas_input : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_RCAS_INPUT); |
|||
Texture2D<FFX_MIN16_F> r_lanczos_lut : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_LANCZOS_LUT); |
|||
Texture2D<FFX_MIN16_F> r_imgMips : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE); |
|||
Texture2D<FfxFloat32> r_upsample_maximum_bias_lut : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTITIER_UPSAMPLE_MAXIMUM_BIAS_LUT); |
|||
Texture2D<FfxFloat32> r_reactive_max : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_REACTIVE_MAX); |
|||
|
|||
// declarations not current form, no accessor functions |
|||
Texture2D<FfxFloat32x4> r_transparency_mask : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_TRANSPARENCY_MASK); |
|||
Texture2D<FfxFloat32x4> r_bias_current_color_mask : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_BIAS_CURRENT_COLOR_MASK); |
|||
Texture2D<FfxFloat32x4> r_gbuffer_albedo : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_GBUFFER_ALBEDO); |
|||
Texture2D<FfxFloat32x4> r_gbuffer_roughness : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_GBUFFER_ROUGHNESS); |
|||
Texture2D<FfxFloat32x4> r_gbuffer_metallic : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_GBUFFER_METALLIC); |
|||
Texture2D<FfxFloat32x4> r_gbuffer_specular : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_GBUFFER_SPECULAR); |
|||
Texture2D<FfxFloat32x4> r_gbuffer_subsurface : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_GBUFFER_SUBSURFACE); |
|||
Texture2D<FfxFloat32x4> r_gbuffer_normals : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_GBUFFER_NORMALS); |
|||
Texture2D<FfxFloat32x4> r_gbuffer_shading_mode_id : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_GBUFFER_SHADING_MODE_ID); |
|||
Texture2D<FfxFloat32x4> r_gbuffer_material_id : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_GBUFFER_MATERIAL_ID); |
|||
Texture2D<FfxFloat32x4> r_motion_vectors_3d : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_VELOCITY_3D); |
|||
Texture2D<FfxFloat32x4> r_is_particle_mask : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_IS_PARTICLE_MASK); |
|||
Texture2D<FfxFloat32x4> r_animated_texture_mask : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_ANIMATED_TEXTURE_MASK); |
|||
Texture2D<FfxFloat32> r_depth_high_res : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_DEPTH_HIGH_RES); |
|||
Texture2D<FfxFloat32x4> r_position_view_space : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_POSITION_VIEW_SPACE); |
|||
Texture2D<FfxFloat32x4> r_ray_tracing_hit_distance : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_RAY_TRACING_HIT_DISTANCE); |
|||
Texture2D<FfxFloat32x4> r_motion_vectors_reflection : FFX_FSR2_DECLARE_SRV(FFX_FSR2_RESOURCE_IDENTIFIER_VELOCITY_REFLECTION); |
|||
|
|||
// UAV declarations |
|||
RWTexture2D<FfxUInt32> rw_ReconstructedPrevNearestDepth : FFX_FSR2_DECLARE_UAV(FFX_FSR2_RESOURCE_IDENTIFIER_RECONSTRUCTED_PREVIOUS_NEAREST_DEPTH); |
|||
RWTexture2D<FfxFloat32x2> rw_dilated_motion_vectors : FFX_FSR2_DECLARE_UAV(FFX_FSR2_RESOURCE_IDENTIFIER_DILATED_MOTION_VECTORS); |
|||
RWTexture2D<FfxFloat32> rw_dilatedDepth : FFX_FSR2_DECLARE_UAV(FFX_FSR2_RESOURCE_IDENTIFIER_DILATED_DEPTH); |
|||
RWTexture2D<FfxFloat32x4> rw_internal_upscaled_color : FFX_FSR2_DECLARE_UAV(FFX_FSR2_RESOURCE_IDENTIFIER_INTERNAL_UPSCALED_COLOR); |
|||
RWTexture2D<LOCK_STATUS_T> rw_lock_status : FFX_FSR2_DECLARE_UAV(FFX_FSR2_RESOURCE_IDENTIFIER_LOCK_STATUS); |
|||
RWTexture2D<FfxFloat32> rw_depth_clip : FFX_FSR2_DECLARE_UAV(FFX_FSR2_RESOURCE_IDENTIFIER_DEPTH_CLIP); |
|||
RWTexture2D<PREPARED_INPUT_COLOR_T> rw_prepared_input_color : FFX_FSR2_DECLARE_UAV(FFX_FSR2_RESOURCE_IDENTIFIER_PREPARED_INPUT_COLOR); |
|||
RWTexture2D<unorm FfxFloat32x4> rw_luma_history : FFX_FSR2_DECLARE_UAV(FFX_FSR2_RESOURCE_IDENTIFIER_LUMA_HISTORY); |
|||
RWTexture2D<FfxFloat32x4> rw_upscaled_output : FFX_FSR2_DECLARE_UAV(FFX_FSR2_RESOURCE_IDENTIFIER_UPSCALED_OUTPUT); |
|||
//globallycoherent RWTexture2D<FfxFloat32> rw_imgMipmap[13] : FFX_FSR2_DECLARE_UAV(FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE); |
|||
globallycoherent RWTexture2D<FfxFloat32> rw_img_mip_shading_change : FFX_FSR2_DECLARE_UAV(FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_SHADING_CHANGE); |
|||
globallycoherent RWTexture2D<FfxFloat32> rw_img_mip_5 : FFX_FSR2_DECLARE_UAV(FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_5); |
|||
RWTexture2D<unorm FfxFloat32> rw_reactive_max : FFX_FSR2_DECLARE_UAV(FFX_FSR2_RESOURCE_IDENTIFIER_REACTIVE_MAX); |
|||
RWTexture2D<FfxFloat32x2> rw_exposure : FFX_FSR2_DECLARE_UAV(FFX_FSR2_RESOURCE_IDENTIFIER_EXPOSURE); |
|||
globallycoherent RWTexture2D<FfxUInt32> rw_spd_global_atomic : FFX_FSR2_DECLARE_UAV(FFX_FSR2_RESOURCE_IDENTIFIER_SPD_ATOMIC_COUNT); |
|||
RWTexture2D<FfxFloat32x4> rw_debug_out : FFX_FSR2_DECLARE_UAV(FFX_FSR2_RESOURCE_IDENTIFIER_DEBUG_OUTPUT); |
|||
|
|||
#else // #if defined(FFX_INTERNAL) |
|||
#if defined (FSR2_BIND_SRV_INPUT_COLOR) |
|||
Texture2D<FfxFloat32x4> r_input_color_jittered : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_INPUT_COLOR); |
|||
#endif |
|||
#if defined (FSR2_BIND_SRV_MOTION_VECTORS) |
|||
Texture2D<FfxFloat32x4> r_motion_vectors : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_MOTION_VECTORS); |
|||
#endif |
|||
#if defined (FSR2_BIND_SRV_DEPTH) |
|||
Texture2D<FfxFloat32> r_depth : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_DEPTH); |
|||
#endif |
|||
#if defined (FSR2_BIND_SRV_EXPOSURE) |
|||
Texture2D<FfxFloat32x2> r_exposure : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_EXPOSURE); |
|||
#endif |
|||
#if defined (FSR2_BIND_SRV_REACTIVE_MASK) |
|||
Texture2D<FFX_MIN16_F> r_reactive_mask : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_REACTIVE_MASK); |
|||
#endif |
|||
#if defined (FSR2_BIND_SRV_TRANSPARENCY_AND_COMPOSITION_MASK) |
|||
Texture2D<FFX_MIN16_F> r_transparency_and_composition_mask : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_TRANSPARENCY_AND_COMPOSITION_MASK); |
|||
#endif |
|||
#if defined (FSR2_BIND_SRV_RECONSTRUCTED_PREV_NEAREST_DEPTH) |
|||
Texture2D<FfxUInt32> r_ReconstructedPrevNearestDepth : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_RECONSTRUCTED_PREV_NEAREST_DEPTH); |
|||
#endif |
|||
#if defined (FSR2_BIND_SRV_DILATED_MOTION_VECTORS) |
|||
Texture2D<FfxFloat32x2> r_dilated_motion_vectors : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_DILATED_MOTION_VECTORS); |
|||
#endif |
|||
#if defined (FSR2_BIND_SRV_DILATED_DEPTH) |
|||
Texture2D<FfxFloat32> r_dilatedDepth : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_DILATED_DEPTH); |
|||
#endif |
|||
#if defined (FSR2_BIND_SRV_INTERNAL_UPSCALED) |
|||
Texture2D<FFX_MIN16_F4> r_internal_upscaled_color : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_INTERNAL_UPSCALED); |
|||
#endif |
|||
#if defined (FSR2_BIND_SRV_LOCK_STATUS) |
|||
#if FFX_COMPILE_FOR_SPIRV |
|||
Texture2D<FfxFloat32x3> r_lock_status : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_LOCK_STATUS); |
|||
#else |
|||
Texture2D<LOCK_STATUS_T> r_lock_status : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_LOCK_STATUS); |
|||
#endif |
|||
#endif |
|||
#if defined (FSR2_BIND_SRV_DEPTH_CLIP) |
|||
Texture2D<FfxFloat32> r_depth_clip : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_DEPTH_CLIP); |
|||
#endif |
|||
#if defined (FSR2_BIND_SRV_PREPARED_INPUT_COLOR) |
|||
#if FFX_COMPILE_FOR_SPIRV |
|||
Texture2D<FfxFloat32x4> r_prepared_input_color : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_PREPARED_INPUT_COLOR); |
|||
#else |
|||
Texture2D<PREPARED_INPUT_COLOR_T> r_prepared_input_color : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_PREPARED_INPUT_COLOR); |
|||
#endif |
|||
#endif |
|||
#if defined (FSR2_BIND_SRV_LUMA_HISTORY) |
|||
Texture2D<unorm FfxFloat32x4> r_luma_history : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_LUMA_HISTORY); |
|||
#endif |
|||
#if defined (FSR2_BIND_SRV_RCAS_INPUT) |
|||
Texture2D<FfxFloat32x4> r_rcas_input : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_RCAS_INPUT); |
|||
#endif |
|||
#if defined (FSR2_BIND_SRV_LANCZOS_LUT) |
|||
Texture2D<FFX_MIN16_F> r_lanczos_lut : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_LANCZOS_LUT); |
|||
#endif |
|||
#if defined (FSR2_BIND_SRV_EXPOSURE_MIPS) |
|||
Texture2D<FFX_MIN16_F> r_imgMips : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_EXPOSURE_MIPS); |
|||
#endif |
|||
#if defined (FSR2_BIND_SRV_UPSCALE_MAXIMUM_BIAS_LUT) |
|||
Texture2D<FfxFloat32> r_upsample_maximum_bias_lut : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_UPSCALE_MAXIMUM_BIAS_LUT); |
|||
#endif |
|||
#if defined (FSR2_BIND_SRV_REACTIVE_MAX) |
|||
Texture2D<FfxFloat32> r_reactive_max : FFX_FSR2_DECLARE_SRV(FSR2_BIND_SRV_REACTIVE_MAX); |
|||
#endif |
|||
|
|||
// UAV declarations |
|||
#if defined (FSR2_BIND_UAV_RECONSTRUCTED_PREV_NEAREST_DEPTH) |
|||
RWTexture2D<FfxUInt32> rw_ReconstructedPrevNearestDepth : FFX_FSR2_DECLARE_UAV(FSR2_BIND_UAV_RECONSTRUCTED_PREV_NEAREST_DEPTH); |
|||
#endif |
|||
#if defined (FSR2_BIND_UAV_DILATED_MOTION_VECTORS) |
|||
RWTexture2D<FfxFloat32x2> rw_dilated_motion_vectors : FFX_FSR2_DECLARE_UAV(FSR2_BIND_UAV_DILATED_MOTION_VECTORS); |
|||
#endif |
|||
#if defined (FSR2_BIND_UAV_DILATED_DEPTH) |
|||
RWTexture2D<FfxFloat32> rw_dilatedDepth : FFX_FSR2_DECLARE_UAV(FSR2_BIND_UAV_DILATED_DEPTH); |
|||
#endif |
|||
#if defined (FSR2_BIND_UAV_INTERNAL_UPSCALED) |
|||
RWTexture2D<FfxFloat32x4> rw_internal_upscaled_color : FFX_FSR2_DECLARE_UAV(FSR2_BIND_UAV_INTERNAL_UPSCALED); |
|||
#endif |
|||
#if defined (FSR2_BIND_UAV_LOCK_STATUS) |
|||
#if FFX_COMPILE_FOR_SPIRV |
|||
RWTexture2D<FfxFloat32x3> rw_lock_status : FFX_FSR2_DECLARE_UAV(FSR2_BIND_UAV_LOCK_STATUS); |
|||
#else |
|||
RWTexture2D<LOCK_STATUS_T> rw_lock_status : FFX_FSR2_DECLARE_UAV(FSR2_BIND_UAV_LOCK_STATUS); |
|||
#endif |
|||
#endif |
|||
#if defined (FSR2_BIND_UAV_DEPTH_CLIP) |
|||
RWTexture2D<FfxFloat32> rw_depth_clip : FFX_FSR2_DECLARE_UAV(FSR2_BIND_UAV_DEPTH_CLIP); |
|||
#endif |
|||
#if defined (FSR2_BIND_UAV_PREPARED_INPUT_COLOR) |
|||
#if FFX_COMPILE_FOR_SPIRV |
|||
RWTexture2D<FfxFloat32x4> rw_prepared_input_color : FFX_FSR2_DECLARE_UAV(FSR2_BIND_UAV_PREPARED_INPUT_COLOR); |
|||
#else |
|||
RWTexture2D<PREPARED_INPUT_COLOR_T> rw_prepared_input_color : FFX_FSR2_DECLARE_UAV(FSR2_BIND_UAV_PREPARED_INPUT_COLOR); |
|||
#endif |
|||
#endif |
|||
#if defined (FSR2_BIND_UAV_LUMA_HISTORY) |
|||
RWTexture2D<unorm FfxFloat32x4> rw_luma_history : FFX_FSR2_DECLARE_UAV(FSR2_BIND_UAV_LUMA_HISTORY); |
|||
#endif |
|||
#if defined (FSR2_BIND_UAV_UPSCALED_OUTPUT) |
|||
RWTexture2D<FfxFloat32x4> rw_upscaled_output : FFX_FSR2_DECLARE_UAV(FSR2_BIND_UAV_UPSCALED_OUTPUT); |
|||
#endif |
|||
#if defined (FSR2_BIND_UAV_EXPOSURE_MIP_LUMA_CHANGE) |
|||
globallycoherent RWTexture2D<FfxFloat32> rw_img_mip_shading_change : FFX_FSR2_DECLARE_UAV(FSR2_BIND_UAV_EXPOSURE_MIP_LUMA_CHANGE); |
|||
#endif |
|||
#if defined (FSR2_BIND_UAV_EXPOSURE_MIP_5) |
|||
globallycoherent RWTexture2D<FfxFloat32> rw_img_mip_5 : FFX_FSR2_DECLARE_UAV(FSR2_BIND_UAV_EXPOSURE_MIP_5); |
|||
#endif |
|||
#if defined (FSR2_BIND_UAV_REACTIVE_MASK_MAX) |
|||
RWTexture2D<unorm FfxFloat32> rw_reactive_max : FFX_FSR2_DECLARE_UAV(FSR2_BIND_UAV_REACTIVE_MASK_MAX); |
|||
#endif |
|||
#if defined (FSR2_BIND_UAV_EXPOSURE) |
|||
RWTexture2D<FfxFloat32x2> rw_exposure : FFX_FSR2_DECLARE_UAV(FSR2_BIND_UAV_EXPOSURE); |
|||
#endif |
|||
#if defined (FSR2_BIND_UAV_SPD_GLOBAL_ATOMIC) |
|||
globallycoherent RWTexture2D<FfxUInt32> rw_spd_global_atomic : FFX_FSR2_DECLARE_UAV(FSR2_BIND_UAV_SPD_GLOBAL_ATOMIC); |
|||
#endif |
|||
#endif // #if defined(FFX_INTERNAL) |
|||
|
|||
FfxFloat32 LoadMipLuma(FFX_MIN16_I2 iPxPos, FfxUInt32 mipLevel) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_EXPOSURE_MIPS) || defined(FFX_INTERNAL) |
|||
return r_imgMips.mips[mipLevel][iPxPos]; |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
#if FFX_HALF |
|||
FfxFloat16 LoadMipLuma(FfxInt16x2 iPxPos, FfxUInt16 mipLevel) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_EXPOSURE_MIPS) || defined(FFX_INTERNAL) |
|||
return r_imgMips.mips[mipLevel][iPxPos]; |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
#endif |
|||
FfxFloat32 SampleMipLuma(FfxFloat32x2 fUV, FfxUInt32 mipLevel) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_EXPOSURE_MIPS) || defined(FFX_INTERNAL) |
|||
fUV *= depthclip_uv_scale; |
|||
return r_imgMips.SampleLevel(s_LinearClamp, fUV, mipLevel); |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
|
|||
} |
|||
#if FFX_HALF |
|||
FfxFloat16 SampleMipLuma(FfxFloat16x2 fUV, FfxUInt32 mipLevel) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_EXPOSURE_MIPS) || defined(FFX_INTERNAL) |
|||
fUV *= FfxFloat16x2(depthclip_uv_scale); |
|||
return r_imgMips.SampleLevel(s_LinearClamp, fUV, mipLevel); |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
#endif |
|||
|
|||
// |
|||
// a 0 0 0 x |
|||
// 0 b 0 0 y |
|||
// 0 0 c d z |
|||
// 0 0 e 0 1 |
|||
// |
|||
// z' = (z*c+d)/(z*e) |
|||
// z' = (c/e) + d/(z*e) |
|||
// z' - (c/e) = d/(z*e) |
|||
// (z'e - c)/e = d/(z*e) |
|||
// e / (z'e - c) = (z*e)/d |
|||
// (e * d) / (z'e - c) = z*e |
|||
// z = d / (z'e - c) |
|||
FfxFloat32 ConvertFromDeviceDepthToViewSpace(FfxFloat32 fDeviceDepth) |
|||
{ |
|||
return -fDeviceToViewDepth[2] / (fDeviceDepth * fDeviceToViewDepth[1] - fDeviceToViewDepth[0]); |
|||
} |
|||
|
|||
FfxFloat32 LoadInputDepth(FFX_MIN16_I2 iPxPos) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_DEPTH) || defined(FFX_INTERNAL) |
|||
return r_depth[iPxPos]; |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
FFX_MIN16_F LoadReactiveMask(FFX_MIN16_I2 iPxPos) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_REACTIVE_MASK) || defined(FFX_INTERNAL) |
|||
return r_reactive_mask[iPxPos]; |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
FfxFloat32x4 GatherReactiveMask(int2 iPxPos) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_REACTIVE_MASK) || defined(FFX_INTERNAL) |
|||
return r_reactive_mask.GatherRed(s_LinearClamp, FfxFloat32x2(iPxPos) * reactive_mask_dim_rcp); |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
FFX_MIN16_F LoadTransparencyAndCompositionMask(FFX_MIN16_I2 iPxPos) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_TRANSPARENCY_AND_COMPOSITION_MASK) || defined(FFX_INTERNAL) |
|||
return r_transparency_and_composition_mask[iPxPos]; |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
FfxFloat32 PreExposure() |
|||
{ |
|||
return fPreExposure; |
|||
} |
|||
|
|||
FfxFloat32x3 LoadInputColor(FFX_MIN16_I2 iPxPos) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_INPUT_COLOR) || defined(FFX_INTERNAL) |
|||
return r_input_color_jittered[iPxPos].rgb / PreExposure(); |
|||
#else |
|||
return 0; |
|||
#endif |
|||
} |
|||
|
|||
FfxFloat32x3 LoadInputColorWithoutPreExposure(FFX_MIN16_I2 iPxPos) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_INPUT_COLOR) || defined(FFX_INTERNAL) |
|||
return r_input_color_jittered[iPxPos].rgb; |
|||
#else |
|||
return 0; |
|||
#endif |
|||
} |
|||
|
|||
#if FFX_HALF |
|||
FfxFloat16x3 LoadPreparedInputColor(FfxInt16x2 iPxPos) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_PREPARED_INPUT_COLOR) || defined(FFX_INTERNAL) |
|||
return r_prepared_input_color[iPxPos].rgb; |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
#endif |
|||
|
|||
FFX_MIN16_F3 LoadPreparedInputColor(int2 iPxPos) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_PREPARED_INPUT_COLOR) || defined(FFX_INTERNAL) |
|||
return r_prepared_input_color[iPxPos].rgb; |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
FFX_MIN16_F LoadPreparedInputColorLuma(FFX_MIN16_I2 iPxPos) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_PREPARED_INPUT_COLOR) || defined(FFX_INTERNAL) |
|||
return r_prepared_input_color[iPxPos].a; |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
FfxFloat32x2 LoadInputMotionVector(FFX_MIN16_I2 iPxDilatedMotionVectorPos) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_MOTION_VECTORS) || defined(FFX_INTERNAL) |
|||
FfxFloat32x2 fSrcMotionVector = r_motion_vectors[iPxDilatedMotionVectorPos].xy; |
|||
#else |
|||
FfxFloat32x2 fSrcMotionVector = 0.f; |
|||
#endif |
|||
|
|||
FfxFloat32x2 fUvMotionVector = fSrcMotionVector * MotionVectorScale; |
|||
|
|||
#if FFX_FSR2_OPTION_JITTERED_MOTION_VECTORS |
|||
fUvMotionVector -= fMotionVectorJitterCancellation; |
|||
#endif |
|||
|
|||
return fUvMotionVector; |
|||
} |
|||
|
|||
FFX_MIN16_F4 LoadHistory(int2 iPxHistory) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_INTERNAL_UPSCALED) || defined(FFX_INTERNAL) |
|||
return r_internal_upscaled_color[iPxHistory]; |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
FfxFloat32x4 LoadRwInternalUpscaledColorAndWeight(FFX_MIN16_I2 iPxPos) |
|||
{ |
|||
#if defined(FSR2_BIND_UAV_INTERNAL_UPSCALED) || defined(FFX_INTERNAL) |
|||
return rw_internal_upscaled_color[iPxPos]; |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
void StoreLumaHistory(FFX_MIN16_I2 iPxPos, FfxFloat32x4 fLumaHistory) |
|||
{ |
|||
#if defined(FSR2_BIND_UAV_LUMA_HISTORY) || defined(FFX_INTERNAL) |
|||
rw_luma_history[iPxPos] = fLumaHistory; |
|||
#endif |
|||
} |
|||
|
|||
FfxFloat32x4 LoadRwLumaHistory(FFX_MIN16_I2 iPxPos) |
|||
{ |
|||
#if defined(FSR2_BIND_UAV_LUMA_HISTORY) || defined(FFX_INTERNAL) |
|||
return rw_luma_history[iPxPos]; |
|||
#else |
|||
return 1.f; |
|||
#endif |
|||
} |
|||
|
|||
FfxFloat32 LoadLumaStabilityFactor(FFX_MIN16_I2 iPxPos) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_LUMA_HISTORY) || defined(FFX_INTERNAL) |
|||
return r_luma_history[iPxPos].w; |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
FfxFloat32 SampleLumaStabilityFactor(FfxFloat32x2 fUV) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_LUMA_HISTORY) || defined(FFX_INTERNAL) |
|||
fUV *= depthclip_uv_scale; |
|||
return r_luma_history.SampleLevel(s_LinearClamp, fUV, 0).w; |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
void StoreReprojectedHistory(FFX_MIN16_I2 iPxHistory, FFX_MIN16_F4 fHistory) |
|||
{ |
|||
#if defined(FSR2_BIND_UAV_INTERNAL_UPSCALED) || defined(FFX_INTERNAL) |
|||
rw_internal_upscaled_color[iPxHistory] = fHistory; |
|||
#endif |
|||
} |
|||
|
|||
void StoreInternalColorAndWeight(FFX_MIN16_I2 iPxPos, FfxFloat32x4 fColorAndWeight) |
|||
{ |
|||
#if defined(FSR2_BIND_UAV_INTERNAL_UPSCALED) || defined(FFX_INTERNAL) |
|||
rw_internal_upscaled_color[iPxPos] = fColorAndWeight; |
|||
#endif |
|||
} |
|||
|
|||
void StoreUpscaledOutput(FFX_MIN16_I2 iPxPos, FfxFloat32x3 fColor) |
|||
{ |
|||
#if defined(FSR2_BIND_UAV_UPSCALED_OUTPUT) || defined(FFX_INTERNAL) |
|||
rw_upscaled_output[iPxPos] = FfxFloat32x4(fColor * PreExposure(), 1.f); |
|||
#endif |
|||
} |
|||
|
|||
//LOCK_LIFETIME_REMAINING == 0 |
|||
//Should make LockInitialLifetime() return a const 1.0f later |
|||
LOCK_STATUS_T LoadLockStatus(FFX_MIN16_I2 iPxPos) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_LOCK_STATUS) || defined(FFX_INTERNAL) |
|||
LOCK_STATUS_T fLockStatus = r_lock_status[iPxPos]; |
|||
|
|||
fLockStatus[0] -= LockInitialLifetime() * 2.0f; |
|||
return fLockStatus; |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
|
|||
|
|||
} |
|||
|
|||
LOCK_STATUS_T LoadRwLockStatus(int2 iPxPos) |
|||
{ |
|||
#if defined(FSR2_BIND_UAV_LOCK_STATUS) || defined(FFX_INTERNAL) |
|||
LOCK_STATUS_T fLockStatus = rw_lock_status[iPxPos]; |
|||
|
|||
fLockStatus[0] -= LockInitialLifetime() * 2.0f; |
|||
|
|||
return fLockStatus; |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
void StoreLockStatus(FFX_MIN16_I2 iPxPos, LOCK_STATUS_T fLockstatus) |
|||
{ |
|||
#if defined(FSR2_BIND_UAV_LOCK_STATUS) || defined(FFX_INTERNAL) |
|||
fLockstatus[0] += LockInitialLifetime() * 2.0f; |
|||
|
|||
rw_lock_status[iPxPos] = fLockstatus; |
|||
#endif |
|||
} |
|||
|
|||
void StorePreparedInputColor(FFX_PARAMETER_IN FFX_MIN16_I2 iPxPos, FFX_PARAMETER_IN PREPARED_INPUT_COLOR_T fTonemapped) |
|||
{ |
|||
#if defined(FSR2_BIND_UAV_PREPARED_INPUT_COLOR) || defined(FFX_INTERNAL) |
|||
rw_prepared_input_color[iPxPos] = fTonemapped; |
|||
#endif |
|||
} |
|||
|
|||
FfxBoolean IsResponsivePixel(FFX_MIN16_I2 iPxPos) |
|||
{ |
|||
return FFX_FALSE; //not supported in prototype |
|||
} |
|||
|
|||
FfxFloat32 LoadDepthClip(FFX_MIN16_I2 iPxPos) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_DEPTH_CLIP) || defined(FFX_INTERNAL) |
|||
return r_depth_clip[iPxPos]; |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
FfxFloat32 SampleDepthClip(FfxFloat32x2 fUV) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_DEPTH_CLIP) || defined(FFX_INTERNAL) |
|||
fUV *= depthclip_uv_scale; |
|||
return r_depth_clip.SampleLevel(s_LinearClamp, fUV, 0); |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
LOCK_STATUS_T SampleLockStatus(FfxFloat32x2 fUV) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_LOCK_STATUS) || defined(FFX_INTERNAL) |
|||
fUV *= postprocessed_lockstatus_uv_scale; |
|||
LOCK_STATUS_T fLockStatus = r_lock_status.SampleLevel(s_LinearClamp, fUV, 0); |
|||
fLockStatus[0] -= LockInitialLifetime() * 2.0f; |
|||
return fLockStatus; |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
void StoreDepthClip(FFX_MIN16_I2 iPxPos, FfxFloat32 fClip) |
|||
{ |
|||
#if defined(FSR2_BIND_UAV_DEPTH_CLIP) || defined(FFX_INTERNAL) |
|||
rw_depth_clip[iPxPos] = fClip; |
|||
#endif |
|||
} |
|||
|
|||
FfxFloat32 TanHalfFoV() |
|||
{ |
|||
return fTanHalfFOV; |
|||
} |
|||
|
|||
FfxFloat32 LoadSceneDepth(FFX_MIN16_I2 iPxInput) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_DEPTH) || defined(FFX_INTERNAL) |
|||
return r_depth[iPxInput]; |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
FfxFloat32 LoadReconstructedPrevDepth(FFX_MIN16_I2 iPxPos) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_RECONSTRUCTED_PREV_NEAREST_DEPTH) || defined(FFX_INTERNAL) |
|||
return asfloat(r_ReconstructedPrevNearestDepth[iPxPos]); |
|||
#else |
|||
return 0; |
|||
#endif |
|||
} |
|||
|
|||
void StoreReconstructedDepth(FFX_MIN16_I2 iPxSample, FfxFloat32 fDepth) |
|||
{ |
|||
FfxUInt32 uDepth = asuint(fDepth); |
|||
#if defined(FSR2_BIND_UAV_RECONSTRUCTED_PREV_NEAREST_DEPTH) || defined(FFX_INTERNAL) |
|||
#if FFX_FSR2_OPTION_INVERTED_DEPTH |
|||
InterlockedMax(rw_ReconstructedPrevNearestDepth[iPxSample], uDepth); |
|||
#else |
|||
InterlockedMin(rw_ReconstructedPrevNearestDepth[iPxSample], uDepth); // min for standard, max for inverted depth |
|||
#endif |
|||
#endif |
|||
} |
|||
|
|||
void SetReconstructedDepth(FFX_MIN16_I2 iPxSample, const FfxUInt32 uValue) |
|||
{ |
|||
#if defined(FSR2_BIND_UAV_RECONSTRUCTED_PREV_NEAREST_DEPTH) || defined(FFX_INTERNAL) |
|||
rw_ReconstructedPrevNearestDepth[iPxSample] = uValue; |
|||
#endif |
|||
} |
|||
|
|||
void StoreDilatedDepth(FFX_PARAMETER_IN FFX_MIN16_I2 iPxPos, FFX_PARAMETER_IN FfxFloat32 fDepth) |
|||
{ |
|||
#if defined(FSR2_BIND_UAV_DILATED_DEPTH) || defined(FFX_INTERNAL) |
|||
//FfxUInt32 uDepth = f32tof16(fDepth); |
|||
rw_dilatedDepth[iPxPos] = fDepth; |
|||
#endif |
|||
} |
|||
|
|||
void StoreDilatedMotionVector(FFX_PARAMETER_IN FFX_MIN16_I2 iPxPos, FFX_PARAMETER_IN FfxFloat32x2 fMotionVector) |
|||
{ |
|||
#if defined(FSR2_BIND_UAV_DILATED_MOTION_VECTORS) || defined(FFX_INTERNAL) |
|||
rw_dilated_motion_vectors[iPxPos] = fMotionVector; |
|||
#endif |
|||
} |
|||
|
|||
FfxFloat32x2 LoadDilatedMotionVector(FFX_MIN16_I2 iPxInput) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_DILATED_MOTION_VECTORS) || defined(FFX_INTERNAL) |
|||
return r_dilated_motion_vectors[iPxInput].xy; |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
FfxFloat32x2 SampleDilatedMotionVector(FfxFloat32x2 fUV) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_DILATED_MOTION_VECTORS) || defined(FFX_INTERNAL) |
|||
fUV *= depthclip_uv_scale; // TODO: assuming these are (RenderSize() / MaxRenderSize()) |
|||
return r_dilated_motion_vectors.SampleLevel(s_LinearClamp, fUV, 0); |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
FfxFloat32 LoadDilatedDepth(FFX_MIN16_I2 iPxInput) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_DILATED_DEPTH) || defined(FFX_INTERNAL) |
|||
return r_dilatedDepth[iPxInput]; |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
FfxFloat32 Exposure() |
|||
{ |
|||
// return 1.0f; |
|||
#if defined(FSR2_BIND_SRV_EXPOSURE) || defined(FFX_INTERNAL) |
|||
FfxFloat32 exposure = r_exposure[FFX_MIN16_I2(0, 0)].x; |
|||
#else |
|||
FfxFloat32 exposure = 1.f; |
|||
#endif |
|||
|
|||
if (exposure == 0.0f) { |
|||
exposure = 1.0f; |
|||
} |
|||
|
|||
return exposure; |
|||
} |
|||
|
|||
FfxFloat32 SampleLanczos2Weight(FfxFloat32 x) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_LANCZOS_LUT) || defined(FFX_INTERNAL) |
|||
return r_lanczos_lut.SampleLevel(s_LinearClamp, FfxFloat32x2(x / 2, 0.5f), 0); |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
#if FFX_HALF |
|||
FfxFloat16 SampleLanczos2Weight(FfxFloat16 x) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_LANCZOS_LUT) || defined(FFX_INTERNAL) |
|||
return r_lanczos_lut.SampleLevel(s_LinearClamp, FfxFloat16x2(x / 2, 0.5f), 0); |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
#endif |
|||
|
|||
FFX_MIN16_F SampleUpsampleMaximumBias(FFX_MIN16_F2 uv) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_UPSCALE_MAXIMUM_BIAS_LUT) || defined(FFX_INTERNAL) |
|||
// Stored as a SNORM, so make sure to multiply by 2 to retrieve the actual expected range. |
|||
return FFX_MIN16_F(2.0) * r_upsample_maximum_bias_lut.SampleLevel(s_LinearClamp, abs(uv) * 2.0, 0); |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
FFX_MIN16_F LoadReactiveMax(FFX_PARAMETER_IN FFX_MIN16_I2 iPxPos) |
|||
{ |
|||
#if defined(FSR2_BIND_SRV_REACTIVE_MAX) || defined(FFX_INTERNAL) |
|||
return r_reactive_max[iPxPos]; |
|||
#else |
|||
return 0.f; |
|||
#endif |
|||
} |
|||
|
|||
void StoreReactiveMax(FFX_PARAMETER_IN FFX_MIN16_I2 iPxPos, FFX_PARAMETER_IN FFX_MIN16_F fReactiveMax) |
|||
{ |
|||
#if defined(FSR2_BIND_UAV_REACTIVE_MASK_MAX) || defined(FFX_INTERNAL) |
|||
rw_reactive_max[iPxPos] = fReactiveMax; |
|||
#endif |
|||
} |
|||
|
|||
#endif // #if defined(FFX_GPU) |
|||
@ -0,0 +1,7 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 8401ac79c85ddc64caeed4d788f7e852 |
|||
ShaderIncludeImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,356 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
#if !defined(FFX_FSR2_COMMON_H) |
|||
#define FFX_FSR2_COMMON_H |
|||
|
|||
#if defined(FFX_CPU) || defined(FFX_GPU) |
|||
//Locks |
|||
#define LOCK_LIFETIME_REMAINING 0 |
|||
#define LOCK_TEMPORAL_LUMA 1 |
|||
#define LOCK_TRUST 2 |
|||
#endif // #if defined(FFX_CPU) || defined(FFX_GPU) |
|||
|
|||
#if defined(FFX_GPU) |
|||
FFX_STATIC const FfxFloat32 FSR2_EPSILON = 1e-03f; |
|||
FFX_STATIC const FfxFloat32 FSR2_TONEMAP_EPSILON = 1e-03f; |
|||
FFX_STATIC const FfxFloat32 FSR2_FLT_MAX = 3.402823466e+38f; |
|||
FFX_STATIC const FfxFloat32 FSR2_FLT_MIN = 1.175494351e-38f; |
|||
|
|||
// treat vector truncation warnings as errors |
|||
#pragma warning(error: 3206) |
|||
|
|||
// suppress warnings |
|||
#pragma warning(disable: 3205) // conversion from larger type to smaller |
|||
#pragma warning(disable: 3571) // in ffxPow(f, e), f could be negative |
|||
|
|||
// Reconstructed depth usage |
|||
FFX_STATIC const FfxFloat32 reconstructedDepthBilinearWeightThreshold = 0.05f; |
|||
|
|||
// Accumulation |
|||
FFX_STATIC const FfxFloat32 averageLanczosWeightPerFrame = 0.74f; // Average lanczos weight for jitter accumulated samples |
|||
FFX_STATIC const FfxFloat32 accumulationMaxOnMotion = 4.0f; |
|||
|
|||
// Auto exposure |
|||
FFX_STATIC const FfxFloat32 resetAutoExposureAverageSmoothing = 1e8f; |
|||
|
|||
struct LockState |
|||
{ |
|||
FfxBoolean NewLock; //Set for both unique new and re-locked new |
|||
FfxBoolean WasLockedPrevFrame; //Set to identify if the pixel was already locked (relock) |
|||
}; |
|||
|
|||
FFX_MIN16_F GetNormalizedRemainingLockLifetime(FFX_MIN16_F3 fLockStatus) |
|||
{ |
|||
const FfxFloat32 fTrust = fLockStatus[LOCK_TRUST]; |
|||
|
|||
return FFX_MIN16_F(((ffxSaturate(fLockStatus[LOCK_LIFETIME_REMAINING] - LockInitialLifetime()) / LockInitialLifetime())) * fTrust); |
|||
} |
|||
|
|||
LOCK_STATUS_T CreateNewLockSample() |
|||
{ |
|||
LOCK_STATUS_T fLockStatus = LOCK_STATUS_T(0, 0, 0); |
|||
|
|||
fLockStatus[LOCK_TRUST] = LOCK_STATUS_F1(1); |
|||
|
|||
return fLockStatus; |
|||
} |
|||
|
|||
void KillLock(FFX_PARAMETER_INOUT FFX_MIN16_F3 fLockStatus) |
|||
{ |
|||
fLockStatus[LOCK_LIFETIME_REMAINING] = FFX_MIN16_F(0); |
|||
} |
|||
|
|||
#define SPLIT_LEFT 0 |
|||
#define SPLIT_RIGHT 1 |
|||
#ifndef SPLIT_SHADER |
|||
#define SPLIT_SHADER SPLIT_RIGHT |
|||
#endif |
|||
|
|||
#if FFX_HALF |
|||
|
|||
#define UPSAMPLE_F FfxFloat16 |
|||
#define UPSAMPLE_F2 FfxFloat16x2 |
|||
#define UPSAMPLE_F3 FfxFloat16x3 |
|||
#define UPSAMPLE_F4 FfxFloat16x4 |
|||
#define UPSAMPLE_I FfxInt16 |
|||
#define UPSAMPLE_I2 FfxInt16x2 |
|||
#define UPSAMPLE_I3 FfxInt16x3 |
|||
#define UPSAMPLE_I4 FfxInt16x4 |
|||
#define UPSAMPLE_U FfxUInt16 |
|||
#define UPSAMPLE_U2 FfxUInt16x2 |
|||
#define UPSAMPLE_U3 FfxUInt16x3 |
|||
#define UPSAMPLE_U4 FfxUInt16x4 |
|||
#define UPSAMPLE_F2_BROADCAST(X) FFX_BROADCAST_MIN_FLOAT16X2(X) |
|||
#define UPSAMPLE_F3_BROADCAST(X) FFX_BROADCAST_MIN_FLOAT16X3(X) |
|||
#define UPSAMPLE_F4_BROADCAST(X) FFX_BROADCAST_MIN_FLOAT16X4(X) |
|||
#define UPSAMPLE_I2_BROADCAST(X) FFX_BROADCAST_MIN_INT16X2(X) |
|||
#define UPSAMPLE_I3_BROADCAST(X) FFX_BROADCAST_MIN_INT16X3(X) |
|||
#define UPSAMPLE_I4_BROADCAST(X) FFX_BROADCAST_MIN_INT16X4(X) |
|||
#define UPSAMPLE_U2_BROADCAST(X) FFX_BROADCAST_MIN_UINT16X2(X) |
|||
#define UPSAMPLE_U3_BROADCAST(X) FFX_BROADCAST_MIN_UINT16X3(X) |
|||
#define UPSAMPLE_U4_BROADCAST(X) FFX_BROADCAST_MIN_UINT16X4(X) |
|||
|
|||
#else //FFX_HALF |
|||
|
|||
#define UPSAMPLE_F FfxFloat32 |
|||
#define UPSAMPLE_F2 FfxFloat32x2 |
|||
#define UPSAMPLE_F3 FfxFloat32x3 |
|||
#define UPSAMPLE_F4 FfxFloat32x4 |
|||
#define UPSAMPLE_I FfxInt32 |
|||
#define UPSAMPLE_I2 FfxInt32x2 |
|||
#define UPSAMPLE_I3 FfxInt32x3 |
|||
#define UPSAMPLE_I4 FfxInt32x4 |
|||
#define UPSAMPLE_U FfxUInt32 |
|||
#define UPSAMPLE_U2 FfxUInt32x2 |
|||
#define UPSAMPLE_U3 FfxUInt32x3 |
|||
#define UPSAMPLE_U4 FfxUInt32x4 |
|||
#define UPSAMPLE_F2_BROADCAST(X) FFX_BROADCAST_FLOAT32X2(X) |
|||
#define UPSAMPLE_F3_BROADCAST(X) FFX_BROADCAST_FLOAT32X3(X) |
|||
#define UPSAMPLE_F4_BROADCAST(X) FFX_BROADCAST_FLOAT32X4(X) |
|||
#define UPSAMPLE_I2_BROADCAST(X) FFX_BROADCAST_INT32X2(X) |
|||
#define UPSAMPLE_I3_BROADCAST(X) FFX_BROADCAST_INT32X3(X) |
|||
#define UPSAMPLE_I4_BROADCAST(X) FFX_BROADCAST_INT32X4(X) |
|||
#define UPSAMPLE_U2_BROADCAST(X) FFX_BROADCAST_UINT32X2(X) |
|||
#define UPSAMPLE_U3_BROADCAST(X) FFX_BROADCAST_UINT32X3(X) |
|||
#define UPSAMPLE_U4_BROADCAST(X) FFX_BROADCAST_UINT32X4(X) |
|||
|
|||
#endif //FFX_HALF |
|||
|
|||
struct RectificationBoxData |
|||
{ |
|||
UPSAMPLE_F3 boxCenter; |
|||
UPSAMPLE_F3 boxVec; |
|||
UPSAMPLE_F3 aabbMin; |
|||
UPSAMPLE_F3 aabbMax; |
|||
}; |
|||
|
|||
struct RectificationBox |
|||
{ |
|||
RectificationBoxData data_; |
|||
UPSAMPLE_F fBoxCenterWeight; |
|||
}; |
|||
|
|||
void RectificationBoxReset(FFX_PARAMETER_INOUT RectificationBox rectificationBox, const UPSAMPLE_F3 initialColorSample) |
|||
{ |
|||
rectificationBox.fBoxCenterWeight = UPSAMPLE_F(0.0); |
|||
|
|||
rectificationBox.data_.boxCenter = UPSAMPLE_F3_BROADCAST(0); |
|||
rectificationBox.data_.boxVec = UPSAMPLE_F3_BROADCAST(0); |
|||
rectificationBox.data_.aabbMin = initialColorSample; |
|||
rectificationBox.data_.aabbMax = initialColorSample; |
|||
} |
|||
|
|||
void RectificationBoxAddSample(FFX_PARAMETER_INOUT RectificationBox rectificationBox, const UPSAMPLE_F3 colorSample, const UPSAMPLE_F fSampleWeight) |
|||
{ |
|||
rectificationBox.data_.aabbMin = ffxMin(rectificationBox.data_.aabbMin, colorSample); |
|||
rectificationBox.data_.aabbMax = ffxMax(rectificationBox.data_.aabbMax, colorSample); |
|||
UPSAMPLE_F3 weightedSample = colorSample * fSampleWeight; |
|||
rectificationBox.data_.boxCenter += weightedSample; |
|||
rectificationBox.data_.boxVec += colorSample * weightedSample; |
|||
rectificationBox.fBoxCenterWeight += fSampleWeight; |
|||
} |
|||
|
|||
void RectificationBoxComputeVarianceBoxData(FFX_PARAMETER_INOUT RectificationBox rectificationBox) |
|||
{ |
|||
rectificationBox.fBoxCenterWeight = (abs(rectificationBox.fBoxCenterWeight) > UPSAMPLE_F(FSR2_EPSILON) ? rectificationBox.fBoxCenterWeight : UPSAMPLE_F(1.f)); |
|||
rectificationBox.data_.boxCenter /= rectificationBox.fBoxCenterWeight; |
|||
rectificationBox.data_.boxVec /= rectificationBox.fBoxCenterWeight; |
|||
UPSAMPLE_F3 stdDev = sqrt(abs(rectificationBox.data_.boxVec - rectificationBox.data_.boxCenter * rectificationBox.data_.boxCenter)); |
|||
rectificationBox.data_.boxVec = stdDev; |
|||
} |
|||
|
|||
RectificationBoxData RectificationBoxGetData(FFX_PARAMETER_INOUT RectificationBox rectificationBox) |
|||
{ |
|||
return rectificationBox.data_; |
|||
} |
|||
|
|||
FfxFloat32x3 SafeRcp3(FfxFloat32x3 v) |
|||
{ |
|||
return (all(FFX_NOT_EQUAL(v, FFX_BROADCAST_FLOAT32X3(0)))) ? (FFX_BROADCAST_FLOAT32X3(1.0f) / v) : FFX_BROADCAST_FLOAT32X3(0.0f); |
|||
} |
|||
|
|||
FfxFloat32 MinDividedByMax(const FfxFloat32 v0, const FfxFloat32 v1) |
|||
{ |
|||
const FfxFloat32 m = ffxMax(v0, v1); |
|||
return m != 0 ? ffxMin(v0, v1) / m : 0; |
|||
} |
|||
|
|||
#if FFX_HALF |
|||
FFX_MIN16_F MinDividedByMax(const FFX_MIN16_F v0, const FFX_MIN16_F v1) |
|||
{ |
|||
const FFX_MIN16_F m = ffxMax(v0, v1); |
|||
return m != FFX_MIN16_F(0) ? ffxMin(v0, v1) / m : FFX_MIN16_F(0); |
|||
} |
|||
#endif |
|||
|
|||
FfxFloat32 MaxDividedByMin(const FfxFloat32 v0, const FfxFloat32 v1) |
|||
{ |
|||
const FfxFloat32 m = ffxMin(v0, v1); |
|||
return m != 0 ? ffxMax(v0, v1) / m : 0; |
|||
} |
|||
|
|||
FFX_MIN16_F3 RGBToYCoCg_16(FFX_MIN16_F3 fRgb) |
|||
{ |
|||
FFX_MIN16_F3 fYCoCg; |
|||
fYCoCg.x = dot(fRgb.rgb, FFX_MIN16_F3(+0.25f, +0.50f, +0.25f)); |
|||
fYCoCg.y = dot(fRgb.rgb, FFX_MIN16_F3(+0.50f, +0.00f, -0.50f)); |
|||
fYCoCg.z = dot(fRgb.rgb, FFX_MIN16_F3(-0.25f, +0.50f, -0.25f)); |
|||
return fYCoCg; |
|||
} |
|||
|
|||
FFX_MIN16_F3 RGBToYCoCg_V2_16(FFX_MIN16_F3 fRgb) |
|||
{ |
|||
FFX_MIN16_F a = fRgb.g * FFX_MIN16_F(0.5f); |
|||
FFX_MIN16_F b = (fRgb.r + fRgb.b) * FFX_MIN16_F(0.25f); |
|||
FFX_MIN16_F3 fYCoCg; |
|||
fYCoCg.x = a + b; |
|||
fYCoCg.y = (fRgb.r - fRgb.b) * FFX_MIN16_F(0.5f); |
|||
fYCoCg.z = a - b; |
|||
return fYCoCg; |
|||
} |
|||
|
|||
FfxFloat32x3 YCoCgToRGB(FfxFloat32x3 fYCoCg) |
|||
{ |
|||
FfxFloat32x3 fRgb; |
|||
FfxFloat32 tmp = fYCoCg.x - fYCoCg.z / 2.0; |
|||
fRgb.g = fYCoCg.z + tmp; |
|||
fRgb.b = tmp - fYCoCg.y / 2.0; |
|||
fRgb.r = fRgb.b + fYCoCg.y; |
|||
return fRgb; |
|||
} |
|||
#if FFX_HALF |
|||
FFX_MIN16_F3 YCoCgToRGB(FFX_MIN16_F3 fYCoCg) |
|||
{ |
|||
FFX_MIN16_F3 fRgb; |
|||
FFX_MIN16_F tmp = fYCoCg.x - fYCoCg.z * FFX_MIN16_F(0.5f); |
|||
fRgb.g = fYCoCg.z + tmp; |
|||
fRgb.b = tmp - fYCoCg.y * FFX_MIN16_F(0.5f); |
|||
fRgb.r = fRgb.b + fYCoCg.y; |
|||
return fRgb; |
|||
} |
|||
#endif |
|||
|
|||
FfxFloat32x3 RGBToYCoCg(FfxFloat32x3 fRgb) |
|||
{ |
|||
FfxFloat32x3 fYCoCg; |
|||
fYCoCg.y = fRgb.r - fRgb.b; |
|||
FfxFloat32 tmp = fRgb.b + fYCoCg.y / 2.0; |
|||
fYCoCg.z = fRgb.g - tmp; |
|||
fYCoCg.x = tmp + fYCoCg.z / 2.0; |
|||
return fYCoCg; |
|||
} |
|||
#if FFX_HALF |
|||
FFX_MIN16_F3 RGBToYCoCg(FFX_MIN16_F3 fRgb) |
|||
{ |
|||
FFX_MIN16_F3 fYCoCg; |
|||
fYCoCg.y = fRgb.r - fRgb.b; |
|||
FFX_MIN16_F tmp = fRgb.b + fYCoCg.y * FFX_MIN16_F(0.5f); |
|||
fYCoCg.z = fRgb.g - tmp; |
|||
fYCoCg.x = tmp + fYCoCg.z * FFX_MIN16_F(0.5f); |
|||
return fYCoCg; |
|||
} |
|||
#endif |
|||
|
|||
FfxFloat32x3 RGBToYCoCg_V2(FfxFloat32x3 fRgb) |
|||
{ |
|||
FfxFloat32 a = fRgb.g * 0.5f; |
|||
FfxFloat32 b = (fRgb.r + fRgb.b) * 0.25f; |
|||
FfxFloat32x3 fYCoCg; |
|||
fYCoCg.x = a + b; |
|||
fYCoCg.y = (fRgb.r - fRgb.b) * 0.5f; |
|||
fYCoCg.z = a - b; |
|||
return fYCoCg; |
|||
} |
|||
|
|||
FfxFloat32 RGBToLuma(FfxFloat32x3 fLinearRgb) |
|||
{ |
|||
return dot(fLinearRgb, FfxFloat32x3(0.2126f, 0.7152f, 0.0722f)); |
|||
} |
|||
|
|||
FfxFloat32 RGBToPerceivedLuma(FfxFloat32x3 fLinearRgb) |
|||
{ |
|||
FfxFloat32 fLuminance = RGBToLuma(fLinearRgb); |
|||
|
|||
FfxFloat32 fPercievedLuminance = 0; |
|||
if (fLuminance <= 216.0f / 24389.0f) { |
|||
fPercievedLuminance = fLuminance * (24389.0f / 27.0f); |
|||
} else { |
|||
fPercievedLuminance = ffxPow(fLuminance, 1.0f / 3.0f) * 116.0f - 16.0f; |
|||
} |
|||
|
|||
return fPercievedLuminance * 0.01f; |
|||
} |
|||
|
|||
|
|||
FfxFloat32x3 Tonemap(FfxFloat32x3 fRgb) |
|||
{ |
|||
return fRgb / (ffxMax(ffxMax(0.f, fRgb.r), ffxMax(fRgb.g, fRgb.b)) + 1.f).xxx; |
|||
} |
|||
|
|||
FfxFloat32x3 InverseTonemap(FfxFloat32x3 fRgb) |
|||
{ |
|||
return fRgb / ffxMax(FSR2_TONEMAP_EPSILON, 1.f - ffxMax(fRgb.r, ffxMax(fRgb.g, fRgb.b))).xxx; |
|||
} |
|||
|
|||
#if FFX_HALF |
|||
FFX_MIN16_F3 Tonemap(FFX_MIN16_F3 fRgb) |
|||
{ |
|||
return fRgb / (ffxMax(ffxMax(FFX_MIN16_F(0.f), fRgb.r), ffxMax(fRgb.g, fRgb.b)) + FFX_MIN16_F(1.f)).xxx; |
|||
} |
|||
|
|||
FFX_MIN16_F3 InverseTonemap(FFX_MIN16_F3 fRgb) |
|||
{ |
|||
return fRgb / ffxMax(FFX_MIN16_F(FSR2_TONEMAP_EPSILON), FFX_MIN16_F(1.f) - ffxMax(fRgb.r, ffxMax(fRgb.g, fRgb.b))).xxx; |
|||
} |
|||
|
|||
FFX_MIN16_I2 ClampLoad(FFX_MIN16_I2 iPxSample, FFX_MIN16_I2 iPxOffset, FFX_MIN16_I2 iTextureSize) |
|||
{ |
|||
return clamp(iPxSample + iPxOffset, FFX_MIN16_I2(0, 0), iTextureSize - FFX_MIN16_I2(1, 1)); |
|||
} |
|||
#endif |
|||
|
|||
FfxInt32x2 ClampLoad(FfxInt32x2 iPxSample, FfxInt32x2 iPxOffset, FfxInt32x2 iTextureSize) |
|||
{ |
|||
return clamp(iPxSample + iPxOffset, FfxInt32x2(0, 0), iTextureSize - FfxInt32x2(1, 1)); |
|||
} |
|||
|
|||
FfxBoolean IsOnScreen(FFX_MIN16_I2 pos, FFX_MIN16_I2 size) |
|||
{ |
|||
return all(FFX_GREATER_THAN_EQUAL(pos, FFX_BROADCAST_MIN_FLOAT16X2(0))) && all(FFX_LESS_THAN(pos, size)); |
|||
} |
|||
|
|||
FfxFloat32 ComputeAutoExposureFromLavg(FfxFloat32 Lavg) |
|||
{ |
|||
Lavg = exp(Lavg); |
|||
|
|||
const FfxFloat32 S = 100.0f; //ISO arithmetic speed |
|||
const FfxFloat32 K = 12.5f; |
|||
FfxFloat32 ExposureISO100 = log2((Lavg * S) / K); |
|||
|
|||
const FfxFloat32 q = 0.65f; |
|||
FfxFloat32 Lmax = (78.0f / (q * S)) * ffxPow(2.0f, ExposureISO100); |
|||
|
|||
return 1 / Lmax; |
|||
} |
|||
#endif // #if defined(FFX_GPU) |
|||
|
|||
#endif //!defined(FFX_FSR2_COMMON_H) |
|||
@ -0,0 +1,7 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 7dbd8b5acecb7454f9f68f6c8a331efb |
|||
ShaderIncludeImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,188 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
FFX_GROUPSHARED FfxUInt32 spdCounter; |
|||
|
|||
#ifndef SPD_PACKED_ONLY |
|||
FFX_GROUPSHARED FfxFloat32 spdIntermediateR[16][16]; |
|||
FFX_GROUPSHARED FfxFloat32 spdIntermediateG[16][16]; |
|||
FFX_GROUPSHARED FfxFloat32 spdIntermediateB[16][16]; |
|||
FFX_GROUPSHARED FfxFloat32 spdIntermediateA[16][16]; |
|||
|
|||
FfxFloat32x4 SpdLoadSourceImage(FfxFloat32x2 tex, FfxUInt32 slice) |
|||
{ |
|||
FfxFloat32x3 fRgb = LoadInputColor(FfxInt32x2(tex)); |
|||
|
|||
FFX_STATIC const FfxFloat32x3 rgb2y = FfxFloat32x3(0.2126, 0.7152, 0.0722); |
|||
|
|||
//compute log luma |
|||
const FfxFloat32 fLogLuma = log(ffxMax(FSR2_EPSILON, dot(rgb2y, fRgb))); |
|||
|
|||
// Make sure out of screen pixels contribute no value to the end result |
|||
const FfxFloat32 result = all(FFX_LESS_THAN(tex, RenderSize())) ? fLogLuma : 0.0f; |
|||
|
|||
return FfxFloat32x4(result, 0, 0, 0); |
|||
} |
|||
|
|||
FfxFloat32x4 SpdLoad(FfxInt32x2 tex, FfxUInt32 slice) |
|||
{ |
|||
return SPD_LoadMipmap5(tex); |
|||
} |
|||
|
|||
void SpdStore(FfxInt32x2 pix, FfxFloat32x4 outValue, FfxUInt32 index, FfxUInt32 slice) |
|||
{ |
|||
if (index == LumaMipLevelToUse() || index == 5) |
|||
{ |
|||
SPD_SetMipmap(pix, index, outValue.r); |
|||
} |
|||
|
|||
if (index == MipCount() - 1) { //accumulate on 1x1 level |
|||
|
|||
if (all(FFX_EQUAL(pix, FfxInt32x2(0, 0)))) |
|||
{ |
|||
FfxFloat32 prev = SPD_LoadExposureBuffer().y; |
|||
FfxUInt32x2 renderSize = SPD_RenderSize(); |
|||
FfxFloat32 result = outValue.r / (renderSize.x * renderSize.y); |
|||
|
|||
if (prev < resetAutoExposureAverageSmoothing) // Compare Lavg, so small or negative values |
|||
{ |
|||
FfxFloat32 rate = 1.0f; |
|||
result = prev + (result - prev) * (1 - exp(-DeltaTime() * rate)); |
|||
} |
|||
FfxFloat32x2 spdOutput = FfxFloat32x2(ComputeAutoExposureFromLavg(result), result); |
|||
SPD_SetExposureBuffer(spdOutput); |
|||
} |
|||
} |
|||
} |
|||
|
|||
void SpdIncreaseAtomicCounter(FfxUInt32 slice) |
|||
{ |
|||
SPD_IncreaseAtomicCounter(spdCounter); |
|||
} |
|||
|
|||
FfxUInt32 SpdGetAtomicCounter() |
|||
{ |
|||
return spdCounter; |
|||
} |
|||
|
|||
void SpdResetAtomicCounter(FfxUInt32 slice) |
|||
{ |
|||
SPD_ResetAtomicCounter(); |
|||
} |
|||
|
|||
FfxFloat32x4 SpdLoadIntermediate(FfxUInt32 x, FfxUInt32 y) |
|||
{ |
|||
return FfxFloat32x4( |
|||
spdIntermediateR[x][y], |
|||
spdIntermediateG[x][y], |
|||
spdIntermediateB[x][y], |
|||
spdIntermediateA[x][y]); |
|||
} |
|||
void SpdStoreIntermediate(FfxUInt32 x, FfxUInt32 y, FfxFloat32x4 value) |
|||
{ |
|||
spdIntermediateR[x][y] = value.x; |
|||
spdIntermediateG[x][y] = value.y; |
|||
spdIntermediateB[x][y] = value.z; |
|||
spdIntermediateA[x][y] = value.w; |
|||
} |
|||
FfxFloat32x4 SpdReduce4(FfxFloat32x4 v0, FfxFloat32x4 v1, FfxFloat32x4 v2, FfxFloat32x4 v3) |
|||
{ |
|||
return (v0 + v1 + v2 + v3); |
|||
} |
|||
#endif |
|||
|
|||
// define fetch and store functions Packed |
|||
#if FFX_HALF |
|||
#error Callback must be implemented |
|||
|
|||
FFX_GROUPSHARED FfxFloat16x2 spdIntermediateRG[16][16]; |
|||
FFX_GROUPSHARED FfxFloat16x2 spdIntermediateBA[16][16]; |
|||
|
|||
FfxFloat16x4 SpdLoadSourceImageH(FfxFloat32x2 tex, FfxUInt32 slice) |
|||
{ |
|||
return FfxFloat16x4(imgDst[0][FfxFloat32x3(tex, slice)]); |
|||
} |
|||
FfxFloat16x4 SpdLoadH(FfxInt32x2 p, FfxUInt32 slice) |
|||
{ |
|||
return FfxFloat16x4(imgDst6[FfxUInt32x3(p, slice)]); |
|||
} |
|||
void SpdStoreH(FfxInt32x2 p, FfxFloat16x4 value, FfxUInt32 mip, FfxUInt32 slice) |
|||
{ |
|||
if (index == LumaMipLevelToUse() || index == 5) |
|||
{ |
|||
imgDst6[FfxUInt32x3(p, slice)] = FfxFloat32x4(value); |
|||
return; |
|||
} |
|||
imgDst[mip + 1][FfxUInt32x3(p, slice)] = FfxFloat32x4(value); |
|||
} |
|||
void SpdIncreaseAtomicCounter(FfxUInt32 slice) |
|||
{ |
|||
InterlockedAdd(rw_spd_global_atomic[FfxInt16x2(0, 0)].counter[slice], 1, spdCounter); |
|||
} |
|||
FfxUInt32 SpdGetAtomicCounter() |
|||
{ |
|||
return spdCounter; |
|||
} |
|||
void SpdResetAtomicCounter(FfxUInt32 slice) |
|||
{ |
|||
rw_spd_global_atomic[FfxInt16x2(0, 0)].counter[slice] = 0; |
|||
} |
|||
FfxFloat16x4 SpdLoadIntermediateH(FfxUInt32 x, FfxUInt32 y) |
|||
{ |
|||
return FfxFloat16x4( |
|||
spdIntermediateRG[x][y].x, |
|||
spdIntermediateRG[x][y].y, |
|||
spdIntermediateBA[x][y].x, |
|||
spdIntermediateBA[x][y].y); |
|||
} |
|||
void SpdStoreIntermediateH(FfxUInt32 x, FfxUInt32 y, FfxFloat16x4 value) |
|||
{ |
|||
spdIntermediateRG[x][y] = value.xy; |
|||
spdIntermediateBA[x][y] = value.zw; |
|||
} |
|||
FfxFloat16x4 SpdReduce4H(FfxFloat16x4 v0, FfxFloat16x4 v1, FfxFloat16x4 v2, FfxFloat16x4 v3) |
|||
{ |
|||
return (v0 + v1 + v2 + v3) * FfxFloat16(0.25); |
|||
} |
|||
#endif |
|||
|
|||
#include "ffx_spd.h" |
|||
|
|||
void ComputeAutoExposure(FfxUInt32x3 WorkGroupId, FfxUInt32 LocalThreadIndex) |
|||
{ |
|||
#if FFX_HALF |
|||
SpdDownsampleH( |
|||
FfxUInt32x2(WorkGroupId.xy), |
|||
FfxUInt32(LocalThreadIndex), |
|||
FfxUInt32(MipCount()), |
|||
FfxUInt32(NumWorkGroups()), |
|||
FfxUInt32(WorkGroupId.z), |
|||
FfxUInt32x2(WorkGroupOffset())); |
|||
#else |
|||
SpdDownsample( |
|||
FfxUInt32x2(WorkGroupId.xy), |
|||
FfxUInt32(LocalThreadIndex), |
|||
FfxUInt32(MipCount()), |
|||
FfxUInt32(NumWorkGroups()), |
|||
FfxUInt32(WorkGroupId.z), |
|||
FfxUInt32x2(WorkGroupOffset())); |
|||
#endif |
|||
} |
|||
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 27eaecaa70cc09b4c97f68ba43e40a84 |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,164 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
#define FSR2_BIND_SRV_INPUT_COLOR 0 |
|||
#define FSR2_BIND_UAV_SPD_GLOBAL_ATOMIC 0 |
|||
#define FSR2_BIND_UAV_EXPOSURE_MIP_LUMA_CHANGE 1 |
|||
#define FSR2_BIND_UAV_EXPOSURE_MIP_5 2 |
|||
#define FSR2_BIND_UAV_EXPOSURE 3 |
|||
#define FSR2_BIND_CB_FSR2 0 |
|||
#define FSR2_BIND_CB_SPD 1 |
|||
|
|||
#include "ffx_fsr2_callbacks_hlsl.h" |
|||
#include "ffx_fsr2_common.h" |
|||
|
|||
#if defined(FSR2_BIND_CB_SPD) |
|||
cbuffer cbSPD : FFX_FSR2_DECLARE_CB(FSR2_BIND_CB_SPD) { |
|||
|
|||
uint mips; |
|||
uint numWorkGroups; |
|||
uint2 workGroupOffset; |
|||
uint2 renderSize; |
|||
}; |
|||
|
|||
uint MipCount() |
|||
{ |
|||
return mips; |
|||
} |
|||
|
|||
uint NumWorkGroups() |
|||
{ |
|||
return numWorkGroups; |
|||
} |
|||
|
|||
uint2 WorkGroupOffset() |
|||
{ |
|||
return workGroupOffset; |
|||
} |
|||
|
|||
uint2 SPD_RenderSize() |
|||
{ |
|||
return renderSize; |
|||
} |
|||
#else |
|||
uint MipCount() |
|||
{ |
|||
return 0; |
|||
} |
|||
|
|||
uint NumWorkGroups() |
|||
{ |
|||
return 0; |
|||
} |
|||
|
|||
uint2 WorkGroupOffset() |
|||
{ |
|||
return uint2(0, 0); |
|||
} |
|||
|
|||
uint2 SPD_RenderSize() |
|||
{ |
|||
return uint2(0, 0); |
|||
} |
|||
#endif |
|||
|
|||
|
|||
float2 SPD_LoadExposureBuffer() |
|||
{ |
|||
#if defined(FSR2_BIND_UAV_EXPOSURE) || defined(FFX_INTERNAL) |
|||
return rw_exposure[min16int2(0,0)]; |
|||
#else |
|||
return 0; |
|||
#endif |
|||
} |
|||
|
|||
void SPD_SetExposureBuffer(float2 value) |
|||
{ |
|||
#if defined(FSR2_BIND_UAV_EXPOSURE) || defined(FFX_INTERNAL) |
|||
rw_exposure[min16int2(0,0)] = value; |
|||
#endif |
|||
} |
|||
|
|||
float4 SPD_LoadMipmap5(min16int2 iPxPos) |
|||
{ |
|||
#if defined(FSR2_BIND_UAV_EXPOSURE_MIP_5) || defined(FFX_INTERNAL) |
|||
return float4(rw_img_mip_5[iPxPos], 0, 0, 0); |
|||
#else |
|||
return 0; |
|||
#endif |
|||
} |
|||
|
|||
void SPD_SetMipmap(min16int2 iPxPos, int slice, float value) |
|||
{ |
|||
switch (slice) |
|||
{ |
|||
#if defined(FSR2_BIND_UAV_EXPOSURE_MIP_LUMA_CHANGE) || defined(FFX_INTERNAL) |
|||
case FFX_FSR2_SHADING_CHANGE_MIP_LEVEL: |
|||
rw_img_mip_shading_change[iPxPos] = value; |
|||
break; |
|||
#endif |
|||
#if defined(FSR2_BIND_UAV_EXPOSURE_MIP_5) || defined(FFX_INTERNAL) |
|||
case 5: |
|||
rw_img_mip_5[iPxPos] = value; |
|||
break; |
|||
#endif |
|||
default: |
|||
// avoid flattened side effect |
|||
#if defined(FSR2_BIND_UAV_EXPOSURE_MIP_LUMA_CHANGE) || defined(FFX_INTERNAL) |
|||
rw_img_mip_shading_change[iPxPos] = rw_img_mip_shading_change[iPxPos]; |
|||
#elif defined(FSR2_BIND_UAV_EXPOSURE_MIP_5) || defined(FFX_INTERNAL) |
|||
rw_img_mip_5[iPxPos] = rw_img_mip_5[iPxPos]; |
|||
#endif |
|||
break; |
|||
} |
|||
} |
|||
|
|||
void SPD_IncreaseAtomicCounter(inout uint spdCounter) |
|||
{ |
|||
InterlockedAdd(rw_spd_global_atomic[min16int2(0,0)], 1, spdCounter); |
|||
} |
|||
|
|||
void SPD_ResetAtomicCounter() |
|||
{ |
|||
rw_spd_global_atomic[min16int2(0,0)] = 0; |
|||
} |
|||
|
|||
#include "ffx_fsr2_compute_luminance_pyramid.h" |
|||
|
|||
#ifndef FFX_FSR2_THREAD_GROUP_WIDTH |
|||
#define FFX_FSR2_THREAD_GROUP_WIDTH 256 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_WIDTH |
|||
#ifndef FFX_FSR2_THREAD_GROUP_HEIGHT |
|||
#define FFX_FSR2_THREAD_GROUP_HEIGHT 1 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_HEIGHT |
|||
#ifndef FFX_FSR2_THREAD_GROUP_DEPTH |
|||
#define FFX_FSR2_THREAD_GROUP_DEPTH 1 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_DEPTH |
|||
#ifndef FFX_FSR2_NUM_THREADS |
|||
#define FFX_FSR2_NUM_THREADS [numthreads(FFX_FSR2_THREAD_GROUP_WIDTH, FFX_FSR2_THREAD_GROUP_HEIGHT, FFX_FSR2_THREAD_GROUP_DEPTH)] |
|||
#endif // #ifndef FFX_FSR2_NUM_THREADS |
|||
|
|||
FFX_FSR2_NUM_THREADS |
|||
FFX_FSR2_EMBED_CB2_ROOTSIG_CONTENT |
|||
void CS(uint3 WorkGroupId : SV_GroupID, uint LocalThreadIndex : SV_GroupIndex) |
|||
{ |
|||
ComputeAutoExposure(WorkGroupId, LocalThreadIndex); |
|||
} |
|||
@ -0,0 +1,7 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 11a5a62864432d541ac1330a97add861 |
|||
ShaderIncludeImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,93 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
FFX_STATIC const FfxFloat32 DepthClipBaseScale = 4.0f; |
|||
|
|||
FfxFloat32 ComputeSampleDepthClip(FFX_MIN16_I2 iPxSamplePos, FfxFloat32 fPreviousDepth, FfxFloat32 fPreviousDepthBilinearWeight, FfxFloat32 fCurrentDepthViewSpace) |
|||
{ |
|||
FfxFloat32 fPrevNearestDepthViewSpace = abs(ConvertFromDeviceDepthToViewSpace(fPreviousDepth)); |
|||
|
|||
// Depth separation logic ref: See "Minimum Triangle Separation for Correct Z-Buffer Occlusion" |
|||
// Intention: worst case of formula in Figure4 combined with Ksep factor in Section 4 |
|||
// TODO: check intention and improve, some banding visible |
|||
const FfxFloat32 fHalfViewportWidth = RenderSize().x * 0.5f; |
|||
FfxFloat32 fDepthThreshold = ffxMin(fCurrentDepthViewSpace, fPrevNearestDepthViewSpace); |
|||
|
|||
// WARNING: Ksep only works with reversed-z with infinite projection. |
|||
const FfxFloat32 Ksep = 1.37e-05f; |
|||
FfxFloat32 fRequiredDepthSeparation = Ksep * fDepthThreshold * TanHalfFoV() * fHalfViewportWidth; |
|||
FfxFloat32 fDepthDiff = fCurrentDepthViewSpace - fPrevNearestDepthViewSpace; |
|||
|
|||
FfxFloat32 fDepthClipFactor = (fDepthDiff > 0) ? ffxSaturate(fRequiredDepthSeparation / fDepthDiff) : 1.0f; |
|||
|
|||
#ifdef _DEBUG |
|||
rw_debug_out[iPxSamplePos] = FfxFloat32x4(fCurrentDepthViewSpace, fPrevNearestDepthViewSpace, fDepthDiff, fDepthClipFactor); |
|||
#endif |
|||
|
|||
return fPreviousDepthBilinearWeight * fDepthClipFactor * DepthClipBaseScale; |
|||
} |
|||
|
|||
FfxFloat32 ComputeDepthClip(FfxFloat32x2 fUvSample, FfxFloat32 fCurrentDepthViewSpace) |
|||
{ |
|||
FfxFloat32x2 fPxSample = fUvSample * RenderSize() - 0.5f; |
|||
FFX_MIN16_I2 iPxSample = FFX_MIN16_I2(floor(fPxSample)); |
|||
FfxFloat32x2 fPxFrac = ffxFract(fPxSample); |
|||
|
|||
const FfxFloat32 fBilinearWeights[2][2] = { |
|||
{ |
|||
(1 - fPxFrac.x) * (1 - fPxFrac.y), |
|||
(fPxFrac.x) * (1 - fPxFrac.y) |
|||
}, |
|||
{ |
|||
(1 - fPxFrac.x) * (fPxFrac.y), |
|||
(fPxFrac.x) * (fPxFrac.y) |
|||
} |
|||
}; |
|||
|
|||
FfxFloat32 fDepth = 0.0f; |
|||
FfxFloat32 fWeightSum = 0.0f; |
|||
for (FfxInt32 y = 0; y <= 1; ++y) { |
|||
for (FfxInt32 x = 0; x <= 1; ++x) { |
|||
FFX_MIN16_I2 iSamplePos = iPxSample + FFX_MIN16_I2(x, y); |
|||
if (IsOnScreen(iSamplePos, FFX_MIN16_I2(RenderSize()))) { |
|||
FfxFloat32 fBilinearWeight = fBilinearWeights[y][x]; |
|||
if (fBilinearWeight > reconstructedDepthBilinearWeightThreshold) { |
|||
fDepth += ComputeSampleDepthClip(iSamplePos, LoadReconstructedPrevDepth(iSamplePos), fBilinearWeight, fCurrentDepthViewSpace); |
|||
fWeightSum += fBilinearWeight; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
return (fWeightSum > 0) ? fDepth / fWeightSum : DepthClipBaseScale; |
|||
} |
|||
|
|||
void DepthClip(FFX_MIN16_I2 iPxPos) |
|||
{ |
|||
FfxFloat32x2 fDepthUv = (FfxFloat32x2(iPxPos) + 0.5f) / RenderSize(); |
|||
FfxFloat32x2 fMotionVector = LoadDilatedMotionVector(iPxPos); |
|||
FfxFloat32x2 fDilatedUv = fDepthUv + fMotionVector; |
|||
FfxFloat32 fCurrentDepthViewSpace = abs(ConvertFromDeviceDepthToViewSpace(LoadDilatedDepth(iPxPos))); |
|||
|
|||
FfxFloat32 fDepthClip = ComputeDepthClip(fDilatedUv, fCurrentDepthViewSpace); |
|||
|
|||
StoreDepthClip(iPxPos, fDepthClip); |
|||
} |
|||
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: f699007ec4275f749bd1370770c71acf |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,63 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
// FSR2 pass 3 |
|||
// SRV 7 : FSR2_ReconstructedPrevNearestDepth : r_ReconstructedPrevNearestDepth |
|||
// SRV 8 : FSR2_DilatedVelocity : r_dilated_motion_vectors |
|||
// SRV 9 : FSR2_DilatedDepth : r_dilatedDepth |
|||
// UAV 12 : FSR2_DepthClip : rw_depth_clip |
|||
// CB 0 : cbFSR2 |
|||
|
|||
#define FSR2_BIND_SRV_RECONSTRUCTED_PREV_NEAREST_DEPTH 0 |
|||
#define FSR2_BIND_SRV_DILATED_MOTION_VECTORS 1 |
|||
#define FSR2_BIND_SRV_DILATED_DEPTH 2 |
|||
#define FSR2_BIND_UAV_DEPTH_CLIP 0 |
|||
#define FSR2_BIND_CB_FSR2 0 |
|||
|
|||
#include "ffx_fsr2_callbacks_hlsl.h" |
|||
#include "ffx_fsr2_common.h" |
|||
#include "ffx_fsr2_sample.h" |
|||
#include "ffx_fsr2_depth_clip.h" |
|||
|
|||
#ifndef FFX_FSR2_THREAD_GROUP_WIDTH |
|||
#define FFX_FSR2_THREAD_GROUP_WIDTH 8 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_WIDTH |
|||
#ifndef FFX_FSR2_THREAD_GROUP_HEIGHT |
|||
#define FFX_FSR2_THREAD_GROUP_HEIGHT 8 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_HEIGHT |
|||
#ifndef FFX_FSR2_THREAD_GROUP_DEPTH |
|||
#define FFX_FSR2_THREAD_GROUP_DEPTH 1 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_DEPTH |
|||
#ifndef FFX_FSR2_NUM_THREADS |
|||
#define FFX_FSR2_NUM_THREADS [numthreads(FFX_FSR2_THREAD_GROUP_WIDTH, FFX_FSR2_THREAD_GROUP_HEIGHT, FFX_FSR2_THREAD_GROUP_DEPTH)] |
|||
#endif // #ifndef FFX_FSR2_NUM_THREADS |
|||
|
|||
FFX_FSR2_PREFER_WAVE64 |
|||
FFX_FSR2_NUM_THREADS |
|||
FFX_FSR2_EMBED_ROOTSIG_CONTENT |
|||
void CS( |
|||
min16int2 iGroupId : SV_GroupID, |
|||
min16int2 iDispatchThreadId : SV_DispatchThreadID, |
|||
min16int2 iGroupThreadId : SV_GroupThreadID, |
|||
int iGroupIndex : SV_GroupIndex) |
|||
{ |
|||
DepthClip(iDispatchThreadId); |
|||
} |
|||
@ -0,0 +1,7 @@ |
|||
fileFormatVersion: 2 |
|||
guid: a0b2885873743f64aa80c07ced37addf |
|||
ShaderIncludeImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,171 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
FfxFloat32 GetLuma(FFX_MIN16_I2 pos) |
|||
{ |
|||
//add some bias to avoid locking dark areas |
|||
return FfxFloat32(LoadPreparedInputColorLuma(pos)); |
|||
} |
|||
|
|||
FfxFloat32 ComputeThinFeatureConfidence(FFX_MIN16_I2 pos) |
|||
{ |
|||
const FfxInt32 RADIUS = 1; |
|||
|
|||
FfxFloat32 fNucleus = GetLuma(pos); |
|||
|
|||
FfxFloat32 similar_threshold = 1.05f; |
|||
FfxFloat32 dissimilarLumaMin = FSR2_FLT_MAX; |
|||
FfxFloat32 dissimilarLumaMax = 0; |
|||
|
|||
/* |
|||
0 1 2 |
|||
3 4 5 |
|||
6 7 8 |
|||
*/ |
|||
|
|||
#define SETBIT(x) (1U << x) |
|||
|
|||
FfxUInt32 mask = SETBIT(4); //flag fNucleus as similar |
|||
|
|||
const FfxUInt32 rejectionMasks[4] = { |
|||
SETBIT(0) | SETBIT(1) | SETBIT(3) | SETBIT(4), //Upper left |
|||
SETBIT(1) | SETBIT(2) | SETBIT(4) | SETBIT(5), //Upper right |
|||
SETBIT(3) | SETBIT(4) | SETBIT(6) | SETBIT(7), //Lower left |
|||
SETBIT(4) | SETBIT(5) | SETBIT(7) | SETBIT(8), //Lower right |
|||
}; |
|||
|
|||
FfxInt32 idx = 0; |
|||
FFX_UNROLL |
|||
for (FfxInt32 y = -RADIUS; y <= RADIUS; y++) { |
|||
FFX_UNROLL |
|||
for (FfxInt32 x = -RADIUS; x <= RADIUS; x++, idx++) { |
|||
if (x == 0 && y == 0) continue; |
|||
|
|||
FFX_MIN16_I2 samplePos = ClampLoad(pos, FFX_MIN16_I2(x, y), FFX_MIN16_I2(RenderSize())); |
|||
|
|||
FfxFloat32 sampleLuma = GetLuma(samplePos); |
|||
FfxFloat32 difference = ffxMax(sampleLuma, fNucleus) / ffxMin(sampleLuma, fNucleus); |
|||
|
|||
if (difference > 0 && (difference < similar_threshold)) { |
|||
mask |= SETBIT(idx); |
|||
} else { |
|||
dissimilarLumaMin = ffxMin(dissimilarLumaMin, sampleLuma); |
|||
dissimilarLumaMax = ffxMax(dissimilarLumaMax, sampleLuma); |
|||
} |
|||
} |
|||
} |
|||
|
|||
FfxBoolean isRidge = fNucleus > dissimilarLumaMax || fNucleus < dissimilarLumaMin; |
|||
|
|||
if (FFX_FALSE == isRidge) { |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
FFX_UNROLL |
|||
for (FfxInt32 i = 0; i < 4; i++) { |
|||
|
|||
if ((mask & rejectionMasks[i]) == rejectionMasks[i]) { |
|||
return 0; |
|||
} |
|||
} |
|||
|
|||
return 1; |
|||
} |
|||
|
|||
FFX_STATIC FfxBoolean s_bLockUpdated = FFX_FALSE; |
|||
|
|||
LOCK_STATUS_T ComputeLockStatus(FFX_MIN16_I2 iPxLrPos, LOCK_STATUS_T fLockStatus) |
|||
{ |
|||
FfxFloat32 fConfidenceOfThinFeature = ComputeThinFeatureConfidence(iPxLrPos); |
|||
|
|||
s_bLockUpdated = FFX_FALSE; |
|||
if (fConfidenceOfThinFeature > 0.0f) |
|||
{ |
|||
//put to negative on new lock |
|||
fLockStatus[LOCK_LIFETIME_REMAINING] = (fLockStatus[LOCK_LIFETIME_REMAINING] == LOCK_STATUS_F1(0.0f)) ? LOCK_STATUS_F1(-LockInitialLifetime()) : LOCK_STATUS_F1(-(LockInitialLifetime() * 2)); |
|||
|
|||
s_bLockUpdated = FFX_TRUE; |
|||
} |
|||
|
|||
return fLockStatus; |
|||
} |
|||
|
|||
void ComputeLock(FFX_MIN16_I2 iPxLrPos) |
|||
{ |
|||
FfxFloat32x2 fSrcJitteredPos = FfxFloat32x2(iPxLrPos) + 0.5f - Jitter(); |
|||
FfxFloat32x2 fLrPosInHr = (fSrcJitteredPos / RenderSize()) * DisplaySize(); |
|||
FfxFloat32x2 fHrPos = floor(fLrPosInHr) + 0.5; |
|||
FFX_MIN16_I2 iPxHrPos = FFX_MIN16_I2(fHrPos); |
|||
|
|||
LOCK_STATUS_T fLockStatus = ComputeLockStatus(iPxLrPos, LoadLockStatus(iPxHrPos)); |
|||
|
|||
if ((s_bLockUpdated)) { |
|||
StoreLockStatus(iPxHrPos, fLockStatus); |
|||
} |
|||
} |
|||
|
|||
FFX_GROUPSHARED FfxFloat32 gs_ReactiveMask[(8 + 4) * (8 + 4)]; |
|||
|
|||
void StoreReactiveMaskToLDS(FfxUInt32x2 coord, FfxFloat32x2 value) |
|||
{ |
|||
FfxUInt32 baseIdx = coord.y * 12 + coord.x; |
|||
gs_ReactiveMask[baseIdx] = value.x; |
|||
gs_ReactiveMask[baseIdx + 1] = value.y; |
|||
} |
|||
|
|||
FfxFloat32 LoadReactiveMaskFromLDS(FfxUInt32x2 coord) |
|||
{ |
|||
return gs_ReactiveMask[coord.y * 12 + coord.x]; |
|||
} |
|||
|
|||
void PreProcessReactiveMask(FFX_MIN16_I2 iPxLrPos, FfxUInt32x2 groupId, FfxUInt32x2 groupThreadId) |
|||
{ |
|||
#if OPT_PRECOMPUTE_REACTIVE_MAX && !OPT_USE_EVAL_ACCUMULATION_REACTIVENESS |
|||
|
|||
if (all(FFX_LESS_THAN(groupThreadId, FFX_BROADCAST_UINT32X2(6)))) { |
|||
|
|||
FfxInt32x2 iPos = FfxInt32x2(groupId << 3) + FfxInt32x2(groupThreadId << 1) - 1; |
|||
FfxFloat32x4 fReactiveMask2x2 = GatherReactiveMask(iPos).wzxy; |
|||
|
|||
StoreReactiveMaskToLDS(groupThreadId << 1, fReactiveMask2x2.xy); |
|||
StoreReactiveMaskToLDS((groupThreadId << 1) + FfxInt32x2(0, 1), fReactiveMask2x2.zw); |
|||
} |
|||
|
|||
FFX_GROUP_MEMORY_BARRIER(); |
|||
|
|||
FfxFloat32 fReactiveMax = 0.0f; |
|||
|
|||
for (FfxUInt32 row = 0; row < 4; row++) { |
|||
for (FfxUInt32 col = 0; col < 4; col++) { |
|||
const FfxUInt32x2 localOffset = groupThreadId + FfxUInt32x2(col, row); |
|||
const FfxBoolean bOutOfRenderBounds = any(FFX_GREATER_THAN_EQUAL((FfxInt32x2(groupId << 3) + FfxInt32x2(localOffset)), RenderSize())); |
|||
fReactiveMax = bOutOfRenderBounds ? fReactiveMax : ffxMax(fReactiveMax, LoadReactiveMaskFromLDS(localOffset)); |
|||
} |
|||
} |
|||
|
|||
// Threshold reactive value |
|||
fReactiveMax = fReactiveMax > 0.8f ? fReactiveMax : 0.0f; |
|||
|
|||
StoreReactiveMax(iPxLrPos, FFX_MIN16_F(fReactiveMax)); |
|||
|
|||
#endif //OPT_PRECOMPUTE_REACTIVE_MAX && !OPT_USE_EVAL_ACCUMULATION_REACTIVENESS |
|||
} |
|||
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 752646c17a9b5a046b6c8abf0436bc21 |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,66 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
// FSR2 pass 4 |
|||
// SRV 5 : m_UpscaleReactive : r_reactive_mask |
|||
// SRV 11 : FSR2_LockStatus2 : r_lock_status |
|||
// SRV 13 : FSR2_PreparedInputColor : r_prepared_input_color |
|||
// UAV 11 : FSR2_LockStatus1 : rw_lock_status |
|||
// UAV 27 : FSR2_ReactiveMaskMax : rw_reactive_max |
|||
// CB 0 : cbFSR2 |
|||
// CB 1 : FSR2DispatchOffsets |
|||
|
|||
#define FSR2_BIND_SRV_REACTIVE_MASK 0 |
|||
#define FSR2_BIND_SRV_LOCK_STATUS 1 |
|||
#define FSR2_BIND_SRV_PREPARED_INPUT_COLOR 2 |
|||
#define FSR2_BIND_UAV_LOCK_STATUS 0 |
|||
#define FSR2_BIND_UAV_REACTIVE_MASK_MAX 1 |
|||
#define FSR2_BIND_CB_FSR2 0 |
|||
|
|||
#include "ffx_fsr2_callbacks_hlsl.h" |
|||
#include "ffx_fsr2_common.h" |
|||
#include "ffx_fsr2_sample.h" |
|||
#include "ffx_fsr2_lock.h" |
|||
|
|||
#ifndef FFX_FSR2_THREAD_GROUP_WIDTH |
|||
#define FFX_FSR2_THREAD_GROUP_WIDTH 8 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_WIDTH |
|||
#ifndef FFX_FSR2_THREAD_GROUP_HEIGHT |
|||
#define FFX_FSR2_THREAD_GROUP_HEIGHT 8 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_HEIGHT |
|||
#ifndef FFX_FSR2_THREAD_GROUP_DEPTH |
|||
#define FFX_FSR2_THREAD_GROUP_DEPTH 1 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_DEPTH |
|||
#ifndef FFX_FSR2_NUM_THREADS |
|||
#define FFX_FSR2_NUM_THREADS [numthreads(FFX_FSR2_THREAD_GROUP_WIDTH, FFX_FSR2_THREAD_GROUP_HEIGHT, FFX_FSR2_THREAD_GROUP_DEPTH)] |
|||
#endif // #ifndef FFX_FSR2_NUM_THREADS |
|||
|
|||
FFX_FSR2_PREFER_WAVE64 |
|||
FFX_FSR2_NUM_THREADS |
|||
FFX_FSR2_EMBED_ROOTSIG_CONTENT |
|||
void CS(uint2 uGroupId : SV_GroupID, uint2 uGroupThreadId : SV_GroupThreadID) |
|||
{ |
|||
uint2 uDispatchThreadId = uGroupId * uint2(FFX_FSR2_THREAD_GROUP_WIDTH, FFX_FSR2_THREAD_GROUP_HEIGHT) + uGroupThreadId; |
|||
|
|||
ComputeLock(uDispatchThreadId); |
|||
|
|||
PreProcessReactiveMask(uDispatchThreadId, uGroupId, uGroupThreadId); |
|||
} |
|||
@ -0,0 +1,7 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 9ebb55b63a3165640bb00e58ba134e3a |
|||
ShaderIncludeImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,85 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
#ifndef FFX_FSR2_POSTPROCESS_LOCK_STATUS_H |
|||
#define FFX_FSR2_POSTPROCESS_LOCK_STATUS_H |
|||
|
|||
FFX_MIN16_F4 WrapShadingChangeLuma(FFX_MIN16_I2 iPxSample) |
|||
{ |
|||
return FFX_MIN16_F4(LoadMipLuma(iPxSample, LumaMipLevelToUse()), 0, 0, 0); |
|||
} |
|||
|
|||
DeclareCustomFetchBilinearSamples(FetchShadingChangeLumaSamples, WrapShadingChangeLuma) |
|||
DeclareCustomTextureSample(ShadingChangeLumaSample, Bilinear, FetchShadingChangeLumaSamples) |
|||
|
|||
FFX_MIN16_F GetShadingChangeLuma(FfxFloat32x2 fUvCoord) |
|||
{ |
|||
// const FfxFloat32 fShadingChangeLuma = exp(ShadingChangeLumaSample(fUvCoord, LumaMipDimensions()) * LumaMipRcp()); |
|||
const FFX_MIN16_F fShadingChangeLuma = FFX_MIN16_F(exp(SampleMipLuma(fUvCoord, LumaMipLevelToUse()) * FFX_MIN16_F(LumaMipRcp()))); |
|||
return fShadingChangeLuma; |
|||
} |
|||
|
|||
LockState GetLockState(LOCK_STATUS_T fLockStatus) |
|||
{ |
|||
LockState state = { FFX_FALSE, FFX_FALSE }; |
|||
|
|||
//Check if this is a new or refreshed lock |
|||
state.NewLock = fLockStatus[LOCK_LIFETIME_REMAINING] < LOCK_STATUS_F1(0.0f); |
|||
|
|||
//For a non-refreshed lock, the lifetime is set to LockInitialLifetime() |
|||
state.WasLockedPrevFrame = fLockStatus[LOCK_TRUST] != LOCK_STATUS_F1(0.0f); |
|||
|
|||
return state; |
|||
} |
|||
|
|||
LockState PostProcessLockStatus(FFX_MIN16_I2 iPxHrPos, FFX_PARAMETER_IN FfxFloat32x2 fLrUvJittered, FFX_PARAMETER_IN FFX_MIN16_F fDepthClipFactor, FFX_PARAMETER_IN FfxFloat32 fHrVelocity, |
|||
FFX_PARAMETER_INOUT FfxFloat32 fAccumulationTotalWeight, FFX_PARAMETER_INOUT LOCK_STATUS_T fLockStatus, FFX_PARAMETER_OUT FFX_MIN16_F fLuminanceDiff) { |
|||
|
|||
const LockState state = GetLockState(fLockStatus); |
|||
|
|||
fLockStatus[LOCK_LIFETIME_REMAINING] = abs(fLockStatus[LOCK_LIFETIME_REMAINING]); |
|||
|
|||
FFX_MIN16_F fShadingChangeLuma = GetShadingChangeLuma(fLrUvJittered); |
|||
|
|||
//init temporal shading change factor, init to -1 or so in reproject to know if "true new"? |
|||
fLockStatus[LOCK_TEMPORAL_LUMA] = (fLockStatus[LOCK_TEMPORAL_LUMA] == LOCK_STATUS_F1(0.0f)) ? fShadingChangeLuma : fLockStatus[LOCK_TEMPORAL_LUMA]; |
|||
|
|||
FFX_MIN16_F fPreviousShadingChangeLuma = fLockStatus[LOCK_TEMPORAL_LUMA]; |
|||
fLockStatus[LOCK_TEMPORAL_LUMA] = ffxLerp(fLockStatus[LOCK_TEMPORAL_LUMA], LOCK_STATUS_F1(fShadingChangeLuma), LOCK_STATUS_F1(0.5f)); |
|||
fLuminanceDiff = FFX_MIN16_F(1) - MinDividedByMax(fPreviousShadingChangeLuma, fShadingChangeLuma); |
|||
|
|||
if (fLuminanceDiff > FFX_MIN16_F(0.2f)) { |
|||
KillLock(fLockStatus); |
|||
} |
|||
|
|||
if (!state.NewLock && fLockStatus[LOCK_LIFETIME_REMAINING] >= LOCK_STATUS_F1(0)) |
|||
{ |
|||
const FFX_MIN16_F depthClipThreshold = FFX_MIN16_F(0.99f); |
|||
if (fDepthClipFactor < depthClipThreshold) |
|||
{ |
|||
KillLock(fLockStatus); |
|||
} |
|||
} |
|||
|
|||
return state; |
|||
} |
|||
|
|||
#endif //!defined( FFX_FSR2_POSTPROCESS_LOCK_STATUS_H ) |
|||
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 56fcb16f22e48dd47a24bd70fc4dd53b |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,83 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
//TODO: Move to common location & share with Accumulate |
|||
void ClearResourcesForNextFrame(in FFX_MIN16_I2 iPxHrPos) |
|||
{ |
|||
if (all(FFX_LESS_THAN(iPxHrPos, FFX_MIN16_I2(RenderSize())))) |
|||
{ |
|||
#if FFX_FSR2_OPTION_INVERTED_DEPTH |
|||
const FfxUInt32 farZ = 0x0; |
|||
#else |
|||
const FfxUInt32 farZ = 0x3f800000; |
|||
#endif |
|||
SetReconstructedDepth(iPxHrPos, farZ); |
|||
} |
|||
} |
|||
|
|||
void ComputeLumaStabilityFactor(FFX_MIN16_I2 iPxLrPos, FfxFloat32 fCurrentFrameLuma) |
|||
{ |
|||
FfxFloat32x4 fCurrentFrameLumaHistory = LoadRwLumaHistory(iPxLrPos); |
|||
|
|||
fCurrentFrameLumaHistory.a = FfxFloat32(0); |
|||
|
|||
if (FrameIndex() > 3) { |
|||
FfxFloat32 fDiffs0 = MinDividedByMax(fCurrentFrameLumaHistory[2], fCurrentFrameLuma); |
|||
FfxFloat32 fDiffs1 = ffxMax(MinDividedByMax(fCurrentFrameLumaHistory[0], fCurrentFrameLuma), MinDividedByMax(fCurrentFrameLumaHistory[1], fCurrentFrameLuma)); |
|||
|
|||
fCurrentFrameLumaHistory.a = ffxSaturate(fDiffs1 - fDiffs0); |
|||
} |
|||
|
|||
//move history |
|||
fCurrentFrameLumaHistory[0] = fCurrentFrameLumaHistory[1]; |
|||
fCurrentFrameLumaHistory[1] = fCurrentFrameLumaHistory[2]; |
|||
fCurrentFrameLumaHistory[2] = fCurrentFrameLuma; |
|||
|
|||
StoreLumaHistory(iPxLrPos, fCurrentFrameLumaHistory); |
|||
} |
|||
|
|||
void PrepareInputColor(FFX_MIN16_I2 iPxLrPos) |
|||
{ |
|||
//We assume linear data. if non-linear input (sRGB, ...), |
|||
//then we should convert to linear first and back to sRGB on output. |
|||
|
|||
FfxFloat32x3 fRgb = ffxMax(FFX_BROADCAST_FLOAT32X3(0), LoadInputColor(iPxLrPos)); |
|||
|
|||
fRgb *= Exposure(); |
|||
|
|||
#if FFX_FSR2_OPTION_HDR_COLOR_INPUT |
|||
// Tonemap color, used in lockstatus and luma stability computations |
|||
fRgb = Tonemap(fRgb); |
|||
#endif |
|||
|
|||
PREPARED_INPUT_COLOR_T fYCoCg; |
|||
|
|||
fYCoCg.xyz = PREPARED_INPUT_COLOR_F3(RGBToYCoCg(fRgb)); |
|||
|
|||
const FfxFloat32 fPerceivedLuma = RGBToPerceivedLuma(fRgb); |
|||
ComputeLumaStabilityFactor(iPxLrPos, fPerceivedLuma); |
|||
|
|||
//compute luma used to lock pixels, if used elsewhere the ffxPow must be moved! |
|||
fYCoCg.w = PREPARED_INPUT_COLOR_F1(ffxPow(fPerceivedLuma, 1.0f / 6.0f)); |
|||
|
|||
StorePreparedInputColor(iPxLrPos, fYCoCg); |
|||
ClearResourcesForNextFrame(iPxLrPos); |
|||
} |
|||
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 5a9511d4524bc6d41ae1c3dc8728eb95 |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,64 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
// FSR2 pass 1 |
|||
// SRV 1 : m_HDR : r_input_color_jittered |
|||
// SRV 4 : FSR2_Exposure : r_exposure |
|||
// UAV 7 : FSR2_ReconstructedPrevNearestDepth : rw_ReconstructedPrevNearestDepth |
|||
// UAV 13 : FSR2_PreparedInputColor : rw_prepared_input_color |
|||
// UAV 14 : FSR2_LumaHistory : rw_luma_history |
|||
// CB 0 : cbFSR2 |
|||
|
|||
#define FSR2_BIND_SRV_INPUT_COLOR 0 |
|||
#define FSR2_BIND_SRV_EXPOSURE 1 |
|||
#define FSR2_BIND_UAV_RECONSTRUCTED_PREV_NEAREST_DEPTH 0 |
|||
#define FSR2_BIND_UAV_PREPARED_INPUT_COLOR 1 |
|||
#define FSR2_BIND_UAV_LUMA_HISTORY 2 |
|||
#define FSR2_BIND_CB_FSR2 0 |
|||
|
|||
#include "ffx_fsr2_callbacks_hlsl.h" |
|||
#include "ffx_fsr2_common.h" |
|||
#include "ffx_fsr2_prepare_input_color.h" |
|||
|
|||
#ifndef FFX_FSR2_THREAD_GROUP_WIDTH |
|||
#define FFX_FSR2_THREAD_GROUP_WIDTH 8 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_WIDTH |
|||
#ifndef FFX_FSR2_THREAD_GROUP_HEIGHT |
|||
#define FFX_FSR2_THREAD_GROUP_HEIGHT 8 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_HEIGHT |
|||
#ifndef FFX_FSR2_THREAD_GROUP_DEPTH |
|||
#define FFX_FSR2_THREAD_GROUP_DEPTH 1 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_DEPTH |
|||
#ifndef FFX_FSR2_NUM_THREADS |
|||
#define FFX_FSR2_NUM_THREADS [numthreads(FFX_FSR2_THREAD_GROUP_WIDTH, FFX_FSR2_THREAD_GROUP_HEIGHT, FFX_FSR2_THREAD_GROUP_DEPTH)] |
|||
#endif // #ifndef FFX_FSR2_NUM_THREADS |
|||
|
|||
FFX_FSR2_NUM_THREADS |
|||
FFX_FSR2_EMBED_ROOTSIG_CONTENT |
|||
void CS( |
|||
uint2 uGroupId : SV_GroupID, |
|||
uint2 uDispatchThreadId : SV_DispatchThreadID, |
|||
uint2 uGroupThreadId : SV_GroupThreadID, |
|||
uint uGroupIndex : SV_GroupIndex |
|||
) |
|||
{ |
|||
PrepareInputColor(uDispatchThreadId); |
|||
} |
|||
@ -0,0 +1,7 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 7aa1ba5d320042e4b9eb1a2f2a8d1295 |
|||
ShaderIncludeImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,105 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
#define GROUP_SIZE 8 |
|||
|
|||
#define FSR_RCAS_DENOISE 1 |
|||
|
|||
void WriteUpscaledOutput(FFX_MIN16_U2 iPxHrPos, FfxFloat32x3 fUpscaledColor) |
|||
{ |
|||
StoreUpscaledOutput(FFX_MIN16_I2(iPxHrPos), fUpscaledColor); |
|||
} |
|||
|
|||
#if FFX_HALF |
|||
#define FSR_RCAS_H |
|||
FfxFloat16x4 FsrRcasLoadH(FfxInt16x2 p) |
|||
{ |
|||
FfxFloat32x4 inputSample = LoadRCAS_Input(p); //TODO: fix type |
|||
|
|||
inputSample.rgb *= Exposure(); |
|||
|
|||
#if FFX_FSR2_OPTION_HDR_COLOR_INPUT |
|||
inputSample.rgb = Tonemap(inputSample.rgb); |
|||
#endif // #if FFX_FSR2_OPTION_HDR_COLOR_INPUT |
|||
|
|||
return FfxFloat16x4(inputSample); |
|||
} |
|||
void FsrRcasInputH(inout FfxFloat16 r, inout FfxFloat16 g, inout FfxFloat16 b) {} |
|||
#else |
|||
#define FSR_RCAS_F |
|||
FfxFloat32x4 FsrRcasLoadF(FfxInt32x2 p) |
|||
{ |
|||
FfxFloat32x4 inputSample = LoadRCAS_Input(p); |
|||
|
|||
inputSample.rgb *= Exposure(); |
|||
|
|||
#if FFX_FSR2_OPTION_HDR_COLOR_INPUT |
|||
inputSample.rgb = Tonemap(inputSample.rgb); |
|||
#endif |
|||
|
|||
return inputSample; |
|||
} |
|||
|
|||
void FsrRcasInputF(inout FfxFloat32 r, inout FfxFloat32 g, inout FfxFloat32 b) {} |
|||
#endif // #if FFX_HALF |
|||
|
|||
#include "ffx_fsr1.h" |
|||
|
|||
|
|||
void CurrFilter(FFX_MIN16_U2 pos) |
|||
{ |
|||
#if FFX_HALF |
|||
FfxFloat16x3 c; |
|||
FsrRcasH(c.r, c.g, c.b, pos, RCASConfig()); |
|||
|
|||
#if FFX_FSR2_OPTION_HDR_COLOR_INPUT |
|||
c = InverseTonemap(c); |
|||
#endif |
|||
|
|||
c /= FfxFloat16(Exposure()); |
|||
|
|||
WriteUpscaledOutput(pos, c); //TODO: fix type |
|||
#else |
|||
FfxFloat32x3 c; |
|||
FsrRcasF(c.r, c.g, c.b, pos, RCASConfig()); |
|||
|
|||
#if FFX_FSR2_OPTION_HDR_COLOR_INPUT |
|||
c = InverseTonemap(c); |
|||
#endif |
|||
|
|||
c /= Exposure(); |
|||
|
|||
WriteUpscaledOutput(pos, c); |
|||
#endif |
|||
} |
|||
|
|||
void RCAS(FfxUInt32x3 LocalThreadId, FfxUInt32x3 WorkGroupId, FfxUInt32x3 Dtid) |
|||
{ |
|||
// Do remapping of local xy in workgroup for a more PS-like swizzle pattern. |
|||
FfxUInt32x2 gxy = ffxRemapForQuad(LocalThreadId.x) + FfxUInt32x2(WorkGroupId.x << 4u, WorkGroupId.y << 4u); |
|||
CurrFilter(FFX_MIN16_U2(gxy)); |
|||
gxy.x += 8u; |
|||
CurrFilter(FFX_MIN16_U2(gxy)); |
|||
gxy.y += 8u; |
|||
CurrFilter(FFX_MIN16_U2(gxy)); |
|||
gxy.x -= 8u; |
|||
CurrFilter(FFX_MIN16_U2(gxy)); |
|||
} |
|||
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 91f9f415097f9c94888afa6b3753b4e9 |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,88 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
// FSR2 pass 6 |
|||
// SRV 4 : m_Exposure : r_exposure |
|||
// SRV 19 : FSR2_InternalUpscaled1 : r_rcas_input |
|||
// UAV 18 : DisplayOutput : rw_upscaled_output |
|||
// CB 0 : cbFSR2 |
|||
// CB 1 : cbRCAS |
|||
|
|||
#define FSR2_BIND_SRV_EXPOSURE 0 |
|||
#define FSR2_BIND_SRV_RCAS_INPUT 1 |
|||
#define FSR2_BIND_UAV_UPSCALED_OUTPUT 0 |
|||
#define FSR2_BIND_CB_FSR2 0 |
|||
#define FSR2_BIND_CB_RCAS 1 |
|||
|
|||
#include "ffx_fsr2_callbacks_hlsl.h" |
|||
#include "ffx_fsr2_common.h" |
|||
|
|||
//Move to prototype shader! |
|||
#if defined(FSR2_BIND_CB_RCAS) |
|||
cbuffer cbRCAS : FFX_FSR2_DECLARE_CB(FSR2_BIND_CB_RCAS) |
|||
{ |
|||
uint4 rcasConfig; |
|||
}; |
|||
|
|||
uint4 RCASConfig() |
|||
{ |
|||
return rcasConfig; |
|||
} |
|||
#else |
|||
uint4 RCASConfig() |
|||
{ |
|||
return 0; |
|||
} |
|||
#endif |
|||
|
|||
#if FFX_HALF |
|||
float4 LoadRCAS_Input(FfxInt16x2 iPxPos) |
|||
{ |
|||
return r_rcas_input[iPxPos]; |
|||
} |
|||
#else |
|||
float4 LoadRCAS_Input(FfxInt32x2 iPxPos) |
|||
{ |
|||
return r_rcas_input[iPxPos]; |
|||
} |
|||
#endif |
|||
|
|||
#include "ffx_fsr2_rcas.h" |
|||
|
|||
#ifndef FFX_FSR2_THREAD_GROUP_WIDTH |
|||
#define FFX_FSR2_THREAD_GROUP_WIDTH 64 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_WIDTH |
|||
#ifndef FFX_FSR2_THREAD_GROUP_HEIGHT |
|||
#define FFX_FSR2_THREAD_GROUP_HEIGHT 1 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_HEIGHT |
|||
#ifndef FFX_FSR2_THREAD_GROUP_DEPTH |
|||
#define FFX_FSR2_THREAD_GROUP_DEPTH 1 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_DEPTH |
|||
#ifndef FFX_FSR2_NUM_THREADS |
|||
#define FFX_FSR2_NUM_THREADS [numthreads(FFX_FSR2_THREAD_GROUP_WIDTH, FFX_FSR2_THREAD_GROUP_HEIGHT, FFX_FSR2_THREAD_GROUP_DEPTH)] |
|||
#endif // #ifndef FFX_FSR2_NUM_THREADS |
|||
|
|||
FFX_FSR2_NUM_THREADS |
|||
FFX_FSR2_EMBED_CB2_ROOTSIG_CONTENT |
|||
void CS(uint3 LocalThreadId : SV_GroupThreadID, uint3 WorkGroupId : SV_GroupID, uint3 Dtid : SV_DispatchThreadID) |
|||
{ |
|||
RCAS(LocalThreadId, WorkGroupId, Dtid); |
|||
} |
|||
@ -0,0 +1,7 @@ |
|||
fileFormatVersion: 2 |
|||
guid: fdf63c16108ce284bba003f9d3e389c0 |
|||
ShaderIncludeImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,135 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
#ifndef FFX_FSR2_RECONSTRUCT_DILATED_VELOCITY_AND_PREVIOUS_DEPTH_H |
|||
#define FFX_FSR2_RECONSTRUCT_DILATED_VELOCITY_AND_PREVIOUS_DEPTH_H |
|||
|
|||
void ReconstructPrevDepth(FFX_MIN16_I2 iPxPos, FfxFloat32 fDepth, FfxFloat32x2 fMotionVector, FFX_MIN16_I2 iPxDepthSize) |
|||
{ |
|||
FfxFloat32x2 fDepthUv = (FfxFloat32x2(iPxPos) + 0.5f) / iPxDepthSize; |
|||
FfxFloat32x2 fPxPrevPos = (fDepthUv + fMotionVector) * FfxFloat32x2(iPxDepthSize)-0.5f; |
|||
FFX_MIN16_I2 iPxPrevPos = FFX_MIN16_I2(floor(fPxPrevPos)); |
|||
FfxFloat32x2 fPxFrac = ffxFract(fPxPrevPos); |
|||
|
|||
const FfxFloat32 bilinearWeights[2][2] = { |
|||
{ |
|||
(1 - fPxFrac.x) * (1 - fPxFrac.y), |
|||
(fPxFrac.x) * (1 - fPxFrac.y) |
|||
}, |
|||
{ |
|||
(1 - fPxFrac.x) * (fPxFrac.y), |
|||
(fPxFrac.x) * (fPxFrac.y) |
|||
} |
|||
}; |
|||
|
|||
// Project current depth into previous frame locations. |
|||
// Push to all pixels having some contribution if reprojection is using bilinear logic. |
|||
for (FfxInt32 y = 0; y <= 1; ++y) { |
|||
for (FfxInt32 x = 0; x <= 1; ++x) { |
|||
|
|||
FFX_MIN16_I2 offset = FFX_MIN16_I2(x, y); |
|||
FfxFloat32 w = bilinearWeights[y][x]; |
|||
|
|||
if (w > reconstructedDepthBilinearWeightThreshold) { |
|||
|
|||
FFX_MIN16_I2 storePos = iPxPrevPos + offset; |
|||
if (IsOnScreen(storePos, iPxDepthSize)) { |
|||
StoreReconstructedDepth(storePos, fDepth); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
void FindNearestDepth(FFX_PARAMETER_IN FFX_MIN16_I2 iPxPos, FFX_PARAMETER_IN FFX_MIN16_I2 iPxSize, FFX_PARAMETER_OUT FfxFloat32 fNearestDepth, FFX_PARAMETER_OUT FFX_MIN16_I2 fNearestDepthCoord) |
|||
{ |
|||
const FfxInt32 iSampleCount = 9; |
|||
const FFX_MIN16_I2 iSampleOffsets[iSampleCount] = { |
|||
FFX_MIN16_I2(+0, +0), |
|||
FFX_MIN16_I2(+1, +0), |
|||
FFX_MIN16_I2(+0, +1), |
|||
FFX_MIN16_I2(+0, -1), |
|||
FFX_MIN16_I2(-1, +0), |
|||
FFX_MIN16_I2(-1, +1), |
|||
FFX_MIN16_I2(+1, +1), |
|||
FFX_MIN16_I2(-1, -1), |
|||
FFX_MIN16_I2(+1, -1), |
|||
}; |
|||
|
|||
// pull out the depth loads to allow SC to batch them |
|||
FfxFloat32 depth[9]; |
|||
FfxInt32 iSampleIndex = 0; |
|||
FFX_UNROLL |
|||
for (iSampleIndex = 0; iSampleIndex < iSampleCount; ++iSampleIndex) { |
|||
|
|||
FFX_MIN16_I2 iPos = iPxPos + iSampleOffsets[iSampleIndex]; |
|||
depth[iSampleIndex] = LoadInputDepth(iPos); |
|||
} |
|||
|
|||
// find closest depth |
|||
fNearestDepthCoord = iPxPos; |
|||
fNearestDepth = depth[0]; |
|||
FFX_UNROLL |
|||
for (iSampleIndex = 1; iSampleIndex < iSampleCount; ++iSampleIndex) { |
|||
|
|||
FFX_MIN16_I2 iPos = iPxPos + iSampleOffsets[iSampleIndex]; |
|||
if (IsOnScreen(iPos, iPxSize)) { |
|||
|
|||
FfxFloat32 fNdDepth = depth[iSampleIndex]; |
|||
#if FFX_FSR2_OPTION_INVERTED_DEPTH |
|||
if (fNdDepth > fNearestDepth) { |
|||
#else |
|||
if (fNdDepth < fNearestDepth) { |
|||
#endif |
|||
fNearestDepthCoord = iPos; |
|||
fNearestDepth = fNdDepth; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
void ReconstructPrevDepthAndDilateMotionVectors(FFX_MIN16_I2 iPxLrPos) |
|||
{ |
|||
FFX_MIN16_I2 iPxLrSize = FFX_MIN16_I2(RenderSize()); |
|||
FFX_MIN16_I2 iPxHrSize = FFX_MIN16_I2(DisplaySize()); |
|||
|
|||
FfxFloat32 fDilatedDepth; |
|||
FFX_MIN16_I2 iNearestDepthCoord; |
|||
|
|||
FindNearestDepth(iPxLrPos, iPxLrSize, fDilatedDepth, iNearestDepthCoord); |
|||
|
|||
#if FFX_FSR2_OPTION_LOW_RESOLUTION_MOTION_VECTORS |
|||
FfxFloat32x2 fDilatedMotionVector = LoadInputMotionVector(iNearestDepthCoord); |
|||
#else |
|||
FfxFloat32x2 fSrcJitteredPos = FfxFloat32x2(iNearestDepthCoord) + 0.5f - Jitter(); |
|||
FfxFloat32x2 fLrPosInHr = (fSrcJitteredPos / iPxLrSize) * iPxHrSize; |
|||
FfxFloat32x2 fHrPos = floor(fLrPosInHr) + 0.5; |
|||
|
|||
FfxFloat32x2 fDilatedMotionVector = LoadInputMotionVector(FFX_MIN16_I2(fHrPos)); |
|||
#endif |
|||
|
|||
StoreDilatedDepth(iPxLrPos, fDilatedDepth); |
|||
StoreDilatedMotionVector(iPxLrPos, fDilatedMotionVector); |
|||
|
|||
ReconstructPrevDepth(iPxLrPos, fDilatedDepth, fDilatedMotionVector, iPxLrSize); |
|||
} |
|||
|
|||
#endif //!defined( FFX_FSR2_RECONSTRUCT_DILATED_VELOCITY_AND_PREVIOUS_DEPTH_H ) |
|||
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 4dea78896bcaeff43b67a5f16a56e2ef |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,66 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
// FSR2 pass 2 |
|||
// SRV 2 : m_MotionVector : r_motion_vectors |
|||
// SRV 3 : m_depthbuffer : r_depth |
|||
// UAV 7 : FSR2_ReconstructedPrevNearestDepth : rw_ReconstructedPrevNearestDepth |
|||
// UAV 8 : FSR2_DilatedVelocity : rw_dilated_motion_vectors |
|||
// UAV 9 : FSR2_DilatedDepth : rw_dilatedDepth |
|||
// CB 0 : cbFSR2 |
|||
|
|||
#define FSR2_BIND_SRV_MOTION_VECTORS 0 |
|||
#define FSR2_BIND_SRV_DEPTH 1 |
|||
#define FSR2_BIND_UAV_RECONSTRUCTED_PREV_NEAREST_DEPTH 0 |
|||
#define FSR2_BIND_UAV_DILATED_MOTION_VECTORS 1 |
|||
#define FSR2_BIND_UAV_DILATED_DEPTH 2 |
|||
#define FSR2_BIND_CB_FSR2 0 |
|||
|
|||
#include "ffx_fsr2_callbacks_hlsl.h" |
|||
#include "ffx_fsr2_common.h" |
|||
#include "ffx_fsr2_sample.h" |
|||
#include "ffx_fsr2_reconstruct_dilated_velocity_and_previous_depth.h" |
|||
|
|||
#ifndef FFX_FSR2_THREAD_GROUP_WIDTH |
|||
#define FFX_FSR2_THREAD_GROUP_WIDTH 8 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_WIDTH |
|||
#ifndef FFX_FSR2_THREAD_GROUP_HEIGHT |
|||
#define FFX_FSR2_THREAD_GROUP_HEIGHT 8 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_HEIGHT |
|||
#ifndef FFX_FSR2_THREAD_GROUP_DEPTH |
|||
#define FFX_FSR2_THREAD_GROUP_DEPTH 1 |
|||
#endif // #ifndef FFX_FSR2_THREAD_GROUP_DEPTH |
|||
#ifndef FFX_FSR2_NUM_THREADS |
|||
#define FFX_FSR2_NUM_THREADS [numthreads(FFX_FSR2_THREAD_GROUP_WIDTH, FFX_FSR2_THREAD_GROUP_HEIGHT, FFX_FSR2_THREAD_GROUP_DEPTH)] |
|||
#endif // #ifndef FFX_FSR2_NUM_THREADS |
|||
|
|||
FFX_FSR2_PREFER_WAVE64 |
|||
FFX_FSR2_NUM_THREADS |
|||
FFX_FSR2_EMBED_ROOTSIG_CONTENT |
|||
void CS( |
|||
min16int2 iGroupId : SV_GroupID, |
|||
min16int2 iDispatchThreadId : SV_DispatchThreadID, |
|||
min16int2 iGroupThreadId : SV_GroupThreadID, |
|||
int iGroupIndex : SV_GroupIndex |
|||
) |
|||
{ |
|||
ReconstructPrevDepthAndDilateMotionVectors(iDispatchThreadId); |
|||
} |
|||
@ -0,0 +1,7 @@ |
|||
fileFormatVersion: 2 |
|||
guid: bb5d100e3ed07fa46b20687e0b74726c |
|||
ShaderIncludeImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,93 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
#ifndef FFX_FSR2_REPROJECT_H |
|||
#define FFX_FSR2_REPROJECT_H |
|||
|
|||
FFX_MIN16_F4 WrapHistory(FfxInt32x2 iPxSample) |
|||
{ |
|||
return LoadHistory(iPxSample); |
|||
} |
|||
|
|||
DeclareCustomFetchBicubicSamplesMin16(FetchHistorySamples, WrapHistory) |
|||
DeclareCustomTextureSample(HistorySample, Lanczos2, FetchHistorySamples) |
|||
|
|||
|
|||
FFX_MIN16_F4 WrapLockStatus(FfxInt32x2 iPxSample) |
|||
{ |
|||
return FFX_MIN16_F4(LoadLockStatus(FFX_MIN16_I2(iPxSample)), 0); |
|||
} |
|||
|
|||
#if 1 |
|||
DeclareCustomFetchBilinearSamples(FetchLockStatusSamples, WrapLockStatus) |
|||
DeclareCustomTextureSample(LockStatusSample, Bilinear, FetchLockStatusSamples) |
|||
#else |
|||
DeclareCustomFetchBicubicSamplesMin16(FetchLockStatusSamples, WrapLockStatus) |
|||
DeclareCustomTextureSample(LockStatusSample, Lanczos2, FetchLockStatusSamples) |
|||
#endif |
|||
|
|||
|
|||
|
|||
FfxFloat32x2 GetMotionVector(FFX_MIN16_I2 iPxHrPos, FfxFloat32x2 fHrUv) |
|||
{ |
|||
#if FFX_FSR2_OPTION_LOW_RESOLUTION_MOTION_VECTORS |
|||
FfxFloat32x2 fDilatedMotionVector = LoadDilatedMotionVector(FFX_MIN16_I2(fHrUv * RenderSize())); |
|||
#else |
|||
FfxFloat32x2 fDilatedMotionVector = LoadInputMotionVector(iPxHrPos); |
|||
#endif |
|||
|
|||
return fDilatedMotionVector; |
|||
} |
|||
|
|||
void ComputeReprojectedUVs(FfxInt32x2 iPxHrPos, FfxFloat32x2 fMotionVector, FFX_PARAMETER_OUT FfxFloat32x2 fReprojectedHrUv, FFX_PARAMETER_OUT FfxBoolean bIsExistingSample) |
|||
{ |
|||
FfxFloat32x2 fHrUv = (iPxHrPos + 0.5f) / DisplaySize(); |
|||
fReprojectedHrUv = fHrUv + fMotionVector; |
|||
|
|||
bIsExistingSample = (fReprojectedHrUv.x >= 0.0f && fReprojectedHrUv.x <= 1.0f) && |
|||
(fReprojectedHrUv.y >= 0.0f && fReprojectedHrUv.y <= 1.0f); |
|||
} |
|||
|
|||
void ReprojectHistoryColor(FfxInt32x2 iPxHrPos, FfxFloat32x2 fReprojectedHrUv, FFX_PARAMETER_OUT FfxFloat32x4 fHistoryColorAndWeight) |
|||
{ |
|||
fHistoryColorAndWeight = HistorySample(fReprojectedHrUv, DisplaySize()); |
|||
fHistoryColorAndWeight.rgb *= Exposure(); |
|||
|
|||
#if FFX_FSR2_OPTION_HDR_COLOR_INPUT |
|||
fHistoryColorAndWeight.rgb = Tonemap(fHistoryColorAndWeight.rgb); |
|||
#endif |
|||
|
|||
fHistoryColorAndWeight.rgb = RGBToYCoCg(fHistoryColorAndWeight.rgb); |
|||
} |
|||
|
|||
void ReprojectHistoryLockStatus(FfxInt32x2 iPxHrPos, FfxFloat32x2 fReprojectedHrUv, FFX_PARAMETER_OUT LOCK_STATUS_T fReprojectedLockStatus) |
|||
{ |
|||
// If function is called from Accumulate pass, we need to treat locks differently |
|||
LOCK_STATUS_F1 fInPlaceLockLifetime = LoadRwLockStatus(iPxHrPos)[LOCK_LIFETIME_REMAINING]; |
|||
|
|||
fReprojectedLockStatus = SampleLockStatus(fReprojectedHrUv); |
|||
|
|||
// Keep lifetime if new lock |
|||
if (fInPlaceLockLifetime < 0.0f) { |
|||
fReprojectedLockStatus[LOCK_LIFETIME_REMAINING] = fInPlaceLockLifetime; |
|||
} |
|||
} |
|||
#endif //!defined( FFX_FSR2_REPROJECT_H ) |
|||
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 6b8b8387996ecd54aa40df858e3fdcba |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,89 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
#ifndef FFX_FSR2_RESOURCES_H |
|||
#define FFX_FSR2_RESOURCES_H |
|||
|
|||
#if defined(FFX_CPU) || defined(FFX_GPU) |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_NULL 0 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_INPUT_COLOR 1 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_INPUT_MOTION_VECTORS 2 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_INPUT_DEPTH 3 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_INPUT_EXPOSURE 4 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_INPUT_REACTIVE_MASK 5 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_INPUT_TRANSPARENCY_AND_COMPOSITION_MASK 6 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_RECONSTRUCTED_PREVIOUS_NEAREST_DEPTH 7 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_DILATED_MOTION_VECTORS 8 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_DILATED_DEPTH 9 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_INTERNAL_UPSCALED_COLOR 10 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_LOCK_STATUS 11 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_DEPTH_CLIP 12 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_PREPARED_INPUT_COLOR 13 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_LUMA_HISTORY 14 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_DEBUG_OUTPUT 15 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_LANCZOS_LUT 16 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_SPD_ATOMIC_COUNT 17 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_UPSCALED_OUTPUT 18 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_RCAS_INPUT 19 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_LOCK_STATUS_1 20 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_LOCK_STATUS_2 21 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_INTERNAL_UPSCALED_COLOR_1 22 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_INTERNAL_UPSCALED_COLOR_2 23 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_INTERNAL_DEFAULT_REACTIVITY 24 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_INTERNAL_DEFAULT_TRANSPARENCY_AND_COMPOSITION 25 |
|||
#define FFX_FSR2_RESOURCE_IDENTITIER_UPSAMPLE_MAXIMUM_BIAS_LUT 26 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_REACTIVE_MAX 27 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE 28 // same as FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_0 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_0 28 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_1 29 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_2 30 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_3 31 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_4 32 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_5 33 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_6 34 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_7 35 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_8 36 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_9 37 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_10 38 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_11 39 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_12 40 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_INTERNAL_DEFAULT_EXPOSURE 41 |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_EXPOSURE 42 |
|||
|
|||
// Shading change detection mip level setting, value must be in the range [FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_0, FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_12] |
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_SHADING_CHANGE FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_4 |
|||
#define FFX_FSR2_SHADING_CHANGE_MIP_LEVEL (FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE_MIPMAP_SHADING_CHANGE - FFX_FSR2_RESOURCE_IDENTIFIER_AUTO_EXPOSURE) |
|||
|
|||
#define FFX_FSR2_RESOURCE_IDENTIFIER_COUNT 43 |
|||
|
|||
|
|||
#define FFX_FSR2_CONSTANTBUFFER_IDENTIFIER_FSR2 0 |
|||
#define FFX_FSR2_CONSTANTBUFFER_IDENTIFIER_SPD 1 |
|||
#define FFX_FSR2_CONSTANTBUFFER_IDENTIFIER_RCAS 2 |
|||
|
|||
#define FFX_FSR2_AUTOREACTIVEFLAGS_APPLY_TONEMAP 1 |
|||
#define FFX_FSR2_AUTOREACTIVEFLAGS_APPLY_INVERSETONEMAP 2 |
|||
#define FFX_FSR2_AUTOREACTIVEFLAGS_APPLY_THRESHOLD 4 |
|||
#define FFX_FSR2_AUTOREACTIVEFLAGS_USE_COMPONENTS_MAX 8 |
|||
|
|||
#endif // #if defined(FFX_CPU) || defined(FFX_GPU) |
|||
|
|||
#endif //!defined( FFX_FSR2_RESOURCES_H ) |
|||
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: e9b91583116147d44a72720101257539 |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,494 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
#ifndef FFX_FSR2_SAMPLE_H |
|||
#define FFX_FSR2_SAMPLE_H |
|||
|
|||
// suppress warnings |
|||
#ifdef FFX_HLSL |
|||
#pragma warning(disable: 4008) // potentially divide by zero |
|||
#endif //FFX_HLSL |
|||
|
|||
struct FetchedBilinearSamples { |
|||
|
|||
FfxFloat32x4 fColor00; |
|||
FfxFloat32x4 fColor10; |
|||
|
|||
FfxFloat32x4 fColor01; |
|||
FfxFloat32x4 fColor11; |
|||
}; |
|||
|
|||
struct FetchedBicubicSamples { |
|||
|
|||
FfxFloat32x4 fColor00; |
|||
FfxFloat32x4 fColor10; |
|||
FfxFloat32x4 fColor20; |
|||
FfxFloat32x4 fColor30; |
|||
|
|||
FfxFloat32x4 fColor01; |
|||
FfxFloat32x4 fColor11; |
|||
FfxFloat32x4 fColor21; |
|||
FfxFloat32x4 fColor31; |
|||
|
|||
FfxFloat32x4 fColor02; |
|||
FfxFloat32x4 fColor12; |
|||
FfxFloat32x4 fColor22; |
|||
FfxFloat32x4 fColor32; |
|||
|
|||
FfxFloat32x4 fColor03; |
|||
FfxFloat32x4 fColor13; |
|||
FfxFloat32x4 fColor23; |
|||
FfxFloat32x4 fColor33; |
|||
}; |
|||
|
|||
#if FFX_HALF |
|||
struct FetchedBicubicSamplesMin16 { |
|||
|
|||
FfxFloat16x4 fColor00; |
|||
FfxFloat16x4 fColor10; |
|||
FfxFloat16x4 fColor20; |
|||
FfxFloat16x4 fColor30; |
|||
|
|||
FfxFloat16x4 fColor01; |
|||
FfxFloat16x4 fColor11; |
|||
FfxFloat16x4 fColor21; |
|||
FfxFloat16x4 fColor31; |
|||
|
|||
FfxFloat16x4 fColor02; |
|||
FfxFloat16x4 fColor12; |
|||
FfxFloat16x4 fColor22; |
|||
FfxFloat16x4 fColor32; |
|||
|
|||
FfxFloat16x4 fColor03; |
|||
FfxFloat16x4 fColor13; |
|||
FfxFloat16x4 fColor23; |
|||
FfxFloat16x4 fColor33; |
|||
}; |
|||
#else //FFX_HALF |
|||
#define FetchedBicubicSamplesMin16 FetchedBicubicSamples |
|||
#endif //FFX_HALF |
|||
|
|||
FfxFloat32x4 Linear(FfxFloat32x4 A, FfxFloat32x4 B, FfxFloat32 t) |
|||
{ |
|||
return A + (B - A) * t; |
|||
} |
|||
|
|||
FfxFloat32x4 Bilinear(FetchedBilinearSamples BilinearSamples, FfxFloat32x2 fPxFrac) |
|||
{ |
|||
FfxFloat32x4 fColorX0 = Linear(BilinearSamples.fColor00, BilinearSamples.fColor10, fPxFrac.x); |
|||
FfxFloat32x4 fColorX1 = Linear(BilinearSamples.fColor01, BilinearSamples.fColor11, fPxFrac.x); |
|||
FfxFloat32x4 fColorXY = Linear(fColorX0, fColorX1, fPxFrac.y); |
|||
return fColorXY; |
|||
} |
|||
|
|||
// SEE: ../Interpolation/CatmullRom.ipynb, t=0 -> B, t=1 -> C |
|||
FfxFloat32x4 CubicCatmullRom(FfxFloat32x4 A, FfxFloat32x4 B, FfxFloat32x4 C, FfxFloat32x4 D, FfxFloat32 t) |
|||
{ |
|||
FfxFloat32 t2 = t * t; |
|||
FfxFloat32 t3 = t * t * t; |
|||
FfxFloat32x4 a = -A / 2.f + (3.f * B) / 2.f - (3.f * C) / 2.f + D / 2.f; |
|||
FfxFloat32x4 b = A - (5.f * B) / 2.f + 2.f * C - D / 2.f; |
|||
FfxFloat32x4 c = -A / 2.f + C / 2.f; |
|||
FfxFloat32x4 d = B; |
|||
return a * t3 + b * t2 + c * t + d; |
|||
} |
|||
|
|||
FfxFloat32x4 BicubicCatmullRom(FetchedBicubicSamples BicubicSamples, FfxFloat32x2 fPxFrac) |
|||
{ |
|||
FfxFloat32x4 fColorX0 = CubicCatmullRom(BicubicSamples.fColor00, BicubicSamples.fColor10, BicubicSamples.fColor20, BicubicSamples.fColor30, fPxFrac.x); |
|||
FfxFloat32x4 fColorX1 = CubicCatmullRom(BicubicSamples.fColor01, BicubicSamples.fColor11, BicubicSamples.fColor21, BicubicSamples.fColor31, fPxFrac.x); |
|||
FfxFloat32x4 fColorX2 = CubicCatmullRom(BicubicSamples.fColor02, BicubicSamples.fColor12, BicubicSamples.fColor22, BicubicSamples.fColor32, fPxFrac.x); |
|||
FfxFloat32x4 fColorX3 = CubicCatmullRom(BicubicSamples.fColor03, BicubicSamples.fColor13, BicubicSamples.fColor23, BicubicSamples.fColor33, fPxFrac.x); |
|||
FfxFloat32x4 fColorXY = CubicCatmullRom(fColorX0, fColorX1, fColorX2, fColorX3, fPxFrac.y); |
|||
return fColorXY; |
|||
} |
|||
|
|||
FfxFloat32 Lanczos2(FfxFloat32 x) |
|||
{ |
|||
const FfxFloat32 PI = 3.141592653589793f; // TODO: share SDK constants |
|||
return abs(x) < FSR2_EPSILON ? 1.f : (sin(PI * x) / (PI * x)) * (sin(0.5f * PI * x) / (0.5f * PI * x)); |
|||
} |
|||
|
|||
#if FFX_HALF |
|||
FfxFloat16 Lanczos2(FfxFloat16 x) |
|||
{ |
|||
const FFX_MIN16_F PI = FfxFloat16(3.141592653589793f); // TODO: share SDK constants |
|||
return abs(x) < FSR2_EPSILON ? FfxFloat16(1.f) : (sin(PI * x) / (PI * x)) * (sin(FfxFloat16(0.5f) * PI * x) / (FfxFloat16(0.5f) * PI * x)); |
|||
} |
|||
#endif //FFX_HALF |
|||
|
|||
// FSR1 lanczos approximation. Input is x*x and must be <= 4. |
|||
FfxFloat32 Lanczos2ApproxSqNoClamp(FfxFloat32 x2) |
|||
{ |
|||
FfxFloat32 a = (2.0f / 5.0f) * x2 - 1; |
|||
FfxFloat32 b = (1.0f / 4.0f) * x2 - 1; |
|||
return ((25.0f / 16.0f) * a * a - (25.0f / 16.0f - 1)) * (b * b); |
|||
} |
|||
|
|||
#if FFX_HALF |
|||
FfxFloat16 Lanczos2ApproxSqNoClamp(FfxFloat16 x2) |
|||
{ |
|||
FfxFloat16 a = FfxFloat16(2.0f / 5.0f) * x2 - FfxFloat16(1); |
|||
FfxFloat16 b = FfxFloat16(1.0f / 4.0f) * x2 - FfxFloat16(1); |
|||
return (FfxFloat16(25.0f / 16.0f) * a * a - FfxFloat16(25.0f / 16.0f - 1)) * (b * b); |
|||
} |
|||
#endif //FFX_HALF |
|||
|
|||
FfxFloat32 Lanczos2ApproxSq(FfxFloat32 x2) |
|||
{ |
|||
x2 = ffxMin(x2, 4.0f); |
|||
return Lanczos2ApproxSqNoClamp(x2); |
|||
} |
|||
|
|||
#if FFX_HALF |
|||
FfxFloat16 Lanczos2ApproxSq(FfxFloat16 x2) |
|||
{ |
|||
x2 = ffxMin(x2, FfxFloat16(4.0f)); |
|||
return Lanczos2ApproxSqNoClamp(x2); |
|||
} |
|||
#endif //FFX_HALF |
|||
|
|||
FfxFloat32 Lanczos2ApproxNoClamp(FfxFloat32 x) |
|||
{ |
|||
return Lanczos2ApproxSqNoClamp(x * x); |
|||
} |
|||
|
|||
#if FFX_HALF |
|||
FfxFloat16 Lanczos2ApproxNoClamp(FfxFloat16 x) |
|||
{ |
|||
return Lanczos2ApproxSqNoClamp(x * x); |
|||
} |
|||
#endif //FFX_HALF |
|||
|
|||
FfxFloat32 Lanczos2Approx(FfxFloat32 x) |
|||
{ |
|||
return Lanczos2ApproxSq(x * x); |
|||
} |
|||
|
|||
#if FFX_HALF |
|||
FfxFloat16 Lanczos2Approx(FfxFloat16 x) |
|||
{ |
|||
return Lanczos2ApproxSq(x * x); |
|||
} |
|||
#endif //FFX_HALF |
|||
|
|||
FfxFloat32 Lanczos2_UseLUT(FfxFloat32 x) |
|||
{ |
|||
return SampleLanczos2Weight(abs(x)); |
|||
} |
|||
|
|||
#if FFX_HALF |
|||
FfxFloat16 Lanczos2_UseLUT(FfxFloat16 x) |
|||
{ |
|||
return SampleLanczos2Weight(abs(x)); |
|||
} |
|||
#endif //FFX_HALF |
|||
|
|||
#if FFX_FSR2_OPTION_USE_LANCZOS_LUT |
|||
FfxFloat32x4 Lanczos2_AllowLUT(FfxFloat32x4 fColor0, FfxFloat32x4 fColor1, FfxFloat32x4 fColor2, FfxFloat32x4 fColor3, FfxFloat32 t) |
|||
{ |
|||
FfxFloat32 fWeight0 = Lanczos2_UseLUT(-1.f - t); |
|||
FfxFloat32 fWeight1 = Lanczos2_UseLUT(-0.f - t); |
|||
FfxFloat32 fWeight2 = Lanczos2_UseLUT(+1.f - t); |
|||
FfxFloat32 fWeight3 = Lanczos2_UseLUT(+2.f - t); |
|||
return (fWeight0 * fColor0 + fWeight1 * fColor1 + fWeight2 * fColor2 + fWeight3 * fColor3) / (fWeight0 + fWeight1 + fWeight2 + fWeight3); |
|||
} |
|||
#if FFX_HALF |
|||
FfxFloat16x4 Lanczos2_AllowLUT(FfxFloat16x4 fColor0, FfxFloat16x4 fColor1, FfxFloat16x4 fColor2, FfxFloat16x4 fColor3, FfxFloat16 t) |
|||
{ |
|||
FfxFloat16 fWeight0 = Lanczos2_UseLUT(FfxFloat16(-1.f) - t); |
|||
FfxFloat16 fWeight1 = Lanczos2_UseLUT(FfxFloat16(-0.f) - t); |
|||
FfxFloat16 fWeight2 = Lanczos2_UseLUT(FfxFloat16(+1.f) - t); |
|||
FfxFloat16 fWeight3 = Lanczos2_UseLUT(FfxFloat16(+2.f) - t); |
|||
return (fWeight0 * fColor0 + fWeight1 * fColor1 + fWeight2 * fColor2 + fWeight3 * fColor3) / (fWeight0 + fWeight1 + fWeight2 + fWeight3); |
|||
} |
|||
#endif //FFX_HALF |
|||
#else //FFX_FSR2_OPTION_USE_LANCZOS_LUT |
|||
#define Lanczos2_AllowLUT Lanczos2 |
|||
#endif //FFX_FSR2_OPTION_USE_LANCZOS_LUT |
|||
|
|||
FfxFloat32x4 Lanczos2(FfxFloat32x4 fColor0, FfxFloat32x4 fColor1, FfxFloat32x4 fColor2, FfxFloat32x4 fColor3, FfxFloat32 t) |
|||
{ |
|||
FfxFloat32 fWeight0 = Lanczos2(-1.f - t); |
|||
FfxFloat32 fWeight1 = Lanczos2(-0.f - t); |
|||
FfxFloat32 fWeight2 = Lanczos2(+1.f - t); |
|||
FfxFloat32 fWeight3 = Lanczos2(+2.f - t); |
|||
return (fWeight0 * fColor0 + fWeight1 * fColor1 + fWeight2 * fColor2 + fWeight3 * fColor3) / (fWeight0 + fWeight1 + fWeight2 + fWeight3); |
|||
} |
|||
|
|||
FfxFloat32x4 Lanczos2(FetchedBicubicSamples Samples, FfxFloat32x2 fPxFrac) |
|||
{ |
|||
FfxFloat32x4 fColorX0 = Lanczos2_AllowLUT(Samples.fColor00, Samples.fColor10, Samples.fColor20, Samples.fColor30, fPxFrac.x); |
|||
FfxFloat32x4 fColorX1 = Lanczos2_AllowLUT(Samples.fColor01, Samples.fColor11, Samples.fColor21, Samples.fColor31, fPxFrac.x); |
|||
FfxFloat32x4 fColorX2 = Lanczos2_AllowLUT(Samples.fColor02, Samples.fColor12, Samples.fColor22, Samples.fColor32, fPxFrac.x); |
|||
FfxFloat32x4 fColorX3 = Lanczos2_AllowLUT(Samples.fColor03, Samples.fColor13, Samples.fColor23, Samples.fColor33, fPxFrac.x); |
|||
FfxFloat32x4 fColorXY = Lanczos2_AllowLUT(fColorX0, fColorX1, fColorX2, fColorX3, fPxFrac.y); |
|||
|
|||
// Deringing |
|||
|
|||
// TODO: only use 4 by checking jitter |
|||
const FfxInt32 iDeringingSampleCount = 4; |
|||
const FfxFloat32x4 fDeringingSamples[4] = { |
|||
Samples.fColor11, |
|||
Samples.fColor21, |
|||
Samples.fColor12, |
|||
Samples.fColor22, |
|||
}; |
|||
|
|||
FfxFloat32x4 fDeringingMin = fDeringingSamples[0]; |
|||
FfxFloat32x4 fDeringingMax = fDeringingSamples[0]; |
|||
|
|||
FFX_UNROLL |
|||
for (FfxInt32 iSampleIndex = 1; iSampleIndex < iDeringingSampleCount; ++iSampleIndex) { |
|||
|
|||
fDeringingMin = ffxMin(fDeringingMin, fDeringingSamples[iSampleIndex]); |
|||
fDeringingMax = ffxMax(fDeringingMax, fDeringingSamples[iSampleIndex]); |
|||
} |
|||
|
|||
fColorXY = clamp(fColorXY, fDeringingMin, fDeringingMax); |
|||
|
|||
return fColorXY; |
|||
} |
|||
|
|||
#if FFX_HALF |
|||
FfxFloat16x4 Lanczos2(FfxFloat16x4 fColor0, FfxFloat16x4 fColor1, FfxFloat16x4 fColor2, FfxFloat16x4 fColor3, FfxFloat16 t) |
|||
{ |
|||
FfxFloat16 fWeight0 = Lanczos2(FfxFloat16(-1.f) - t); |
|||
FfxFloat16 fWeight1 = Lanczos2(FfxFloat16(-0.f) - t); |
|||
FfxFloat16 fWeight2 = Lanczos2(FfxFloat16(+1.f) - t); |
|||
FfxFloat16 fWeight3 = Lanczos2(FfxFloat16(+2.f) - t); |
|||
return (fWeight0 * fColor0 + fWeight1 * fColor1 + fWeight2 * fColor2 + fWeight3 * fColor3) / (fWeight0 + fWeight1 + fWeight2 + fWeight3); |
|||
} |
|||
|
|||
FfxFloat16x4 Lanczos2(FetchedBicubicSamplesMin16 Samples, FFX_MIN16_F2 fPxFrac) |
|||
{ |
|||
FfxFloat16x4 fColorX0 = Lanczos2_AllowLUT(Samples.fColor00, Samples.fColor10, Samples.fColor20, Samples.fColor30, fPxFrac.x); |
|||
FfxFloat16x4 fColorX1 = Lanczos2_AllowLUT(Samples.fColor01, Samples.fColor11, Samples.fColor21, Samples.fColor31, fPxFrac.x); |
|||
FfxFloat16x4 fColorX2 = Lanczos2_AllowLUT(Samples.fColor02, Samples.fColor12, Samples.fColor22, Samples.fColor32, fPxFrac.x); |
|||
FfxFloat16x4 fColorX3 = Lanczos2_AllowLUT(Samples.fColor03, Samples.fColor13, Samples.fColor23, Samples.fColor33, fPxFrac.x); |
|||
FfxFloat16x4 fColorXY = Lanczos2_AllowLUT(fColorX0, fColorX1, fColorX2, fColorX3, fPxFrac.y); |
|||
|
|||
// Deringing |
|||
|
|||
// TODO: only use 4 by checking jitter |
|||
const FfxInt32 iDeringingSampleCount = 4; |
|||
const FfxFloat16x4 fDeringingSamples[4] = { |
|||
Samples.fColor11, |
|||
Samples.fColor21, |
|||
Samples.fColor12, |
|||
Samples.fColor22, |
|||
}; |
|||
|
|||
FfxFloat16x4 fDeringingMin = fDeringingSamples[0]; |
|||
FfxFloat16x4 fDeringingMax = fDeringingSamples[0]; |
|||
|
|||
FFX_UNROLL |
|||
for (FfxInt32 iSampleIndex = 1; iSampleIndex < iDeringingSampleCount; ++iSampleIndex) |
|||
{ |
|||
fDeringingMin = ffxMin(fDeringingMin, fDeringingSamples[iSampleIndex]); |
|||
fDeringingMax = ffxMax(fDeringingMax, fDeringingSamples[iSampleIndex]); |
|||
} |
|||
|
|||
fColorXY = clamp(fColorXY, fDeringingMin, fDeringingMax); |
|||
|
|||
return fColorXY; |
|||
} |
|||
#endif //FFX_HALF |
|||
|
|||
FfxFloat32x4 Lanczos2Approx(FfxFloat32x4 fColor0, FfxFloat32x4 fColor1, FfxFloat32x4 fColor2, FfxFloat32x4 fColor3, FfxFloat32 t) |
|||
{ |
|||
FfxFloat32 fWeight0 = Lanczos2ApproxNoClamp(-1.f - t); |
|||
FfxFloat32 fWeight1 = Lanczos2ApproxNoClamp(-0.f - t); |
|||
FfxFloat32 fWeight2 = Lanczos2ApproxNoClamp(+1.f - t); |
|||
FfxFloat32 fWeight3 = Lanczos2ApproxNoClamp(+2.f - t); |
|||
return (fWeight0 * fColor0 + fWeight1 * fColor1 + fWeight2 * fColor2 + fWeight3 * fColor3) / (fWeight0 + fWeight1 + fWeight2 + fWeight3); |
|||
} |
|||
|
|||
#if FFX_HALF |
|||
FfxFloat16x4 Lanczos2Approx(FfxFloat16x4 fColor0, FfxFloat16x4 fColor1, FfxFloat16x4 fColor2, FfxFloat16x4 fColor3, FfxFloat16 t) |
|||
{ |
|||
FfxFloat16 fWeight0 = Lanczos2ApproxNoClamp(FfxFloat16(-1.f) - t); |
|||
FfxFloat16 fWeight1 = Lanczos2ApproxNoClamp(FfxFloat16(-0.f) - t); |
|||
FfxFloat16 fWeight2 = Lanczos2ApproxNoClamp(FfxFloat16(+1.f) - t); |
|||
FfxFloat16 fWeight3 = Lanczos2ApproxNoClamp(FfxFloat16(+2.f) - t); |
|||
return (fWeight0 * fColor0 + fWeight1 * fColor1 + fWeight2 * fColor2 + fWeight3 * fColor3) / (fWeight0 + fWeight1 + fWeight2 + fWeight3); |
|||
} |
|||
#endif //FFX_HALF |
|||
|
|||
FfxFloat32x4 Lanczos2Approx(FetchedBicubicSamples Samples, FfxFloat32x2 fPxFrac) |
|||
{ |
|||
FfxFloat32x4 fColorX0 = Lanczos2Approx(Samples.fColor00, Samples.fColor10, Samples.fColor20, Samples.fColor30, fPxFrac.x); |
|||
FfxFloat32x4 fColorX1 = Lanczos2Approx(Samples.fColor01, Samples.fColor11, Samples.fColor21, Samples.fColor31, fPxFrac.x); |
|||
FfxFloat32x4 fColorX2 = Lanczos2Approx(Samples.fColor02, Samples.fColor12, Samples.fColor22, Samples.fColor32, fPxFrac.x); |
|||
FfxFloat32x4 fColorX3 = Lanczos2Approx(Samples.fColor03, Samples.fColor13, Samples.fColor23, Samples.fColor33, fPxFrac.x); |
|||
FfxFloat32x4 fColorXY = Lanczos2Approx(fColorX0, fColorX1, fColorX2, fColorX3, fPxFrac.y); |
|||
|
|||
// Deringing |
|||
|
|||
// TODO: only use 4 by checking jitter |
|||
const FfxInt32 iDeringingSampleCount = 4; |
|||
const FfxFloat32x4 fDeringingSamples[4] = { |
|||
Samples.fColor11, |
|||
Samples.fColor21, |
|||
Samples.fColor12, |
|||
Samples.fColor22, |
|||
}; |
|||
|
|||
FfxFloat32x4 fDeringingMin = fDeringingSamples[0]; |
|||
FfxFloat32x4 fDeringingMax = fDeringingSamples[0]; |
|||
|
|||
FFX_UNROLL |
|||
for (FfxInt32 iSampleIndex = 1; iSampleIndex < iDeringingSampleCount; ++iSampleIndex) |
|||
{ |
|||
fDeringingMin = ffxMin(fDeringingMin, fDeringingSamples[iSampleIndex]); |
|||
fDeringingMax = ffxMax(fDeringingMax, fDeringingSamples[iSampleIndex]); |
|||
} |
|||
|
|||
fColorXY = clamp(fColorXY, fDeringingMin, fDeringingMax); |
|||
|
|||
return fColorXY; |
|||
} |
|||
|
|||
#if FFX_HALF |
|||
FfxFloat16x4 Lanczos2Approx(FetchedBicubicSamplesMin16 Samples, FfxFloat16x2 fPxFrac) |
|||
{ |
|||
FfxFloat16x4 fColorX0 = Lanczos2Approx(Samples.fColor00, Samples.fColor10, Samples.fColor20, Samples.fColor30, fPxFrac.x); |
|||
FfxFloat16x4 fColorX1 = Lanczos2Approx(Samples.fColor01, Samples.fColor11, Samples.fColor21, Samples.fColor31, fPxFrac.x); |
|||
FfxFloat16x4 fColorX2 = Lanczos2Approx(Samples.fColor02, Samples.fColor12, Samples.fColor22, Samples.fColor32, fPxFrac.x); |
|||
FfxFloat16x4 fColorX3 = Lanczos2Approx(Samples.fColor03, Samples.fColor13, Samples.fColor23, Samples.fColor33, fPxFrac.x); |
|||
FfxFloat16x4 fColorXY = Lanczos2Approx(fColorX0, fColorX1, fColorX2, fColorX3, fPxFrac.y); |
|||
|
|||
// Deringing |
|||
|
|||
// TODO: only use 4 by checking jitter |
|||
const FfxInt32 iDeringingSampleCount = 4; |
|||
const FfxFloat16x4 fDeringingSamples[4] = { |
|||
Samples.fColor11, |
|||
Samples.fColor21, |
|||
Samples.fColor12, |
|||
Samples.fColor22, |
|||
}; |
|||
|
|||
FfxFloat16x4 fDeringingMin = fDeringingSamples[0]; |
|||
FfxFloat16x4 fDeringingMax = fDeringingSamples[0]; |
|||
|
|||
FFX_UNROLL |
|||
for (FfxInt32 iSampleIndex = 1; iSampleIndex < iDeringingSampleCount; ++iSampleIndex) |
|||
{ |
|||
fDeringingMin = ffxMin(fDeringingMin, fDeringingSamples[iSampleIndex]); |
|||
fDeringingMax = ffxMax(fDeringingMax, fDeringingSamples[iSampleIndex]); |
|||
} |
|||
|
|||
fColorXY = clamp(fColorXY, fDeringingMin, fDeringingMax); |
|||
|
|||
return fColorXY; |
|||
} |
|||
|
|||
// Clamp by offset direction. Assuming iPxSample is already in range and iPxOffset is compile time constant. |
|||
FfxInt16x2 ClampLoadBicubic(FfxInt16x2 iPxSample, FfxInt16x2 iPxOffset, FfxInt16x2 iTextureSize) |
|||
{ |
|||
FfxInt16x2 result = iPxSample + iPxOffset; |
|||
result.x = (iPxOffset.x <= 0) ? ffxMax(result.x, FfxInt16(0)) : result.x; |
|||
result.x = (iPxOffset.x > 0) ? ffxMin(result.x, iTextureSize.x - FfxInt16(1)) : result.x; |
|||
result.y = (iPxOffset.y <= 0) ? ffxMax(result.y, FfxInt16(0)) : result.y; |
|||
result.y = (iPxOffset.y > 0) ? ffxMin(result.y, iTextureSize.y - FfxInt16(1)) : result.y; |
|||
return result; |
|||
} |
|||
#endif //FFX_HALF |
|||
|
|||
FfxInt32x2 ClampLoadBicubic(FfxInt32x2 iPxSample, FfxInt32x2 iPxOffset, FfxInt32x2 iTextureSize) |
|||
{ |
|||
FfxInt32x2 result = iPxSample + iPxOffset; |
|||
result.x = (iPxOffset.x <= 0) ? ffxMax(result.x, 0) : result.x; |
|||
result.x = (iPxOffset.x > 0) ? ffxMin(result.x, iTextureSize.x - 1) : result.x; |
|||
result.y = (iPxOffset.y <= 0) ? ffxMax(result.y, 0) : result.y; |
|||
result.y = (iPxOffset.y > 0) ? ffxMin(result.y, iTextureSize.y - 1) : result.y; |
|||
return result; |
|||
} |
|||
|
|||
#define DeclareCustomFetchBicubicSamplesWithType(SampleType, AddrType, Name, LoadTexture) \ |
|||
SampleType Name(AddrType iPxSample, AddrType iTextureSize) \ |
|||
{ \ |
|||
SampleType Samples; \ |
|||
\ |
|||
Samples.fColor00 = LoadTexture(ClampLoadBicubic(iPxSample, AddrType(-1, -1), iTextureSize)); \ |
|||
Samples.fColor10 = LoadTexture(ClampLoadBicubic(iPxSample, AddrType(+0, -1), iTextureSize)); \ |
|||
Samples.fColor20 = LoadTexture(ClampLoadBicubic(iPxSample, AddrType(+1, -1), iTextureSize)); \ |
|||
Samples.fColor30 = LoadTexture(ClampLoadBicubic(iPxSample, AddrType(+2, -1), iTextureSize)); \ |
|||
\ |
|||
Samples.fColor01 = LoadTexture(ClampLoadBicubic(iPxSample, AddrType(-1, +0), iTextureSize)); \ |
|||
Samples.fColor11 = LoadTexture(ClampLoadBicubic(iPxSample, AddrType(+0, +0), iTextureSize)); \ |
|||
Samples.fColor21 = LoadTexture(ClampLoadBicubic(iPxSample, AddrType(+1, +0), iTextureSize)); \ |
|||
Samples.fColor31 = LoadTexture(ClampLoadBicubic(iPxSample, AddrType(+2, +0), iTextureSize)); \ |
|||
\ |
|||
Samples.fColor02 = LoadTexture(ClampLoadBicubic(iPxSample, AddrType(-1, +1), iTextureSize)); \ |
|||
Samples.fColor12 = LoadTexture(ClampLoadBicubic(iPxSample, AddrType(+0, +1), iTextureSize)); \ |
|||
Samples.fColor22 = LoadTexture(ClampLoadBicubic(iPxSample, AddrType(+1, +1), iTextureSize)); \ |
|||
Samples.fColor32 = LoadTexture(ClampLoadBicubic(iPxSample, AddrType(+2, +1), iTextureSize)); \ |
|||
\ |
|||
Samples.fColor03 = LoadTexture(ClampLoadBicubic(iPxSample, AddrType(-1, +2), iTextureSize)); \ |
|||
Samples.fColor13 = LoadTexture(ClampLoadBicubic(iPxSample, AddrType(+0, +2), iTextureSize)); \ |
|||
Samples.fColor23 = LoadTexture(ClampLoadBicubic(iPxSample, AddrType(+1, +2), iTextureSize)); \ |
|||
Samples.fColor33 = LoadTexture(ClampLoadBicubic(iPxSample, AddrType(+2, +2), iTextureSize)); \ |
|||
\ |
|||
return Samples; \ |
|||
} |
|||
|
|||
#define DeclareCustomFetchBicubicSamples(Name, LoadTexture) \ |
|||
DeclareCustomFetchBicubicSamplesWithType(FetchedBicubicSamples, FfxInt32x2, Name, LoadTexture) |
|||
|
|||
#define DeclareCustomFetchBicubicSamplesMin16(Name, LoadTexture) \ |
|||
DeclareCustomFetchBicubicSamplesWithType(FetchedBicubicSamplesMin16, FFX_MIN16_I2, Name, LoadTexture) |
|||
|
|||
#define DeclareCustomFetchBilinearSamples(Name, LoadTexture) \ |
|||
FetchedBilinearSamples Name(FFX_MIN16_I2 iPxSample, FFX_MIN16_I2 iTextureSize) \ |
|||
{ \ |
|||
FetchedBilinearSamples Samples; \ |
|||
Samples.fColor00 = LoadTexture(ClampLoad(iPxSample, FFX_MIN16_I2(+0, +0), iTextureSize)); \ |
|||
Samples.fColor10 = LoadTexture(ClampLoad(iPxSample, FFX_MIN16_I2(+1, +0), iTextureSize)); \ |
|||
Samples.fColor01 = LoadTexture(ClampLoad(iPxSample, FFX_MIN16_I2(+0, +1), iTextureSize)); \ |
|||
Samples.fColor11 = LoadTexture(ClampLoad(iPxSample, FFX_MIN16_I2(+1, +1), iTextureSize)); \ |
|||
return Samples; \ |
|||
} |
|||
|
|||
// BE CAREFUL: there is some precision issues and (3253, 125) leading to (3252.9989778, 125.001102) |
|||
// is common, so iPxSample can "jitter" |
|||
#define DeclareCustomTextureSample(Name, InterpolateSamples, FetchSamples) \ |
|||
FfxFloat32x4 Name(FfxFloat32x2 fUvSample, FfxInt32x2 iTextureSize) \ |
|||
{ \ |
|||
FfxFloat32x2 fPxSample = fUvSample * FfxFloat32x2(iTextureSize) - FFX_BROADCAST_FLOAT32X2(0.5f); \ |
|||
FfxInt32x2 iPxSample = FfxInt32x2(floor(fPxSample)); \ |
|||
FfxFloat32x2 fPxFrac = ffxFract(fPxSample); \ |
|||
FfxFloat32x4 fColorXY = FfxFloat32x4(InterpolateSamples(FetchSamples(FFX_MIN16_I2(iPxSample), FFX_MIN16_I2(iTextureSize)), FFX_MIN16_F2(fPxFrac))); \ |
|||
return fColorXY; \ |
|||
} |
|||
|
|||
#define DeclareCustomTextureSampleMin16(Name, InterpolateSamples, FetchSamples) \ |
|||
FfxFloat32x4 Name(FfxFloat32x2 fUvSample, FfxInt32x2 iTextureSize) \ |
|||
{ \ |
|||
FfxFloat32x2 fPxSample = fUvSample * FfxFloat32x2(iTextureSize) - FFX_BROADCAST_FLOAT32X2(0.5f); \ |
|||
FfxInt32x2 iPxSample = FfxInt32x2(floor(fPxSample)); \ |
|||
FfxFloat32x2 fPxFrac = ffxFract(fPxSample); \ |
|||
FfxFloat32x4 fColorXY = FfxFloat32x4(InterpolateSamples(FetchSamples(FFX_MIN16_I2(iPxSample), FFX_MIN16_I2(iTextureSize)), FFX_MIN16_F2(fPxFrac))); \ |
|||
return fColorXY; \ |
|||
} |
|||
|
|||
#endif //!defined( FFX_FSR2_SAMPLE_H ) |
|||
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 8a15223de39afee47b1c5106dc7fba63 |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,148 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
#ifndef FFX_FSR2_UPSAMPLE_H |
|||
#define FFX_FSR2_UPSAMPLE_H |
|||
|
|||
FfxFloat32 SmoothStep(FfxFloat32 x, FfxFloat32 a, FfxFloat32 b) |
|||
{ |
|||
x = clamp((x - a) / (b - a), 0.f, 1.f); |
|||
return x * x * (3.f - 2.f * x); |
|||
} |
|||
|
|||
FFX_STATIC const FfxUInt32 iLanczos2SampleCount = 16; |
|||
|
|||
void DeringingWithMinMax(UPSAMPLE_F3 fDeringingMin, UPSAMPLE_F3 fDeringingMax, FFX_PARAMETER_INOUT UPSAMPLE_F3 fColor, FFX_PARAMETER_OUT FfxFloat32 fRangeSimilarity) |
|||
{ |
|||
fRangeSimilarity = fDeringingMin.x / fDeringingMax.x; |
|||
fColor = clamp(fColor, fDeringingMin, fDeringingMax); |
|||
} |
|||
|
|||
void Deringing(RectificationBoxData clippingBox, FFX_PARAMETER_INOUT UPSAMPLE_F3 fColor) |
|||
{ |
|||
fColor = clamp(fColor, clippingBox.aabbMin, clippingBox.aabbMax); |
|||
} |
|||
|
|||
UPSAMPLE_F GetUpsampleLanczosWeight(UPSAMPLE_F2 fSrcSampleOffset, UPSAMPLE_F2 fKernelWeight) |
|||
{ |
|||
UPSAMPLE_F2 fSrcSampleOffsetBiased = UPSAMPLE_F2(fSrcSampleOffset * fKernelWeight); |
|||
UPSAMPLE_F fSampleWeight = Lanczos2ApproxSq(dot(fSrcSampleOffsetBiased, fSrcSampleOffsetBiased)); // TODO: check other distances (l0, l1, linf...) |
|||
|
|||
return fSampleWeight; |
|||
} |
|||
|
|||
UPSAMPLE_F Pow3(UPSAMPLE_F x) |
|||
{ |
|||
return x * x * x; |
|||
} |
|||
|
|||
UPSAMPLE_F4 ComputeUpsampledColorAndWeight(FFX_MIN16_I2 iPxHrPos, UPSAMPLE_F2 fKernelWeight, FFX_PARAMETER_INOUT RectificationBoxData clippingBox) |
|||
{ |
|||
// We compute a sliced lanczos filter with 2 lobes (other slices are accumulated temporaly) |
|||
FfxFloat32x2 fDstOutputPos = FfxFloat32x2(iPxHrPos) + FFX_BROADCAST_FLOAT32X2(0.5f); // Destination resolution output pixel center position |
|||
FfxFloat32x2 fSrcOutputPos = fDstOutputPos * DownscaleFactor(); // Source resolution output pixel center position |
|||
FfxInt32x2 iSrcInputPos = FfxInt32x2(floor(fSrcOutputPos)); // TODO: what about weird upscale factors... |
|||
|
|||
UPSAMPLE_F3 fSamples[iLanczos2SampleCount]; |
|||
|
|||
FfxFloat32x2 fSrcUnjitteredPos = (FfxFloat32x2(iSrcInputPos) + FFX_BROADCAST_FLOAT32X2(0.5f)) - Jitter(); // This is the un-jittered position of the sample at offset 0,0 |
|||
|
|||
UPSAMPLE_I2 offsetTL; |
|||
offsetTL.x = (fSrcUnjitteredPos.x > fSrcOutputPos.x) ? UPSAMPLE_I(-2) : UPSAMPLE_I(-1); |
|||
offsetTL.y = (fSrcUnjitteredPos.y > fSrcOutputPos.y) ? UPSAMPLE_I(-2) : UPSAMPLE_I(-1); |
|||
|
|||
RectificationBox fRectificationBox; |
|||
|
|||
//Load samples |
|||
// If fSrcUnjitteredPos.y > fSrcOutputPos.y, indicates offsetTL.y = -2, sample offset Y will be [-2, 1], clipbox will be rows [1, 3]. |
|||
// Flip row# for sampling offset in this case, so first 0~2 rows in the sampled array can always be used for computing the clipbox. |
|||
// This reduces branch or cmove on sampled colors, but moving this overhead to sample position / weight calculation time which apply to less values. |
|||
const FfxBoolean bFlipRow = fSrcUnjitteredPos.y > fSrcOutputPos.y; |
|||
const FfxBoolean bFlipCol = fSrcUnjitteredPos.x > fSrcOutputPos.x; |
|||
|
|||
UPSAMPLE_F2 fOffsetTL = UPSAMPLE_F2(offsetTL); |
|||
|
|||
FFX_UNROLL |
|||
for (FfxInt32 row = 0; row < 4; row++) { |
|||
|
|||
FFX_UNROLL |
|||
for (FfxInt32 col = 0; col < 4; col++) { |
|||
FfxInt32 iSampleIndex = col + (row << 2); |
|||
|
|||
FfxInt32x2 sampleColRow = FfxInt32x2(bFlipCol ? (3 - col) : col, bFlipRow ? (3 - row) : row); |
|||
FfxInt32x2 iSrcSamplePos = FfxInt32x2(iSrcInputPos) + offsetTL + sampleColRow; |
|||
|
|||
const FfxInt32x2 sampleCoord = ClampLoad(iSrcSamplePos, FfxInt32x2(0, 0), FfxInt32x2(RenderSize())); |
|||
|
|||
fSamples[iSampleIndex] = LoadPreparedInputColor(FFX_MIN16_I2(sampleCoord)); |
|||
} |
|||
} |
|||
|
|||
RectificationBoxReset(fRectificationBox, fSamples[0]); |
|||
|
|||
UPSAMPLE_F3 fColor = UPSAMPLE_F3(0.f, 0.f, 0.f); |
|||
UPSAMPLE_F fWeight = UPSAMPLE_F(0.f); |
|||
UPSAMPLE_F2 fBaseSampleOffset = UPSAMPLE_F2(fSrcUnjitteredPos - fSrcOutputPos); |
|||
|
|||
FFX_UNROLL |
|||
for (FfxUInt32 iSampleIndex = 0; iSampleIndex < iLanczos2SampleCount; ++iSampleIndex) |
|||
{ |
|||
FfxInt32 row = FfxInt32(iSampleIndex >> 2); |
|||
FfxInt32 col = FfxInt32(iSampleIndex & 3); |
|||
|
|||
const FfxInt32x2 sampleColRow = FfxInt32x2(bFlipCol ? (3 - col) : col, bFlipRow ? (3 - row) : row); |
|||
const UPSAMPLE_F2 fOffset = fOffsetTL + UPSAMPLE_F2(sampleColRow); |
|||
UPSAMPLE_F2 fSrcSampleOffset = fBaseSampleOffset + fOffset; |
|||
|
|||
FfxInt32x2 iSrcSamplePos = FfxInt32x2(iSrcInputPos) + FfxInt32x2(offsetTL) + sampleColRow; |
|||
|
|||
UPSAMPLE_F fSampleWeight = UPSAMPLE_F(IsOnScreen(FFX_MIN16_I2(iSrcSamplePos), FFX_MIN16_I2(RenderSize()))) * GetUpsampleLanczosWeight(fSrcSampleOffset, fKernelWeight); |
|||
|
|||
// Update rectification box |
|||
if(all(FFX_LESS_THAN(FfxInt32x2(col, row), FFX_BROADCAST_INT32X2(3)))) |
|||
{ |
|||
//update clipping box in non-locked areas |
|||
const UPSAMPLE_F fSrcSampleOffsetSq = dot(fSrcSampleOffset, fSrcSampleOffset); |
|||
UPSAMPLE_F fBoxSampleWeight = UPSAMPLE_F(1) - ffxSaturate(fSrcSampleOffsetSq / UPSAMPLE_F(3)); |
|||
fBoxSampleWeight *= fBoxSampleWeight; |
|||
RectificationBoxAddSample(fRectificationBox, fSamples[iSampleIndex], fBoxSampleWeight); |
|||
} |
|||
|
|||
fWeight += fSampleWeight; |
|||
fColor += fSampleWeight * fSamples[iSampleIndex]; |
|||
} |
|||
|
|||
// Normalize for deringing (we need to compare colors) |
|||
fColor = fColor / (abs(fWeight) > FSR2_EPSILON ? fWeight : UPSAMPLE_F(1.f)); |
|||
|
|||
RectificationBoxComputeVarianceBoxData(fRectificationBox); |
|||
clippingBox = RectificationBoxGetData(fRectificationBox); |
|||
|
|||
Deringing(RectificationBoxGetData(fRectificationBox), fColor); |
|||
|
|||
if (any(FFX_LESS_THAN(fKernelWeight, UPSAMPLE_F2_BROADCAST(1.0f)))) { |
|||
fWeight = UPSAMPLE_F(averageLanczosWeightPerFrame); |
|||
} |
|||
|
|||
return UPSAMPLE_F4(fColor, ffxMax(UPSAMPLE_F(0), fWeight)); |
|||
} |
|||
|
|||
#endif //!defined( FFX_FSR2_UPSAMPLE_H ) |
|||
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: e7aee0ec9f5d5434b8bcf55a633a8104 |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,936 @@ |
|||
// This file is part of the FidelityFX SDK. |
|||
// |
|||
// Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// The above copyright notice and this permission notice shall be included in |
|||
// all copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
// THE SOFTWARE. |
|||
|
|||
#ifdef FFX_CPU |
|||
FFX_STATIC void SpdSetup(FfxUInt32x2 dispatchThreadGroupCountXY, // CPU side: dispatch thread group count xy |
|||
FfxUInt32x2 workGroupOffset, // GPU side: pass in as constant |
|||
FfxUInt32x2 numWorkGroupsAndMips, // GPU side: pass in as constant |
|||
FfxUInt32x4 rectInfo, // left, top, width, height |
|||
FfxInt32 mips) // optional: if -1, calculate based on rect width and height |
|||
{ |
|||
workGroupOffset[0] = rectInfo[0] / 64; // rectInfo[0] = left |
|||
workGroupOffset[1] = rectInfo[1] / 64; // rectInfo[1] = top |
|||
|
|||
FfxUInt32 endIndexX = (rectInfo[0] + rectInfo[2] - 1) / 64; // rectInfo[0] = left, rectInfo[2] = width |
|||
FfxUInt32 endIndexY = (rectInfo[1] + rectInfo[3] - 1) / 64; // rectInfo[1] = top, rectInfo[3] = height |
|||
|
|||
dispatchThreadGroupCountXY[0] = endIndexX + 1 - workGroupOffset[0]; |
|||
dispatchThreadGroupCountXY[1] = endIndexY + 1 - workGroupOffset[1]; |
|||
|
|||
numWorkGroupsAndMips[0] = (dispatchThreadGroupCountXY[0]) * (dispatchThreadGroupCountXY[1]); |
|||
|
|||
if (mips >= 0) |
|||
{ |
|||
numWorkGroupsAndMips[1] = FfxUInt32(mips); |
|||
} |
|||
else |
|||
{ |
|||
// calculate based on rect width and height |
|||
FfxUInt32 resolution = ffxMax(rectInfo[2], rectInfo[3]); |
|||
numWorkGroupsAndMips[1] = FfxUInt32((ffxMin(floor(log2(FfxFloat32(resolution))), FfxFloat32(12)))); |
|||
} |
|||
} |
|||
|
|||
FFX_STATIC void SpdSetup(FfxUInt32x2 dispatchThreadGroupCountXY, // CPU side: dispatch thread group count xy |
|||
FfxUInt32x2 workGroupOffset, // GPU side: pass in as constant |
|||
FfxUInt32x2 numWorkGroupsAndMips, // GPU side: pass in as constant |
|||
FfxUInt32x4 rectInfo) // left, top, width, height |
|||
{ |
|||
SpdSetup(dispatchThreadGroupCountXY, workGroupOffset, numWorkGroupsAndMips, rectInfo, -1); |
|||
} |
|||
#endif // #ifdef FFX_CPU |
|||
|
|||
|
|||
//============================================================================================================================== |
|||
// NON-PACKED VERSION |
|||
//============================================================================================================================== |
|||
#ifdef FFX_GPU |
|||
#ifdef SPD_PACKED_ONLY |
|||
// Avoid compiler error |
|||
FfxFloat32x4 SpdLoadSourceImage(FfxInt32x2 p, FfxUInt32 slice) |
|||
{ |
|||
return FfxFloat32x4(0.0, 0.0, 0.0, 0.0); |
|||
} |
|||
|
|||
FfxFloat32x4 SpdLoad(FfxInt32x2 p, FfxUInt32 slice) |
|||
{ |
|||
return FfxFloat32x4(0.0, 0.0, 0.0, 0.0); |
|||
} |
|||
void SpdStore(FfxInt32x2 p, FfxFloat32x4 value, FfxUInt32 mip, FfxUInt32 slice) |
|||
{ |
|||
} |
|||
FfxFloat32x4 SpdLoadIntermediate(FfxUInt32 x, FfxUInt32 y) |
|||
{ |
|||
return FfxFloat32x4(0.0, 0.0, 0.0, 0.0); |
|||
} |
|||
void SpdStoreIntermediate(FfxUInt32 x, FfxUInt32 y, FfxFloat32x4 value) |
|||
{ |
|||
} |
|||
FfxFloat32x4 SpdReduce4(FfxFloat32x4 v0, FfxFloat32x4 v1, FfxFloat32x4 v2, FfxFloat32x4 v3) |
|||
{ |
|||
return FfxFloat32x4(0.0, 0.0, 0.0, 0.0); |
|||
} |
|||
#endif // #ifdef SPD_PACKED_ONLY |
|||
|
|||
//_____________________________________________________________/\_______________________________________________________________ |
|||
#if defined(FFX_GLSL) && !defined(SPD_NO_WAVE_OPERATIONS) |
|||
#extension GL_KHR_shader_subgroup_quad:require |
|||
#endif |
|||
|
|||
void SpdWorkgroupShuffleBarrier() |
|||
{ |
|||
#ifdef FFX_GLSL |
|||
barrier(); |
|||
#endif |
|||
#ifdef FFX_HLSL |
|||
GroupMemoryBarrierWithGroupSync(); |
|||
#endif |
|||
} |
|||
|
|||
// Only last active workgroup should proceed |
|||
bool SpdExitWorkgroup(FfxUInt32 numWorkGroups, FfxUInt32 localInvocationIndex, FfxUInt32 slice) |
|||
{ |
|||
// global atomic counter |
|||
if (localInvocationIndex == 0) |
|||
{ |
|||
SpdIncreaseAtomicCounter(slice); |
|||
} |
|||
|
|||
SpdWorkgroupShuffleBarrier(); |
|||
return (SpdGetAtomicCounter() != (numWorkGroups - 1)); |
|||
} |
|||
|
|||
// User defined: FfxFloat32x4 SpdReduce4(FfxFloat32x4 v0, FfxFloat32x4 v1, FfxFloat32x4 v2, FfxFloat32x4 v3); |
|||
FfxFloat32x4 SpdReduceQuad(FfxFloat32x4 v) |
|||
{ |
|||
#if defined(FFX_GLSL) && !defined(SPD_NO_WAVE_OPERATIONS) |
|||
|
|||
FfxFloat32x4 v0 = v; |
|||
FfxFloat32x4 v1 = subgroupQuadSwapHorizontal(v); |
|||
FfxFloat32x4 v2 = subgroupQuadSwapVertical(v); |
|||
FfxFloat32x4 v3 = subgroupQuadSwapDiagonal(v); |
|||
return SpdReduce4(v0, v1, v2, v3); |
|||
|
|||
#elif defined(FFX_HLSL) && !defined(SPD_NO_WAVE_OPERATIONS) |
|||
|
|||
// requires SM6.0 |
|||
FfxUInt32 quad = WaveGetLaneIndex() & (~0x3); |
|||
FfxFloat32x4 v0 = v; |
|||
FfxFloat32x4 v1 = WaveReadLaneAt(v, quad | 1); |
|||
FfxFloat32x4 v2 = WaveReadLaneAt(v, quad | 2); |
|||
FfxFloat32x4 v3 = WaveReadLaneAt(v, quad | 3); |
|||
return SpdReduce4(v0, v1, v2, v3); |
|||
/* |
|||
// if SM6.0 is not available, you can use the AMD shader intrinsics |
|||
// the AMD shader intrinsics are available in AMD GPU Services (AGS) library: |
|||
// https://gpuopen.com/amd-gpu-services-ags-library/ |
|||
// works for DX11 |
|||
FfxFloat32x4 v0 = v; |
|||
FfxFloat32x4 v1; |
|||
v1.x = AmdExtD3DShaderIntrinsics_SwizzleF(v.x, AmdExtD3DShaderIntrinsicsSwizzle_SwapX1); |
|||
v1.y = AmdExtD3DShaderIntrinsics_SwizzleF(v.y, AmdExtD3DShaderIntrinsicsSwizzle_SwapX1); |
|||
v1.z = AmdExtD3DShaderIntrinsics_SwizzleF(v.z, AmdExtD3DShaderIntrinsicsSwizzle_SwapX1); |
|||
v1.w = AmdExtD3DShaderIntrinsics_SwizzleF(v.w, AmdExtD3DShaderIntrinsicsSwizzle_SwapX1); |
|||
FfxFloat32x4 v2; |
|||
v2.x = AmdExtD3DShaderIntrinsics_SwizzleF(v.x, AmdExtD3DShaderIntrinsicsSwizzle_SwapX2); |
|||
v2.y = AmdExtD3DShaderIntrinsics_SwizzleF(v.y, AmdExtD3DShaderIntrinsicsSwizzle_SwapX2); |
|||
v2.z = AmdExtD3DShaderIntrinsics_SwizzleF(v.z, AmdExtD3DShaderIntrinsicsSwizzle_SwapX2); |
|||
v2.w = AmdExtD3DShaderIntrinsics_SwizzleF(v.w, AmdExtD3DShaderIntrinsicsSwizzle_SwapX2); |
|||
FfxFloat32x4 v3; |
|||
v3.x = AmdExtD3DShaderIntrinsics_SwizzleF(v.x, AmdExtD3DShaderIntrinsicsSwizzle_ReverseX4); |
|||
v3.y = AmdExtD3DShaderIntrinsics_SwizzleF(v.y, AmdExtD3DShaderIntrinsicsSwizzle_ReverseX4); |
|||
v3.z = AmdExtD3DShaderIntrinsics_SwizzleF(v.z, AmdExtD3DShaderIntrinsicsSwizzle_ReverseX4); |
|||
v3.w = AmdExtD3DShaderIntrinsics_SwizzleF(v.w, AmdExtD3DShaderIntrinsicsSwizzle_ReverseX4); |
|||
return SpdReduce4(v0, v1, v2, v3); |
|||
*/ |
|||
#endif |
|||
return v; |
|||
} |
|||
|
|||
FfxFloat32x4 SpdReduceIntermediate(FfxUInt32x2 i0, FfxUInt32x2 i1, FfxUInt32x2 i2, FfxUInt32x2 i3) |
|||
{ |
|||
FfxFloat32x4 v0 = SpdLoadIntermediate(i0.x, i0.y); |
|||
FfxFloat32x4 v1 = SpdLoadIntermediate(i1.x, i1.y); |
|||
FfxFloat32x4 v2 = SpdLoadIntermediate(i2.x, i2.y); |
|||
FfxFloat32x4 v3 = SpdLoadIntermediate(i3.x, i3.y); |
|||
return SpdReduce4(v0, v1, v2, v3); |
|||
} |
|||
|
|||
FfxFloat32x4 SpdReduceLoad4(FfxUInt32x2 i0, FfxUInt32x2 i1, FfxUInt32x2 i2, FfxUInt32x2 i3, FfxUInt32 slice) |
|||
{ |
|||
FfxFloat32x4 v0 = SpdLoad(FfxInt32x2(i0), slice); |
|||
FfxFloat32x4 v1 = SpdLoad(FfxInt32x2(i1), slice); |
|||
FfxFloat32x4 v2 = SpdLoad(FfxInt32x2(i2), slice); |
|||
FfxFloat32x4 v3 = SpdLoad(FfxInt32x2(i3), slice); |
|||
return SpdReduce4(v0, v1, v2, v3); |
|||
} |
|||
|
|||
FfxFloat32x4 SpdReduceLoad4(FfxUInt32x2 base, FfxUInt32 slice) |
|||
{ |
|||
return SpdReduceLoad4(FfxUInt32x2(base + FfxUInt32x2(0, 0)), FfxUInt32x2(base + FfxUInt32x2(0, 1)), FfxUInt32x2(base + FfxUInt32x2(1, 0)), FfxUInt32x2(base + FfxUInt32x2(1, 1)), slice); |
|||
} |
|||
|
|||
FfxFloat32x4 SpdReduceLoadSourceImage4(FfxUInt32x2 i0, FfxUInt32x2 i1, FfxUInt32x2 i2, FfxUInt32x2 i3, FfxUInt32 slice) |
|||
{ |
|||
FfxFloat32x4 v0 = SpdLoadSourceImage(FfxInt32x2(i0), slice); |
|||
FfxFloat32x4 v1 = SpdLoadSourceImage(FfxInt32x2(i1), slice); |
|||
FfxFloat32x4 v2 = SpdLoadSourceImage(FfxInt32x2(i2), slice); |
|||
FfxFloat32x4 v3 = SpdLoadSourceImage(FfxInt32x2(i3), slice); |
|||
return SpdReduce4(v0, v1, v2, v3); |
|||
} |
|||
|
|||
FfxFloat32x4 SpdReduceLoadSourceImage(FfxUInt32x2 base, FfxUInt32 slice) |
|||
{ |
|||
#ifdef SPD_LINEAR_SAMPLER |
|||
return SpdLoadSourceImage(FfxInt32x2(base), slice); |
|||
#else |
|||
return SpdReduceLoadSourceImage4(FfxUInt32x2(base + FfxUInt32x2(0, 0)), FfxUInt32x2(base + FfxUInt32x2(0, 1)), FfxUInt32x2(base + FfxUInt32x2(1, 0)), FfxUInt32x2(base + FfxUInt32x2(1, 1)), slice); |
|||
#endif |
|||
} |
|||
|
|||
void SpdDownsampleMips_0_1_Intrinsics(FfxUInt32 x, FfxUInt32 y, FfxUInt32x2 workGroupID, FfxUInt32 localInvocationIndex, FfxUInt32 mip, FfxUInt32 slice) |
|||
{ |
|||
FfxFloat32x4 v[4]; |
|||
|
|||
FfxInt32x2 tex = FfxInt32x2(workGroupID.xy * 64) + FfxInt32x2(x * 2, y * 2); |
|||
FfxInt32x2 pix = FfxInt32x2(workGroupID.xy * 32) + FfxInt32x2(x, y); |
|||
v[0] = SpdReduceLoadSourceImage(tex, slice); |
|||
SpdStore(pix, v[0], 0, slice); |
|||
|
|||
tex = FfxInt32x2(workGroupID.xy * 64) + FfxInt32x2(x * 2 + 32, y * 2); |
|||
pix = FfxInt32x2(workGroupID.xy * 32) + FfxInt32x2(x + 16, y); |
|||
v[1] = SpdReduceLoadSourceImage(tex, slice); |
|||
SpdStore(pix, v[1], 0, slice); |
|||
|
|||
tex = FfxInt32x2(workGroupID.xy * 64) + FfxInt32x2(x * 2, y * 2 + 32); |
|||
pix = FfxInt32x2(workGroupID.xy * 32) + FfxInt32x2(x, y + 16); |
|||
v[2] = SpdReduceLoadSourceImage(tex, slice); |
|||
SpdStore(pix, v[2], 0, slice); |
|||
|
|||
tex = FfxInt32x2(workGroupID.xy * 64) + FfxInt32x2(x * 2 + 32, y * 2 + 32); |
|||
pix = FfxInt32x2(workGroupID.xy * 32) + FfxInt32x2(x + 16, y + 16); |
|||
v[3] = SpdReduceLoadSourceImage(tex, slice); |
|||
SpdStore(pix, v[3], 0, slice); |
|||
|
|||
if (mip <= 1) |
|||
return; |
|||
|
|||
v[0] = SpdReduceQuad(v[0]); |
|||
v[1] = SpdReduceQuad(v[1]); |
|||
v[2] = SpdReduceQuad(v[2]); |
|||
v[3] = SpdReduceQuad(v[3]); |
|||
|
|||
if ((localInvocationIndex % 4) == 0) |
|||
{ |
|||
SpdStore(FfxInt32x2(workGroupID.xy * 16) + FfxInt32x2(x / 2, y / 2), v[0], 1, slice); |
|||
SpdStoreIntermediate(x / 2, y / 2, v[0]); |
|||
|
|||
SpdStore(FfxInt32x2(workGroupID.xy * 16) + FfxInt32x2(x / 2 + 8, y / 2), v[1], 1, slice); |
|||
SpdStoreIntermediate(x / 2 + 8, y / 2, v[1]); |
|||
|
|||
SpdStore(FfxInt32x2(workGroupID.xy * 16) + FfxInt32x2(x / 2, y / 2 + 8), v[2], 1, slice); |
|||
SpdStoreIntermediate(x / 2, y / 2 + 8, v[2]); |
|||
|
|||
SpdStore(FfxInt32x2(workGroupID.xy * 16) + FfxInt32x2(x / 2 + 8, y / 2 + 8), v[3], 1, slice); |
|||
SpdStoreIntermediate(x / 2 + 8, y / 2 + 8, v[3]); |
|||
} |
|||
} |
|||
|
|||
void SpdDownsampleMips_0_1_LDS(FfxUInt32 x, FfxUInt32 y, FfxUInt32x2 workGroupID, FfxUInt32 localInvocationIndex, FfxUInt32 mip, FfxUInt32 slice) |
|||
{ |
|||
FfxFloat32x4 v[4]; |
|||
|
|||
FfxInt32x2 tex = FfxInt32x2(workGroupID.xy * 64) + FfxInt32x2(x * 2, y * 2); |
|||
FfxInt32x2 pix = FfxInt32x2(workGroupID.xy * 32) + FfxInt32x2(x, y); |
|||
v[0] = SpdReduceLoadSourceImage(tex, slice); |
|||
SpdStore(pix, v[0], 0, slice); |
|||
|
|||
tex = FfxInt32x2(workGroupID.xy * 64) + FfxInt32x2(x * 2 + 32, y * 2); |
|||
pix = FfxInt32x2(workGroupID.xy * 32) + FfxInt32x2(x + 16, y); |
|||
v[1] = SpdReduceLoadSourceImage(tex, slice); |
|||
SpdStore(pix, v[1], 0, slice); |
|||
|
|||
tex = FfxInt32x2(workGroupID.xy * 64) + FfxInt32x2(x * 2, y * 2 + 32); |
|||
pix = FfxInt32x2(workGroupID.xy * 32) + FfxInt32x2(x, y + 16); |
|||
v[2] = SpdReduceLoadSourceImage(tex, slice); |
|||
SpdStore(pix, v[2], 0, slice); |
|||
|
|||
tex = FfxInt32x2(workGroupID.xy * 64) + FfxInt32x2(x * 2 + 32, y * 2 + 32); |
|||
pix = FfxInt32x2(workGroupID.xy * 32) + FfxInt32x2(x + 16, y + 16); |
|||
v[3] = SpdReduceLoadSourceImage(tex, slice); |
|||
SpdStore(pix, v[3], 0, slice); |
|||
|
|||
if (mip <= 1) |
|||
return; |
|||
|
|||
for (FfxUInt32 i = 0; i < 4; i++) |
|||
{ |
|||
SpdStoreIntermediate(x, y, v[i]); |
|||
SpdWorkgroupShuffleBarrier(); |
|||
if (localInvocationIndex < 64) |
|||
{ |
|||
v[i] = SpdReduceIntermediate(FfxUInt32x2(x * 2 + 0, y * 2 + 0), FfxUInt32x2(x * 2 + 1, y * 2 + 0), FfxUInt32x2(x * 2 + 0, y * 2 + 1), FfxUInt32x2(x * 2 + 1, y * 2 + 1)); |
|||
SpdStore(FfxInt32x2(workGroupID.xy * 16) + FfxInt32x2(x + (i % 2) * 8, y + (i / 2) * 8), v[i], 1, slice); |
|||
} |
|||
SpdWorkgroupShuffleBarrier(); |
|||
} |
|||
|
|||
if (localInvocationIndex < 64) |
|||
{ |
|||
SpdStoreIntermediate(x + 0, y + 0, v[0]); |
|||
SpdStoreIntermediate(x + 8, y + 0, v[1]); |
|||
SpdStoreIntermediate(x + 0, y + 8, v[2]); |
|||
SpdStoreIntermediate(x + 8, y + 8, v[3]); |
|||
} |
|||
} |
|||
|
|||
void SpdDownsampleMips_0_1(FfxUInt32 x, FfxUInt32 y, FfxUInt32x2 workGroupID, FfxUInt32 localInvocationIndex, FfxUInt32 mip, FfxUInt32 slice) |
|||
{ |
|||
#ifdef SPD_NO_WAVE_OPERATIONS |
|||
SpdDownsampleMips_0_1_LDS(x, y, workGroupID, localInvocationIndex, mip, slice); |
|||
#else |
|||
SpdDownsampleMips_0_1_Intrinsics(x, y, workGroupID, localInvocationIndex, mip, slice); |
|||
#endif |
|||
} |
|||
|
|||
|
|||
void SpdDownsampleMip_2(FfxUInt32 x, FfxUInt32 y, FfxUInt32x2 workGroupID, FfxUInt32 localInvocationIndex, FfxUInt32 mip, FfxUInt32 slice) |
|||
{ |
|||
#ifdef SPD_NO_WAVE_OPERATIONS |
|||
if (localInvocationIndex < 64) |
|||
{ |
|||
FfxFloat32x4 v = SpdReduceIntermediate(FfxUInt32x2(x * 2 + 0, y * 2 + 0), FfxUInt32x2(x * 2 + 1, y * 2 + 0), FfxUInt32x2(x * 2 + 0, y * 2 + 1), FfxUInt32x2(x * 2 + 1, y * 2 + 1)); |
|||
SpdStore(FfxInt32x2(workGroupID.xy * 8) + FfxInt32x2(x, y), v, mip, slice); |
|||
// store to LDS, try to reduce bank conflicts |
|||
// x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 |
|||
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
|||
// 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x |
|||
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
|||
// x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 |
|||
// ... |
|||
// x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 |
|||
SpdStoreIntermediate(x * 2 + y % 2, y * 2, v); |
|||
} |
|||
#else |
|||
FfxFloat32x4 v = SpdLoadIntermediate(x, y); |
|||
v = SpdReduceQuad(v); |
|||
// quad index 0 stores result |
|||
if (localInvocationIndex % 4 == 0) |
|||
{ |
|||
SpdStore(FfxInt32x2(workGroupID.xy * 8) + FfxInt32x2(x / 2, y / 2), v, mip, slice); |
|||
SpdStoreIntermediate(x + (y / 2) % 2, y, v); |
|||
} |
|||
#endif |
|||
} |
|||
|
|||
void SpdDownsampleMip_3(FfxUInt32 x, FfxUInt32 y, FfxUInt32x2 workGroupID, FfxUInt32 localInvocationIndex, FfxUInt32 mip, FfxUInt32 slice) |
|||
{ |
|||
#ifdef SPD_NO_WAVE_OPERATIONS |
|||
if (localInvocationIndex < 16) |
|||
{ |
|||
// x 0 x 0 |
|||
// 0 0 0 0 |
|||
// 0 x 0 x |
|||
// 0 0 0 0 |
|||
FfxFloat32x4 v = |
|||
SpdReduceIntermediate(FfxUInt32x2(x * 4 + 0 + 0, y * 4 + 0), FfxUInt32x2(x * 4 + 2 + 0, y * 4 + 0), FfxUInt32x2(x * 4 + 0 + 1, y * 4 + 2), FfxUInt32x2(x * 4 + 2 + 1, y * 4 + 2)); |
|||
SpdStore(FfxInt32x2(workGroupID.xy * 4) + FfxInt32x2(x, y), v, mip, slice); |
|||
// store to LDS |
|||
// x 0 0 0 x 0 0 0 x 0 0 0 x 0 0 0 |
|||
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
|||
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
|||
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
|||
// 0 x 0 0 0 x 0 0 0 x 0 0 0 x 0 0 |
|||
// ... |
|||
// 0 0 x 0 0 0 x 0 0 0 x 0 0 0 x 0 |
|||
// ... |
|||
// 0 0 0 x 0 0 0 x 0 0 0 x 0 0 0 x |
|||
// ... |
|||
SpdStoreIntermediate(x * 4 + y, y * 4, v); |
|||
} |
|||
#else |
|||
if (localInvocationIndex < 64) |
|||
{ |
|||
FfxFloat32x4 v = SpdLoadIntermediate(x * 2 + y % 2, y * 2); |
|||
v = SpdReduceQuad(v); |
|||
// quad index 0 stores result |
|||
if (localInvocationIndex % 4 == 0) |
|||
{ |
|||
SpdStore(FfxInt32x2(workGroupID.xy * 4) + FfxInt32x2(x / 2, y / 2), v, mip, slice); |
|||
SpdStoreIntermediate(x * 2 + y / 2, y * 2, v); |
|||
} |
|||
} |
|||
#endif |
|||
} |
|||
|
|||
void SpdDownsampleMip_4(FfxUInt32 x, FfxUInt32 y, FfxUInt32x2 workGroupID, FfxUInt32 localInvocationIndex, FfxUInt32 mip, FfxUInt32 slice) |
|||
{ |
|||
#ifdef SPD_NO_WAVE_OPERATIONS |
|||
if (localInvocationIndex < 4) |
|||
{ |
|||
// x 0 0 0 x 0 0 0 |
|||
// ... |
|||
// 0 x 0 0 0 x 0 0 |
|||
FfxFloat32x4 v = SpdReduceIntermediate(FfxUInt32x2(x * 8 + 0 + 0 + y * 2, y * 8 + 0), |
|||
FfxUInt32x2(x * 8 + 4 + 0 + y * 2, y * 8 + 0), |
|||
FfxUInt32x2(x * 8 + 0 + 1 + y * 2, y * 8 + 4), |
|||
FfxUInt32x2(x * 8 + 4 + 1 + y * 2, y * 8 + 4)); |
|||
SpdStore(FfxInt32x2(workGroupID.xy * 2) + FfxInt32x2(x, y), v, mip, slice); |
|||
// store to LDS |
|||
// x x x x 0 ... |
|||
// 0 ... |
|||
SpdStoreIntermediate(x + y * 2, 0, v); |
|||
} |
|||
#else |
|||
if (localInvocationIndex < 16) |
|||
{ |
|||
FfxFloat32x4 v = SpdLoadIntermediate(x * 4 + y, y * 4); |
|||
v = SpdReduceQuad(v); |
|||
// quad index 0 stores result |
|||
if (localInvocationIndex % 4 == 0) |
|||
{ |
|||
SpdStore(FfxInt32x2(workGroupID.xy * 2) + FfxInt32x2(x / 2, y / 2), v, mip, slice); |
|||
SpdStoreIntermediate(x / 2 + y, 0, v); |
|||
} |
|||
} |
|||
#endif |
|||
} |
|||
|
|||
void SpdDownsampleMip_5(FfxUInt32x2 workGroupID, FfxUInt32 localInvocationIndex, FfxUInt32 mip, FfxUInt32 slice) |
|||
{ |
|||
#ifdef SPD_NO_WAVE_OPERATIONS |
|||
if (localInvocationIndex < 1) |
|||
{ |
|||
// x x x x 0 ... |
|||
// 0 ... |
|||
FfxFloat32x4 v = SpdReduceIntermediate(FfxUInt32x2(0, 0), FfxUInt32x2(1, 0), FfxUInt32x2(2, 0), FfxUInt32x2(3, 0)); |
|||
SpdStore(FfxInt32x2(workGroupID.xy), v, mip, slice); |
|||
} |
|||
#else |
|||
if (localInvocationIndex < 4) |
|||
{ |
|||
FfxFloat32x4 v = SpdLoadIntermediate(localInvocationIndex, 0); |
|||
v = SpdReduceQuad(v); |
|||
// quad index 0 stores result |
|||
if (localInvocationIndex % 4 == 0) |
|||
{ |
|||
SpdStore(FfxInt32x2(workGroupID.xy), v, mip, slice); |
|||
} |
|||
} |
|||
#endif |
|||
} |
|||
|
|||
void SpdDownsampleMips_6_7(FfxUInt32 x, FfxUInt32 y, FfxUInt32 mips, FfxUInt32 slice) |
|||
{ |
|||
FfxInt32x2 tex = FfxInt32x2(x * 4 + 0, y * 4 + 0); |
|||
FfxInt32x2 pix = FfxInt32x2(x * 2 + 0, y * 2 + 0); |
|||
FfxFloat32x4 v0 = SpdReduceLoad4(tex, slice); |
|||
SpdStore(pix, v0, 6, slice); |
|||
|
|||
tex = FfxInt32x2(x * 4 + 2, y * 4 + 0); |
|||
pix = FfxInt32x2(x * 2 + 1, y * 2 + 0); |
|||
FfxFloat32x4 v1 = SpdReduceLoad4(tex, slice); |
|||
SpdStore(pix, v1, 6, slice); |
|||
|
|||
tex = FfxInt32x2(x * 4 + 0, y * 4 + 2); |
|||
pix = FfxInt32x2(x * 2 + 0, y * 2 + 1); |
|||
FfxFloat32x4 v2 = SpdReduceLoad4(tex, slice); |
|||
SpdStore(pix, v2, 6, slice); |
|||
|
|||
tex = FfxInt32x2(x * 4 + 2, y * 4 + 2); |
|||
pix = FfxInt32x2(x * 2 + 1, y * 2 + 1); |
|||
FfxFloat32x4 v3 = SpdReduceLoad4(tex, slice); |
|||
SpdStore(pix, v3, 6, slice); |
|||
|
|||
if (mips <= 7) |
|||
return; |
|||
// no barrier needed, working on values only from the same thread |
|||
|
|||
FfxFloat32x4 v = SpdReduce4(v0, v1, v2, v3); |
|||
SpdStore(FfxInt32x2(x, y), v, 7, slice); |
|||
SpdStoreIntermediate(x, y, v); |
|||
} |
|||
|
|||
void SpdDownsampleNextFour(FfxUInt32 x, FfxUInt32 y, FfxUInt32x2 workGroupID, FfxUInt32 localInvocationIndex, FfxUInt32 baseMip, FfxUInt32 mips, FfxUInt32 slice) |
|||
{ |
|||
if (mips <= baseMip) |
|||
return; |
|||
SpdWorkgroupShuffleBarrier(); |
|||
SpdDownsampleMip_2(x, y, workGroupID, localInvocationIndex, baseMip, slice); |
|||
|
|||
if (mips <= baseMip + 1) |
|||
return; |
|||
SpdWorkgroupShuffleBarrier(); |
|||
SpdDownsampleMip_3(x, y, workGroupID, localInvocationIndex, baseMip + 1, slice); |
|||
|
|||
if (mips <= baseMip + 2) |
|||
return; |
|||
SpdWorkgroupShuffleBarrier(); |
|||
SpdDownsampleMip_4(x, y, workGroupID, localInvocationIndex, baseMip + 2, slice); |
|||
|
|||
if (mips <= baseMip + 3) |
|||
return; |
|||
SpdWorkgroupShuffleBarrier(); |
|||
SpdDownsampleMip_5(workGroupID, localInvocationIndex, baseMip + 3, slice); |
|||
} |
|||
|
|||
void SpdDownsample(FfxUInt32x2 workGroupID, FfxUInt32 localInvocationIndex, FfxUInt32 mips, FfxUInt32 numWorkGroups, FfxUInt32 slice) |
|||
{ |
|||
FfxUInt32x2 sub_xy = ffxRemapForWaveReduction(localInvocationIndex % 64); |
|||
FfxUInt32 x = sub_xy.x + 8 * ((localInvocationIndex >> 6) % 2); |
|||
FfxUInt32 y = sub_xy.y + 8 * ((localInvocationIndex >> 7)); |
|||
SpdDownsampleMips_0_1(x, y, workGroupID, localInvocationIndex, mips, slice); |
|||
|
|||
SpdDownsampleNextFour(x, y, workGroupID, localInvocationIndex, 2, mips, slice); |
|||
|
|||
if (mips <= 6) |
|||
return; |
|||
|
|||
if (SpdExitWorkgroup(numWorkGroups, localInvocationIndex, slice)) |
|||
return; |
|||
|
|||
SpdResetAtomicCounter(slice); |
|||
|
|||
// After mip 6 there is only a single workgroup left that downsamples the remaining up to 64x64 texels. |
|||
SpdDownsampleMips_6_7(x, y, mips, slice); |
|||
|
|||
SpdDownsampleNextFour(x, y, FfxUInt32x2(0, 0), localInvocationIndex, 8, mips, slice); |
|||
} |
|||
|
|||
void SpdDownsample(FfxUInt32x2 workGroupID, FfxUInt32 localInvocationIndex, FfxUInt32 mips, FfxUInt32 numWorkGroups, FfxUInt32 slice, FfxUInt32x2 workGroupOffset) |
|||
{ |
|||
SpdDownsample(workGroupID + workGroupOffset, localInvocationIndex, mips, numWorkGroups, slice); |
|||
} |
|||
|
|||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|||
|
|||
//============================================================================================================================== |
|||
// PACKED VERSION |
|||
//============================================================================================================================== |
|||
|
|||
#if FFX_HALF |
|||
|
|||
#ifdef FFX_GLSL |
|||
#extension GL_EXT_shader_subgroup_extended_types_float16:require |
|||
#endif |
|||
|
|||
FfxFloat16x4 SpdReduceQuadH(FfxFloat16x4 v) |
|||
{ |
|||
#if defined(FFX_GLSL) && !defined(SPD_NO_WAVE_OPERATIONS) |
|||
FfxFloat16x4 v0 = v; |
|||
FfxFloat16x4 v1 = subgroupQuadSwapHorizontal(v); |
|||
FfxFloat16x4 v2 = subgroupQuadSwapVertical(v); |
|||
FfxFloat16x4 v3 = subgroupQuadSwapDiagonal(v); |
|||
return SpdReduce4H(v0, v1, v2, v3); |
|||
#elif defined(FFX_HLSL) && !defined(SPD_NO_WAVE_OPERATIONS) |
|||
// requires SM6.0 |
|||
FfxUInt32 quad = WaveGetLaneIndex() & (~0x3); |
|||
FfxFloat16x4 v0 = v; |
|||
FfxFloat16x4 v1 = WaveReadLaneAt(v, quad | 1); |
|||
FfxFloat16x4 v2 = WaveReadLaneAt(v, quad | 2); |
|||
FfxFloat16x4 v3 = WaveReadLaneAt(v, quad | 3); |
|||
return SpdReduce4H(v0, v1, v2, v3); |
|||
/* |
|||
// if SM6.0 is not available, you can use the AMD shader intrinsics |
|||
// the AMD shader intrinsics are available in AMD GPU Services (AGS) library: |
|||
// https://gpuopen.com/amd-gpu-services-ags-library/ |
|||
// works for DX11 |
|||
FfxFloat16x4 v0 = v; |
|||
FfxFloat16x4 v1; |
|||
v1.x = AmdExtD3DShaderIntrinsics_SwizzleF(v.x, AmdExtD3DShaderIntrinsicsSwizzle_SwapX1); |
|||
v1.y = AmdExtD3DShaderIntrinsics_SwizzleF(v.y, AmdExtD3DShaderIntrinsicsSwizzle_SwapX1); |
|||
v1.z = AmdExtD3DShaderIntrinsics_SwizzleF(v.z, AmdExtD3DShaderIntrinsicsSwizzle_SwapX1); |
|||
v1.w = AmdExtD3DShaderIntrinsics_SwizzleF(v.w, AmdExtD3DShaderIntrinsicsSwizzle_SwapX1); |
|||
FfxFloat16x4 v2; |
|||
v2.x = AmdExtD3DShaderIntrinsics_SwizzleF(v.x, AmdExtD3DShaderIntrinsicsSwizzle_SwapX2); |
|||
v2.y = AmdExtD3DShaderIntrinsics_SwizzleF(v.y, AmdExtD3DShaderIntrinsicsSwizzle_SwapX2); |
|||
v2.z = AmdExtD3DShaderIntrinsics_SwizzleF(v.z, AmdExtD3DShaderIntrinsicsSwizzle_SwapX2); |
|||
v2.w = AmdExtD3DShaderIntrinsics_SwizzleF(v.w, AmdExtD3DShaderIntrinsicsSwizzle_SwapX2); |
|||
FfxFloat16x4 v3; |
|||
v3.x = AmdExtD3DShaderIntrinsics_SwizzleF(v.x, AmdExtD3DShaderIntrinsicsSwizzle_ReverseX4); |
|||
v3.y = AmdExtD3DShaderIntrinsics_SwizzleF(v.y, AmdExtD3DShaderIntrinsicsSwizzle_ReverseX4); |
|||
v3.z = AmdExtD3DShaderIntrinsics_SwizzleF(v.z, AmdExtD3DShaderIntrinsicsSwizzle_ReverseX4); |
|||
v3.w = AmdExtD3DShaderIntrinsics_SwizzleF(v.w, AmdExtD3DShaderIntrinsicsSwizzle_ReverseX4); |
|||
return SpdReduce4H(v0, v1, v2, v3); |
|||
*/ |
|||
#endif |
|||
return FfxFloat16x4(0.0, 0.0, 0.0, 0.0); |
|||
} |
|||
|
|||
FfxFloat16x4 SpdReduceIntermediateH(FfxUInt32x2 i0, FfxUInt32x2 i1, FfxUInt32x2 i2, FfxUInt32x2 i3) |
|||
{ |
|||
FfxFloat16x4 v0 = SpdLoadIntermediateH(i0.x, i0.y); |
|||
FfxFloat16x4 v1 = SpdLoadIntermediateH(i1.x, i1.y); |
|||
FfxFloat16x4 v2 = SpdLoadIntermediateH(i2.x, i2.y); |
|||
FfxFloat16x4 v3 = SpdLoadIntermediateH(i3.x, i3.y); |
|||
return SpdReduce4H(v0, v1, v2, v3); |
|||
} |
|||
|
|||
FfxFloat16x4 SpdReduceLoad4H(FfxUInt32x2 i0, FfxUInt32x2 i1, FfxUInt32x2 i2, FfxUInt32x2 i3, FfxUInt32 slice) |
|||
{ |
|||
FfxFloat16x4 v0 = SpdLoadH(FfxInt32x2(i0), slice); |
|||
FfxFloat16x4 v1 = SpdLoadH(FfxInt32x2(i1), slice); |
|||
FfxFloat16x4 v2 = SpdLoadH(FfxInt32x2(i2), slice); |
|||
FfxFloat16x4 v3 = SpdLoadH(FfxInt32x2(i3), slice); |
|||
return SpdReduce4H(v0, v1, v2, v3); |
|||
} |
|||
|
|||
FfxFloat16x4 SpdReduceLoad4H(FfxUInt32x2 base, FfxUInt32 slice) |
|||
{ |
|||
return SpdReduceLoad4H(FfxUInt32x2(base + FfxUInt32x2(0, 0)), FfxUInt32x2(base + FfxUInt32x2(0, 1)), FfxUInt32x2(base + FfxUInt32x2(1, 0)), FfxUInt32x2(base + FfxUInt32x2(1, 1)), slice); |
|||
} |
|||
|
|||
FfxFloat16x4 SpdReduceLoadSourceImage4H(FfxUInt32x2 i0, FfxUInt32x2 i1, FfxUInt32x2 i2, FfxUInt32x2 i3, FfxUInt32 slice) |
|||
{ |
|||
FfxFloat16x4 v0 = SpdLoadSourceImageH(FfxInt32x2(i0), slice); |
|||
FfxFloat16x4 v1 = SpdLoadSourceImageH(FfxInt32x2(i1), slice); |
|||
FfxFloat16x4 v2 = SpdLoadSourceImageH(FfxInt32x2(i2), slice); |
|||
FfxFloat16x4 v3 = SpdLoadSourceImageH(FfxInt32x2(i3), slice); |
|||
return SpdReduce4H(v0, v1, v2, v3); |
|||
} |
|||
|
|||
FfxFloat16x4 SpdReduceLoadSourceImageH(FfxUInt32x2 base, FfxUInt32 slice) |
|||
{ |
|||
#ifdef SPD_LINEAR_SAMPLER |
|||
return SpdLoadSourceImageH(FfxInt32x2(base), slice); |
|||
#else |
|||
return SpdReduceLoadSourceImage4H(FfxUInt32x2(base + FfxUInt32x2(0, 0)), FfxUInt32x2(base + FfxUInt32x2(0, 1)), FfxUInt32x2(base + FfxUInt32x2(1, 0)), FfxUInt32x2(base + FfxUInt32x2(1, 1)), slice); |
|||
#endif |
|||
} |
|||
|
|||
void SpdDownsampleMips_0_1_IntrinsicsH(FfxUInt32 x, FfxUInt32 y, FfxUInt32x2 workGroupID, FfxUInt32 localInvocationIndex, FfxUInt32 mips, FfxUInt32 slice) |
|||
{ |
|||
FfxFloat16x4 v[4]; |
|||
|
|||
FfxInt32x2 tex = FfxInt32x2(workGroupID.xy * 64) + FfxInt32x2(x * 2, y * 2); |
|||
FfxInt32x2 pix = FfxInt32x2(workGroupID.xy * 32) + FfxInt32x2(x, y); |
|||
v[0] = SpdReduceLoadSourceImageH(tex, slice); |
|||
SpdStoreH(pix, v[0], 0, slice); |
|||
|
|||
tex = FfxInt32x2(workGroupID.xy * 64) + FfxInt32x2(x * 2 + 32, y * 2); |
|||
pix = FfxInt32x2(workGroupID.xy * 32) + FfxInt32x2(x + 16, y); |
|||
v[1] = SpdReduceLoadSourceImageH(tex, slice); |
|||
SpdStoreH(pix, v[1], 0, slice); |
|||
|
|||
tex = FfxInt32x2(workGroupID.xy * 64) + FfxInt32x2(x * 2, y * 2 + 32); |
|||
pix = FfxInt32x2(workGroupID.xy * 32) + FfxInt32x2(x, y + 16); |
|||
v[2] = SpdReduceLoadSourceImageH(tex, slice); |
|||
SpdStoreH(pix, v[2], 0, slice); |
|||
|
|||
tex = FfxInt32x2(workGroupID.xy * 64) + FfxInt32x2(x * 2 + 32, y * 2 + 32); |
|||
pix = FfxInt32x2(workGroupID.xy * 32) + FfxInt32x2(x + 16, y + 16); |
|||
v[3] = SpdReduceLoadSourceImageH(tex, slice); |
|||
SpdStoreH(pix, v[3], 0, slice); |
|||
|
|||
if (mips <= 1) |
|||
return; |
|||
|
|||
v[0] = SpdReduceQuadH(v[0]); |
|||
v[1] = SpdReduceQuadH(v[1]); |
|||
v[2] = SpdReduceQuadH(v[2]); |
|||
v[3] = SpdReduceQuadH(v[3]); |
|||
|
|||
if ((localInvocationIndex % 4) == 0) |
|||
{ |
|||
SpdStoreH(FfxInt32x2(workGroupID.xy * 16) + FfxInt32x2(x / 2, y / 2), v[0], 1, slice); |
|||
SpdStoreIntermediateH(x / 2, y / 2, v[0]); |
|||
|
|||
SpdStoreH(FfxInt32x2(workGroupID.xy * 16) + FfxInt32x2(x / 2 + 8, y / 2), v[1], 1, slice); |
|||
SpdStoreIntermediateH(x / 2 + 8, y / 2, v[1]); |
|||
|
|||
SpdStoreH(FfxInt32x2(workGroupID.xy * 16) + FfxInt32x2(x / 2, y / 2 + 8), v[2], 1, slice); |
|||
SpdStoreIntermediateH(x / 2, y / 2 + 8, v[2]); |
|||
|
|||
SpdStoreH(FfxInt32x2(workGroupID.xy * 16) + FfxInt32x2(x / 2 + 8, y / 2 + 8), v[3], 1, slice); |
|||
SpdStoreIntermediateH(x / 2 + 8, y / 2 + 8, v[3]); |
|||
} |
|||
} |
|||
|
|||
void SpdDownsampleMips_0_1_LDSH(FfxUInt32 x, FfxUInt32 y, FfxUInt32x2 workGroupID, FfxUInt32 localInvocationIndex, FfxUInt32 mips, FfxUInt32 slice) |
|||
{ |
|||
FfxFloat16x4 v[4]; |
|||
|
|||
FfxInt32x2 tex = FfxInt32x2(workGroupID.xy * 64) + FfxInt32x2(x * 2, y * 2); |
|||
FfxInt32x2 pix = FfxInt32x2(workGroupID.xy * 32) + FfxInt32x2(x, y); |
|||
v[0] = SpdReduceLoadSourceImageH(tex, slice); |
|||
SpdStoreH(pix, v[0], 0, slice); |
|||
|
|||
tex = FfxInt32x2(workGroupID.xy * 64) + FfxInt32x2(x * 2 + 32, y * 2); |
|||
pix = FfxInt32x2(workGroupID.xy * 32) + FfxInt32x2(x + 16, y); |
|||
v[1] = SpdReduceLoadSourceImageH(tex, slice); |
|||
SpdStoreH(pix, v[1], 0, slice); |
|||
|
|||
tex = FfxInt32x2(workGroupID.xy * 64) + FfxInt32x2(x * 2, y * 2 + 32); |
|||
pix = FfxInt32x2(workGroupID.xy * 32) + FfxInt32x2(x, y + 16); |
|||
v[2] = SpdReduceLoadSourceImageH(tex, slice); |
|||
SpdStoreH(pix, v[2], 0, slice); |
|||
|
|||
tex = FfxInt32x2(workGroupID.xy * 64) + FfxInt32x2(x * 2 + 32, y * 2 + 32); |
|||
pix = FfxInt32x2(workGroupID.xy * 32) + FfxInt32x2(x + 16, y + 16); |
|||
v[3] = SpdReduceLoadSourceImageH(tex, slice); |
|||
SpdStoreH(pix, v[3], 0, slice); |
|||
|
|||
if (mips <= 1) |
|||
return; |
|||
|
|||
for (FfxInt32 i = 0; i < 4; i++) |
|||
{ |
|||
SpdStoreIntermediateH(x, y, v[i]); |
|||
SpdWorkgroupShuffleBarrier(); |
|||
if (localInvocationIndex < 64) |
|||
{ |
|||
v[i] = SpdReduceIntermediateH(FfxUInt32x2(x * 2 + 0, y * 2 + 0), FfxUInt32x2(x * 2 + 1, y * 2 + 0), FfxUInt32x2(x * 2 + 0, y * 2 + 1), FfxUInt32x2(x * 2 + 1, y * 2 + 1)); |
|||
SpdStoreH(FfxInt32x2(workGroupID.xy * 16) + FfxInt32x2(x + (i % 2) * 8, y + (i / 2) * 8), v[i], 1, slice); |
|||
} |
|||
SpdWorkgroupShuffleBarrier(); |
|||
} |
|||
|
|||
if (localInvocationIndex < 64) |
|||
{ |
|||
SpdStoreIntermediateH(x + 0, y + 0, v[0]); |
|||
SpdStoreIntermediateH(x + 8, y + 0, v[1]); |
|||
SpdStoreIntermediateH(x + 0, y + 8, v[2]); |
|||
SpdStoreIntermediateH(x + 8, y + 8, v[3]); |
|||
} |
|||
} |
|||
|
|||
void SpdDownsampleMips_0_1H(FfxUInt32 x, FfxUInt32 y, FfxUInt32x2 workGroupID, FfxUInt32 localInvocationIndex, FfxUInt32 mips, FfxUInt32 slice) |
|||
{ |
|||
#ifdef SPD_NO_WAVE_OPERATIONS |
|||
SpdDownsampleMips_0_1_LDSH(x, y, workGroupID, localInvocationIndex, mips, slice); |
|||
#else |
|||
SpdDownsampleMips_0_1_IntrinsicsH(x, y, workGroupID, localInvocationIndex, mips, slice); |
|||
#endif |
|||
} |
|||
|
|||
|
|||
void SpdDownsampleMip_2H(FfxUInt32 x, FfxUInt32 y, FfxUInt32x2 workGroupID, FfxUInt32 localInvocationIndex, FfxUInt32 mip, FfxUInt32 slice) |
|||
{ |
|||
#ifdef SPD_NO_WAVE_OPERATIONS |
|||
if (localInvocationIndex < 64) |
|||
{ |
|||
FfxFloat16x4 v = SpdReduceIntermediateH(FfxUInt32x2(x * 2 + 0, y * 2 + 0), FfxUInt32x2(x * 2 + 1, y * 2 + 0), FfxUInt32x2(x * 2 + 0, y * 2 + 1), FfxUInt32x2(x * 2 + 1, y * 2 + 1)); |
|||
SpdStoreH(FfxInt32x2(workGroupID.xy * 8) + FfxInt32x2(x, y), v, mip, slice); |
|||
// store to LDS, try to reduce bank conflicts |
|||
// x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 |
|||
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
|||
// 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 x |
|||
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
|||
// x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 |
|||
// ... |
|||
// x 0 x 0 x 0 x 0 x 0 x 0 x 0 x 0 |
|||
SpdStoreIntermediateH(x * 2 + y % 2, y * 2, v); |
|||
} |
|||
#else |
|||
FfxFloat16x4 v = SpdLoadIntermediateH(x, y); |
|||
v = SpdReduceQuadH(v); |
|||
// quad index 0 stores result |
|||
if (localInvocationIndex % 4 == 0) |
|||
{ |
|||
SpdStoreH(FfxInt32x2(workGroupID.xy * 8) + FfxInt32x2(x / 2, y / 2), v, mip, slice); |
|||
SpdStoreIntermediateH(x + (y / 2) % 2, y, v); |
|||
} |
|||
#endif |
|||
} |
|||
|
|||
void SpdDownsampleMip_3H(FfxUInt32 x, FfxUInt32 y, FfxUInt32x2 workGroupID, FfxUInt32 localInvocationIndex, FfxUInt32 mip, FfxUInt32 slice) |
|||
{ |
|||
#ifdef SPD_NO_WAVE_OPERATIONS |
|||
if (localInvocationIndex < 16) |
|||
{ |
|||
// x 0 x 0 |
|||
// 0 0 0 0 |
|||
// 0 x 0 x |
|||
// 0 0 0 0 |
|||
FfxFloat16x4 v = |
|||
SpdReduceIntermediateH(FfxUInt32x2(x * 4 + 0 + 0, y * 4 + 0), FfxUInt32x2(x * 4 + 2 + 0, y * 4 + 0), FfxUInt32x2(x * 4 + 0 + 1, y * 4 + 2), FfxUInt32x2(x * 4 + 2 + 1, y * 4 + 2)); |
|||
SpdStoreH(FfxInt32x2(workGroupID.xy * 4) + FfxInt32x2(x, y), v, mip, slice); |
|||
// store to LDS |
|||
// x 0 0 0 x 0 0 0 x 0 0 0 x 0 0 0 |
|||
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
|||
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
|||
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
|||
// 0 x 0 0 0 x 0 0 0 x 0 0 0 x 0 0 |
|||
// ... |
|||
// 0 0 x 0 0 0 x 0 0 0 x 0 0 0 x 0 |
|||
// ... |
|||
// 0 0 0 x 0 0 0 x 0 0 0 x 0 0 0 x |
|||
// ... |
|||
SpdStoreIntermediateH(x * 4 + y, y * 4, v); |
|||
} |
|||
#else |
|||
if (localInvocationIndex < 64) |
|||
{ |
|||
FfxFloat16x4 v = SpdLoadIntermediateH(x * 2 + y % 2, y * 2); |
|||
v = SpdReduceQuadH(v); |
|||
// quad index 0 stores result |
|||
if (localInvocationIndex % 4 == 0) |
|||
{ |
|||
SpdStoreH(FfxInt32x2(workGroupID.xy * 4) + FfxInt32x2(x / 2, y / 2), v, mip, slice); |
|||
SpdStoreIntermediateH(x * 2 + y / 2, y * 2, v); |
|||
} |
|||
} |
|||
#endif |
|||
} |
|||
|
|||
void SpdDownsampleMip_4H(FfxUInt32 x, FfxUInt32 y, FfxUInt32x2 workGroupID, FfxUInt32 localInvocationIndex, FfxUInt32 mip, FfxUInt32 slice) |
|||
{ |
|||
#ifdef SPD_NO_WAVE_OPERATIONS |
|||
if (localInvocationIndex < 4) |
|||
{ |
|||
// x 0 0 0 x 0 0 0 |
|||
// ... |
|||
// 0 x 0 0 0 x 0 0 |
|||
FfxFloat16x4 v = SpdReduceIntermediateH(FfxUInt32x2(x * 8 + 0 + 0 + y * 2, y * 8 + 0), |
|||
FfxUInt32x2(x * 8 + 4 + 0 + y * 2, y * 8 + 0), |
|||
FfxUInt32x2(x * 8 + 0 + 1 + y * 2, y * 8 + 4), |
|||
FfxUInt32x2(x * 8 + 4 + 1 + y * 2, y * 8 + 4)); |
|||
SpdStoreH(FfxInt32x2(workGroupID.xy * 2) + FfxInt32x2(x, y), v, mip, slice); |
|||
// store to LDS |
|||
// x x x x 0 ... |
|||
// 0 ... |
|||
SpdStoreIntermediateH(x + y * 2, 0, v); |
|||
} |
|||
#else |
|||
if (localInvocationIndex < 16) |
|||
{ |
|||
FfxFloat16x4 v = SpdLoadIntermediateH(x * 4 + y, y * 4); |
|||
v = SpdReduceQuadH(v); |
|||
// quad index 0 stores result |
|||
if (localInvocationIndex % 4 == 0) |
|||
{ |
|||
SpdStoreH(FfxInt32x2(workGroupID.xy * 2) + FfxInt32x2(x / 2, y / 2), v, mip, slice); |
|||
SpdStoreIntermediateH(x / 2 + y, 0, v); |
|||
} |
|||
} |
|||
#endif |
|||
} |
|||
|
|||
void SpdDownsampleMip_5H(FfxUInt32x2 workGroupID, FfxUInt32 localInvocationIndex, FfxUInt32 mip, FfxUInt32 slice) |
|||
{ |
|||
#ifdef SPD_NO_WAVE_OPERATIONS |
|||
if (localInvocationIndex < 1) |
|||
{ |
|||
// x x x x 0 ... |
|||
// 0 ... |
|||
FfxFloat16x4 v = SpdReduceIntermediateH(FfxUInt32x2(0, 0), FfxUInt32x2(1, 0), FfxUInt32x2(2, 0), FfxUInt32x2(3, 0)); |
|||
SpdStoreH(FfxInt32x2(workGroupID.xy), v, mip, slice); |
|||
} |
|||
#else |
|||
if (localInvocationIndex < 4) |
|||
{ |
|||
FfxFloat16x4 v = SpdLoadIntermediateH(localInvocationIndex, 0); |
|||
v = SpdReduceQuadH(v); |
|||
// quad index 0 stores result |
|||
if (localInvocationIndex % 4 == 0) |
|||
{ |
|||
SpdStoreH(FfxInt32x2(workGroupID.xy), v, mip, slice); |
|||
} |
|||
} |
|||
#endif |
|||
} |
|||
|
|||
void SpdDownsampleMips_6_7H(FfxUInt32 x, FfxUInt32 y, FfxUInt32 mips, FfxUInt32 slice) |
|||
{ |
|||
FfxInt32x2 tex = FfxInt32x2(x * 4 + 0, y * 4 + 0); |
|||
FfxInt32x2 pix = FfxInt32x2(x * 2 + 0, y * 2 + 0); |
|||
FfxFloat16x4 v0 = SpdReduceLoad4H(tex, slice); |
|||
SpdStoreH(pix, v0, 6, slice); |
|||
|
|||
tex = FfxInt32x2(x * 4 + 2, y * 4 + 0); |
|||
pix = FfxInt32x2(x * 2 + 1, y * 2 + 0); |
|||
FfxFloat16x4 v1 = SpdReduceLoad4H(tex, slice); |
|||
SpdStoreH(pix, v1, 6, slice); |
|||
|
|||
tex = FfxInt32x2(x * 4 + 0, y * 4 + 2); |
|||
pix = FfxInt32x2(x * 2 + 0, y * 2 + 1); |
|||
FfxFloat16x4 v2 = SpdReduceLoad4H(tex, slice); |
|||
SpdStoreH(pix, v2, 6, slice); |
|||
|
|||
tex = FfxInt32x2(x * 4 + 2, y * 4 + 2); |
|||
pix = FfxInt32x2(x * 2 + 1, y * 2 + 1); |
|||
FfxFloat16x4 v3 = SpdReduceLoad4H(tex, slice); |
|||
SpdStoreH(pix, v3, 6, slice); |
|||
|
|||
if (mips < 8) |
|||
return; |
|||
// no barrier needed, working on values only from the same thread |
|||
|
|||
FfxFloat16x4 v = SpdReduce4H(v0, v1, v2, v3); |
|||
SpdStoreH(FfxInt32x2(x, y), v, 7, slice); |
|||
SpdStoreIntermediateH(x, y, v); |
|||
} |
|||
|
|||
void SpdDownsampleNextFourH(FfxUInt32 x, FfxUInt32 y, FfxUInt32x2 workGroupID, FfxUInt32 localInvocationIndex, FfxUInt32 baseMip, FfxUInt32 mips, FfxUInt32 slice) |
|||
{ |
|||
if (mips <= baseMip) |
|||
return; |
|||
SpdWorkgroupShuffleBarrier(); |
|||
SpdDownsampleMip_2H(x, y, workGroupID, localInvocationIndex, baseMip, slice); |
|||
|
|||
if (mips <= baseMip + 1) |
|||
return; |
|||
SpdWorkgroupShuffleBarrier(); |
|||
SpdDownsampleMip_3H(x, y, workGroupID, localInvocationIndex, baseMip + 1, slice); |
|||
|
|||
if (mips <= baseMip + 2) |
|||
return; |
|||
SpdWorkgroupShuffleBarrier(); |
|||
SpdDownsampleMip_4H(x, y, workGroupID, localInvocationIndex, baseMip + 2, slice); |
|||
|
|||
if (mips <= baseMip + 3) |
|||
return; |
|||
SpdWorkgroupShuffleBarrier(); |
|||
SpdDownsampleMip_5H(workGroupID, localInvocationIndex, baseMip + 3, slice); |
|||
} |
|||
|
|||
void SpdDownsampleH(FfxUInt32x2 workGroupID, FfxUInt32 localInvocationIndex, FfxUInt32 mips, FfxUInt32 numWorkGroups, FfxUInt32 slice) |
|||
{ |
|||
FfxUInt32x2 sub_xy = ffxRemapForWaveReduction(localInvocationIndex % 64); |
|||
FfxUInt32 x = sub_xy.x + 8 * ((localInvocationIndex >> 6) % 2); |
|||
FfxUInt32 y = sub_xy.y + 8 * ((localInvocationIndex >> 7)); |
|||
|
|||
SpdDownsampleMips_0_1H(x, y, workGroupID, localInvocationIndex, mips, slice); |
|||
|
|||
SpdDownsampleNextFourH(x, y, workGroupID, localInvocationIndex, 2, mips, slice); |
|||
|
|||
if (mips < 7) |
|||
return; |
|||
|
|||
if (SpdExitWorkgroup(numWorkGroups, localInvocationIndex, slice)) |
|||
return; |
|||
|
|||
SpdResetAtomicCounter(slice); |
|||
|
|||
// After mip 6 there is only a single workgroup left that downsamples the remaining up to 64x64 texels. |
|||
SpdDownsampleMips_6_7H(x, y, mips, slice); |
|||
|
|||
SpdDownsampleNextFourH(x, y, FfxUInt32x2(0, 0), localInvocationIndex, 8, mips, slice); |
|||
} |
|||
|
|||
void SpdDownsampleH(FfxUInt32x2 workGroupID, FfxUInt32 localInvocationIndex, FfxUInt32 mips, FfxUInt32 numWorkGroups, FfxUInt32 slice, FfxUInt32x2 workGroupOffset) |
|||
{ |
|||
SpdDownsampleH(workGroupID + workGroupOffset, localInvocationIndex, mips, numWorkGroups, slice); |
|||
} |
|||
|
|||
#endif // #if FFX_HALF |
|||
#endif // #ifdef FFX_GPU |
|||
@ -0,0 +1,27 @@ |
|||
fileFormatVersion: 2 |
|||
guid: 37829421a92b3754c97640dfa9babbc0 |
|||
PluginImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
iconMap: {} |
|||
executionOrder: {} |
|||
defineConstraints: [] |
|||
isPreloaded: 0 |
|||
isOverridable: 0 |
|||
isExplicitlyReferenced: 0 |
|||
validateReferences: 1 |
|||
platformData: |
|||
- first: |
|||
Any: |
|||
second: |
|||
enabled: 1 |
|||
settings: {} |
|||
- first: |
|||
Editor: Editor |
|||
second: |
|||
enabled: 0 |
|||
settings: |
|||
DefaultValueInitialized: true |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
@ -0,0 +1,17 @@ |
|||
|
|||
Microsoft Visual Studio Solution File, Format Version 11.00 |
|||
# Visual Studio 2010 |
|||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Assembly-CSharp", "Assembly-CSharp.csproj", "{ff4efef8-0523-63da-ea8a-38e4fad76a23}" |
|||
EndProject |
|||
Global |
|||
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
|||
Debug|Any CPU = Debug|Any CPU |
|||
EndGlobalSection |
|||
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
|||
{ff4efef8-0523-63da-ea8a-38e4fad76a23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
|||
{ff4efef8-0523-63da-ea8a-38e4fad76a23}.Debug|Any CPU.Build.0 = Debug|Any CPU |
|||
EndGlobalSection |
|||
GlobalSection(SolutionProperties) = preSolution |
|||
HideSolutionNode = FALSE |
|||
EndGlobalSection |
|||
EndGlobal |
|||
@ -0,0 +1,45 @@ |
|||
{ |
|||
"dependencies": { |
|||
"com.unity.collab-proxy": "1.15.18", |
|||
"com.unity.feature.development": "1.0.1", |
|||
"com.unity.ide.rider": "3.0.14", |
|||
"com.unity.ide.visualstudio": "2.0.15", |
|||
"com.unity.ide.vscode": "1.2.5", |
|||
"com.unity.test-framework": "1.1.31", |
|||
"com.unity.textmeshpro": "3.0.6", |
|||
"com.unity.timeline": "1.6.4", |
|||
"com.unity.ugui": "1.0.0", |
|||
"com.unity.visualscripting": "1.7.8", |
|||
"com.unity.modules.ai": "1.0.0", |
|||
"com.unity.modules.androidjni": "1.0.0", |
|||
"com.unity.modules.animation": "1.0.0", |
|||
"com.unity.modules.assetbundle": "1.0.0", |
|||
"com.unity.modules.audio": "1.0.0", |
|||
"com.unity.modules.cloth": "1.0.0", |
|||
"com.unity.modules.director": "1.0.0", |
|||
"com.unity.modules.imageconversion": "1.0.0", |
|||
"com.unity.modules.imgui": "1.0.0", |
|||
"com.unity.modules.jsonserialize": "1.0.0", |
|||
"com.unity.modules.particlesystem": "1.0.0", |
|||
"com.unity.modules.physics": "1.0.0", |
|||
"com.unity.modules.physics2d": "1.0.0", |
|||
"com.unity.modules.screencapture": "1.0.0", |
|||
"com.unity.modules.terrain": "1.0.0", |
|||
"com.unity.modules.terrainphysics": "1.0.0", |
|||
"com.unity.modules.tilemap": "1.0.0", |
|||
"com.unity.modules.ui": "1.0.0", |
|||
"com.unity.modules.uielements": "1.0.0", |
|||
"com.unity.modules.umbra": "1.0.0", |
|||
"com.unity.modules.unityanalytics": "1.0.0", |
|||
"com.unity.modules.unitywebrequest": "1.0.0", |
|||
"com.unity.modules.unitywebrequestassetbundle": "1.0.0", |
|||
"com.unity.modules.unitywebrequestaudio": "1.0.0", |
|||
"com.unity.modules.unitywebrequesttexture": "1.0.0", |
|||
"com.unity.modules.unitywebrequestwww": "1.0.0", |
|||
"com.unity.modules.vehicles": "1.0.0", |
|||
"com.unity.modules.video": "1.0.0", |
|||
"com.unity.modules.vr": "1.0.0", |
|||
"com.unity.modules.wind": "1.0.0", |
|||
"com.unity.modules.xr": "1.0.0" |
|||
} |
|||
} |
|||
@ -0,0 +1,413 @@ |
|||
{ |
|||
"dependencies": { |
|||
"com.unity.collab-proxy": { |
|||
"version": "1.15.18", |
|||
"depth": 0, |
|||
"source": "registry", |
|||
"dependencies": { |
|||
"com.unity.services.core": "1.0.1" |
|||
}, |
|||
"url": "https://packages.unity.com" |
|||
}, |
|||
"com.unity.editorcoroutines": { |
|||
"version": "1.0.0", |
|||
"depth": 1, |
|||
"source": "registry", |
|||
"dependencies": {}, |
|||
"url": "https://packages.unity.com" |
|||
}, |
|||
"com.unity.ext.nunit": { |
|||
"version": "1.0.6", |
|||
"depth": 1, |
|||
"source": "registry", |
|||
"dependencies": {}, |
|||
"url": "https://packages.unity.com" |
|||
}, |
|||
"com.unity.feature.development": { |
|||
"version": "1.0.1", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": { |
|||
"com.unity.ide.visualstudio": "2.0.15", |
|||
"com.unity.ide.rider": "3.0.14", |
|||
"com.unity.ide.vscode": "1.2.5", |
|||
"com.unity.editorcoroutines": "1.0.0", |
|||
"com.unity.performance.profile-analyzer": "1.1.1", |
|||
"com.unity.test-framework": "1.1.31", |
|||
"com.unity.testtools.codecoverage": "1.0.1" |
|||
} |
|||
}, |
|||
"com.unity.ide.rider": { |
|||
"version": "3.0.14", |
|||
"depth": 0, |
|||
"source": "registry", |
|||
"dependencies": { |
|||
"com.unity.ext.nunit": "1.0.6" |
|||
}, |
|||
"url": "https://packages.unity.com" |
|||
}, |
|||
"com.unity.ide.visualstudio": { |
|||
"version": "2.0.15", |
|||
"depth": 0, |
|||
"source": "registry", |
|||
"dependencies": { |
|||
"com.unity.test-framework": "1.1.9" |
|||
}, |
|||
"url": "https://packages.unity.com" |
|||
}, |
|||
"com.unity.ide.vscode": { |
|||
"version": "1.2.5", |
|||
"depth": 0, |
|||
"source": "registry", |
|||
"dependencies": {}, |
|||
"url": "https://packages.unity.com" |
|||
}, |
|||
"com.unity.nuget.newtonsoft-json": { |
|||
"version": "3.0.2", |
|||
"depth": 2, |
|||
"source": "registry", |
|||
"dependencies": {}, |
|||
"url": "https://packages.unity.com" |
|||
}, |
|||
"com.unity.performance.profile-analyzer": { |
|||
"version": "1.1.1", |
|||
"depth": 1, |
|||
"source": "registry", |
|||
"dependencies": {}, |
|||
"url": "https://packages.unity.com" |
|||
}, |
|||
"com.unity.services.core": { |
|||
"version": "1.4.0", |
|||
"depth": 1, |
|||
"source": "registry", |
|||
"dependencies": { |
|||
"com.unity.modules.unitywebrequest": "1.0.0", |
|||
"com.unity.nuget.newtonsoft-json": "3.0.2", |
|||
"com.unity.modules.androidjni": "1.0.0" |
|||
}, |
|||
"url": "https://packages.unity.com" |
|||
}, |
|||
"com.unity.settings-manager": { |
|||
"version": "1.0.3", |
|||
"depth": 2, |
|||
"source": "registry", |
|||
"dependencies": {}, |
|||
"url": "https://packages.unity.com" |
|||
}, |
|||
"com.unity.test-framework": { |
|||
"version": "1.1.31", |
|||
"depth": 0, |
|||
"source": "registry", |
|||
"dependencies": { |
|||
"com.unity.ext.nunit": "1.0.6", |
|||
"com.unity.modules.imgui": "1.0.0", |
|||
"com.unity.modules.jsonserialize": "1.0.0" |
|||
}, |
|||
"url": "https://packages.unity.com" |
|||
}, |
|||
"com.unity.testtools.codecoverage": { |
|||
"version": "1.0.1", |
|||
"depth": 1, |
|||
"source": "registry", |
|||
"dependencies": { |
|||
"com.unity.test-framework": "1.0.16", |
|||
"com.unity.settings-manager": "1.0.1" |
|||
}, |
|||
"url": "https://packages.unity.com" |
|||
}, |
|||
"com.unity.textmeshpro": { |
|||
"version": "3.0.6", |
|||
"depth": 0, |
|||
"source": "registry", |
|||
"dependencies": { |
|||
"com.unity.ugui": "1.0.0" |
|||
}, |
|||
"url": "https://packages.unity.com" |
|||
}, |
|||
"com.unity.timeline": { |
|||
"version": "1.6.4", |
|||
"depth": 0, |
|||
"source": "registry", |
|||
"dependencies": { |
|||
"com.unity.modules.director": "1.0.0", |
|||
"com.unity.modules.animation": "1.0.0", |
|||
"com.unity.modules.audio": "1.0.0", |
|||
"com.unity.modules.particlesystem": "1.0.0" |
|||
}, |
|||
"url": "https://packages.unity.com" |
|||
}, |
|||
"com.unity.ugui": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": { |
|||
"com.unity.modules.ui": "1.0.0", |
|||
"com.unity.modules.imgui": "1.0.0" |
|||
} |
|||
}, |
|||
"com.unity.visualscripting": { |
|||
"version": "1.7.8", |
|||
"depth": 0, |
|||
"source": "registry", |
|||
"dependencies": { |
|||
"com.unity.ugui": "1.0.0", |
|||
"com.unity.modules.jsonserialize": "1.0.0" |
|||
}, |
|||
"url": "https://packages.unity.com" |
|||
}, |
|||
"com.unity.modules.ai": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": {} |
|||
}, |
|||
"com.unity.modules.androidjni": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": {} |
|||
}, |
|||
"com.unity.modules.animation": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": {} |
|||
}, |
|||
"com.unity.modules.assetbundle": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": {} |
|||
}, |
|||
"com.unity.modules.audio": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": {} |
|||
}, |
|||
"com.unity.modules.cloth": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": { |
|||
"com.unity.modules.physics": "1.0.0" |
|||
} |
|||
}, |
|||
"com.unity.modules.director": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": { |
|||
"com.unity.modules.audio": "1.0.0", |
|||
"com.unity.modules.animation": "1.0.0" |
|||
} |
|||
}, |
|||
"com.unity.modules.imageconversion": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": {} |
|||
}, |
|||
"com.unity.modules.imgui": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": {} |
|||
}, |
|||
"com.unity.modules.jsonserialize": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": {} |
|||
}, |
|||
"com.unity.modules.particlesystem": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": {} |
|||
}, |
|||
"com.unity.modules.physics": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": {} |
|||
}, |
|||
"com.unity.modules.physics2d": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": {} |
|||
}, |
|||
"com.unity.modules.screencapture": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": { |
|||
"com.unity.modules.imageconversion": "1.0.0" |
|||
} |
|||
}, |
|||
"com.unity.modules.subsystems": { |
|||
"version": "1.0.0", |
|||
"depth": 1, |
|||
"source": "builtin", |
|||
"dependencies": { |
|||
"com.unity.modules.jsonserialize": "1.0.0" |
|||
} |
|||
}, |
|||
"com.unity.modules.terrain": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": {} |
|||
}, |
|||
"com.unity.modules.terrainphysics": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": { |
|||
"com.unity.modules.physics": "1.0.0", |
|||
"com.unity.modules.terrain": "1.0.0" |
|||
} |
|||
}, |
|||
"com.unity.modules.tilemap": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": { |
|||
"com.unity.modules.physics2d": "1.0.0" |
|||
} |
|||
}, |
|||
"com.unity.modules.ui": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": {} |
|||
}, |
|||
"com.unity.modules.uielements": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": { |
|||
"com.unity.modules.ui": "1.0.0", |
|||
"com.unity.modules.imgui": "1.0.0", |
|||
"com.unity.modules.jsonserialize": "1.0.0", |
|||
"com.unity.modules.uielementsnative": "1.0.0" |
|||
} |
|||
}, |
|||
"com.unity.modules.uielementsnative": { |
|||
"version": "1.0.0", |
|||
"depth": 1, |
|||
"source": "builtin", |
|||
"dependencies": { |
|||
"com.unity.modules.ui": "1.0.0", |
|||
"com.unity.modules.imgui": "1.0.0", |
|||
"com.unity.modules.jsonserialize": "1.0.0" |
|||
} |
|||
}, |
|||
"com.unity.modules.umbra": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": {} |
|||
}, |
|||
"com.unity.modules.unityanalytics": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": { |
|||
"com.unity.modules.unitywebrequest": "1.0.0", |
|||
"com.unity.modules.jsonserialize": "1.0.0" |
|||
} |
|||
}, |
|||
"com.unity.modules.unitywebrequest": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": {} |
|||
}, |
|||
"com.unity.modules.unitywebrequestassetbundle": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": { |
|||
"com.unity.modules.assetbundle": "1.0.0", |
|||
"com.unity.modules.unitywebrequest": "1.0.0" |
|||
} |
|||
}, |
|||
"com.unity.modules.unitywebrequestaudio": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": { |
|||
"com.unity.modules.unitywebrequest": "1.0.0", |
|||
"com.unity.modules.audio": "1.0.0" |
|||
} |
|||
}, |
|||
"com.unity.modules.unitywebrequesttexture": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": { |
|||
"com.unity.modules.unitywebrequest": "1.0.0", |
|||
"com.unity.modules.imageconversion": "1.0.0" |
|||
} |
|||
}, |
|||
"com.unity.modules.unitywebrequestwww": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": { |
|||
"com.unity.modules.unitywebrequest": "1.0.0", |
|||
"com.unity.modules.unitywebrequestassetbundle": "1.0.0", |
|||
"com.unity.modules.unitywebrequestaudio": "1.0.0", |
|||
"com.unity.modules.audio": "1.0.0", |
|||
"com.unity.modules.assetbundle": "1.0.0", |
|||
"com.unity.modules.imageconversion": "1.0.0" |
|||
} |
|||
}, |
|||
"com.unity.modules.vehicles": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": { |
|||
"com.unity.modules.physics": "1.0.0" |
|||
} |
|||
}, |
|||
"com.unity.modules.video": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": { |
|||
"com.unity.modules.audio": "1.0.0", |
|||
"com.unity.modules.ui": "1.0.0", |
|||
"com.unity.modules.unitywebrequest": "1.0.0" |
|||
} |
|||
}, |
|||
"com.unity.modules.vr": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": { |
|||
"com.unity.modules.jsonserialize": "1.0.0", |
|||
"com.unity.modules.physics": "1.0.0", |
|||
"com.unity.modules.xr": "1.0.0" |
|||
} |
|||
}, |
|||
"com.unity.modules.wind": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": {} |
|||
}, |
|||
"com.unity.modules.xr": { |
|||
"version": "1.0.0", |
|||
"depth": 0, |
|||
"source": "builtin", |
|||
"dependencies": { |
|||
"com.unity.modules.physics": "1.0.0", |
|||
"com.unity.modules.jsonserialize": "1.0.0", |
|||
"com.unity.modules.subsystems": "1.0.0" |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,19 @@ |
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!11 &1 |
|||
AudioManager: |
|||
m_ObjectHideFlags: 0 |
|||
serializedVersion: 2 |
|||
m_Volume: 1 |
|||
Rolloff Scale: 1 |
|||
Doppler Factor: 1 |
|||
Default Speaker Mode: 2 |
|||
m_SampleRate: 0 |
|||
m_DSPBufferSize: 1024 |
|||
m_VirtualVoiceCount: 512 |
|||
m_RealVoiceCount: 32 |
|||
m_SpatializerPlugin: |
|||
m_AmbisonicDecoderPlugin: |
|||
m_DisableAudio: 0 |
|||
m_VirtualizeEffects: 1 |
|||
m_RequestedDSPBufferSize: 1024 |
|||
@ -0,0 +1,6 @@ |
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!236 &1 |
|||
ClusterInputManager: |
|||
m_ObjectHideFlags: 0 |
|||
m_Inputs: [] |
|||
@ -0,0 +1,34 @@ |
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!55 &1 |
|||
PhysicsManager: |
|||
m_ObjectHideFlags: 0 |
|||
serializedVersion: 11 |
|||
m_Gravity: {x: 0, y: -9.81, z: 0} |
|||
m_DefaultMaterial: {fileID: 0} |
|||
m_BounceThreshold: 2 |
|||
m_SleepThreshold: 0.005 |
|||
m_DefaultContactOffset: 0.01 |
|||
m_DefaultSolverIterations: 6 |
|||
m_DefaultSolverVelocityIterations: 1 |
|||
m_QueriesHitBackfaces: 0 |
|||
m_QueriesHitTriggers: 1 |
|||
m_EnableAdaptiveForce: 0 |
|||
m_ClothInterCollisionDistance: 0 |
|||
m_ClothInterCollisionStiffness: 0 |
|||
m_ContactsGeneration: 1 |
|||
m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff |
|||
m_AutoSimulation: 1 |
|||
m_AutoSyncTransforms: 0 |
|||
m_ReuseCollisionCallbacks: 1 |
|||
m_ClothInterCollisionSettingsToggle: 0 |
|||
m_ContactPairsMode: 0 |
|||
m_BroadphaseType: 0 |
|||
m_WorldBounds: |
|||
m_Center: {x: 0, y: 0, z: 0} |
|||
m_Extent: {x: 250, y: 250, z: 250} |
|||
m_WorldSubdivisions: 8 |
|||
m_FrictionType: 0 |
|||
m_EnableEnhancedDeterminism: 0 |
|||
m_EnableUnifiedHeightmaps: 1 |
|||
m_DefaultMaxAngluarSpeed: 7 |
|||
@ -0,0 +1,8 @@ |
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!1045 &1 |
|||
EditorBuildSettings: |
|||
m_ObjectHideFlags: 0 |
|||
serializedVersion: 2 |
|||
m_Scenes: [] |
|||
m_configObjects: {} |
|||
@ -0,0 +1,30 @@ |
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!159 &1 |
|||
EditorSettings: |
|||
m_ObjectHideFlags: 0 |
|||
serializedVersion: 11 |
|||
m_ExternalVersionControlSupport: Visible Meta Files |
|||
m_SerializationMode: 2 |
|||
m_LineEndingsForNewScripts: 0 |
|||
m_DefaultBehaviorMode: 0 |
|||
m_PrefabRegularEnvironment: {fileID: 0} |
|||
m_PrefabUIEnvironment: {fileID: 0} |
|||
m_SpritePackerMode: 0 |
|||
m_SpritePackerPaddingPower: 1 |
|||
m_EtcTextureCompressorBehavior: 1 |
|||
m_EtcTextureFastCompressor: 1 |
|||
m_EtcTextureNormalCompressor: 2 |
|||
m_EtcTextureBestCompressor: 4 |
|||
m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref |
|||
m_ProjectGenerationRootNamespace: |
|||
m_CollabEditorSettings: |
|||
inProgressEnabled: 1 |
|||
m_EnableTextureStreamingInEditMode: 1 |
|||
m_EnableTextureStreamingInPlayMode: 1 |
|||
m_AsyncShaderCompilation: 1 |
|||
m_EnterPlayModeOptionsEnabled: 0 |
|||
m_EnterPlayModeOptions: 3 |
|||
m_ShowLightmapResolutionOverlay: 1 |
|||
m_UseLegacyProbeSampleCount: 0 |
|||
m_SerializeInlineMappingsOnOneLine: 1 |
|||
@ -0,0 +1,11 @@ |
|||
{ |
|||
"buildSubtarget": 0, |
|||
"deploymentMethod": 0, |
|||
"deploymentDrive": 0, |
|||
"scid": "00000000-0000-0000-0000-000000000000", |
|||
"packageEncryption": 0, |
|||
"xboxSeriesSResolutionWidth": 2560, |
|||
"xboxSeriesSResolutionHeight": 1440, |
|||
"xboxSeriesXResolutionWidth": 3840, |
|||
"xboxSeriesXResolutionHeight": 2160 |
|||
} |
|||
@ -0,0 +1,14 @@ |
|||
{ |
|||
"buildSubtarget": 0, |
|||
"deploymentMethod": 0, |
|||
"deploymentDrive": 0, |
|||
"scid": "00000000-0000-0000-0000-000000000000", |
|||
"packageEncryption": 0, |
|||
"xboxOneResolutionWidth": 1920, |
|||
"xboxOneResolutionHeight": 1080, |
|||
"xboxOneSResolutionWidth": 1920, |
|||
"xboxOneSResolutionHeight": 1080, |
|||
"xboxOneXResolutionWidth": 3840, |
|||
"xboxOneXResolutionHeight": 2160, |
|||
"esramDisabled": false |
|||
} |
|||
@ -0,0 +1,63 @@ |
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!30 &1 |
|||
GraphicsSettings: |
|||
m_ObjectHideFlags: 0 |
|||
serializedVersion: 13 |
|||
m_Deferred: |
|||
m_Mode: 1 |
|||
m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} |
|||
m_DeferredReflections: |
|||
m_Mode: 1 |
|||
m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} |
|||
m_ScreenSpaceShadows: |
|||
m_Mode: 1 |
|||
m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} |
|||
m_LegacyDeferred: |
|||
m_Mode: 1 |
|||
m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} |
|||
m_DepthNormals: |
|||
m_Mode: 1 |
|||
m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} |
|||
m_MotionVectors: |
|||
m_Mode: 1 |
|||
m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} |
|||
m_LightHalo: |
|||
m_Mode: 1 |
|||
m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} |
|||
m_LensFlare: |
|||
m_Mode: 1 |
|||
m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} |
|||
m_AlwaysIncludedShaders: |
|||
- {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} |
|||
- {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} |
|||
- {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} |
|||
- {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} |
|||
- {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} |
|||
- {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} |
|||
m_PreloadedShaders: [] |
|||
m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, |
|||
type: 0} |
|||
m_CustomRenderPipeline: {fileID: 0} |
|||
m_TransparencySortMode: 0 |
|||
m_TransparencySortAxis: {x: 0, y: 0, z: 1} |
|||
m_DefaultRenderingPath: 1 |
|||
m_DefaultMobileRenderingPath: 1 |
|||
m_TierSettings: [] |
|||
m_LightmapStripping: 0 |
|||
m_FogStripping: 0 |
|||
m_InstancingStripping: 0 |
|||
m_LightmapKeepPlain: 1 |
|||
m_LightmapKeepDirCombined: 1 |
|||
m_LightmapKeepDynamicPlain: 1 |
|||
m_LightmapKeepDynamicDirCombined: 1 |
|||
m_LightmapKeepShadowMask: 1 |
|||
m_LightmapKeepSubtractive: 1 |
|||
m_FogKeepLinear: 1 |
|||
m_FogKeepExp: 1 |
|||
m_FogKeepExp2: 1 |
|||
m_AlbedoSwatchInfos: [] |
|||
m_LightsUseLinearIntensity: 0 |
|||
m_LightsUseColorTemperature: 0 |
|||
m_LogWhenShaderIsCompiled: 0 |
|||
m_AllowEnlightenSupportForUpgradedProject: 0 |
|||
@ -0,0 +1,295 @@ |
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!13 &1 |
|||
InputManager: |
|||
m_ObjectHideFlags: 0 |
|||
serializedVersion: 2 |
|||
m_Axes: |
|||
- serializedVersion: 3 |
|||
m_Name: Horizontal |
|||
descriptiveName: |
|||
descriptiveNegativeName: |
|||
negativeButton: left |
|||
positiveButton: right |
|||
altNegativeButton: a |
|||
altPositiveButton: d |
|||
gravity: 3 |
|||
dead: 0.001 |
|||
sensitivity: 3 |
|||
snap: 1 |
|||
invert: 0 |
|||
type: 0 |
|||
axis: 0 |
|||
joyNum: 0 |
|||
- serializedVersion: 3 |
|||
m_Name: Vertical |
|||
descriptiveName: |
|||
descriptiveNegativeName: |
|||
negativeButton: down |
|||
positiveButton: up |
|||
altNegativeButton: s |
|||
altPositiveButton: w |
|||
gravity: 3 |
|||
dead: 0.001 |
|||
sensitivity: 3 |
|||
snap: 1 |
|||
invert: 0 |
|||
type: 0 |
|||
axis: 0 |
|||
joyNum: 0 |
|||
- serializedVersion: 3 |
|||
m_Name: Fire1 |
|||
descriptiveName: |
|||
descriptiveNegativeName: |
|||
negativeButton: |
|||
positiveButton: left ctrl |
|||
altNegativeButton: |
|||
altPositiveButton: mouse 0 |
|||
gravity: 1000 |
|||
dead: 0.001 |
|||
sensitivity: 1000 |
|||
snap: 0 |
|||
invert: 0 |
|||
type: 0 |
|||
axis: 0 |
|||
joyNum: 0 |
|||
- serializedVersion: 3 |
|||
m_Name: Fire2 |
|||
descriptiveName: |
|||
descriptiveNegativeName: |
|||
negativeButton: |
|||
positiveButton: left alt |
|||
altNegativeButton: |
|||
altPositiveButton: mouse 1 |
|||
gravity: 1000 |
|||
dead: 0.001 |
|||
sensitivity: 1000 |
|||
snap: 0 |
|||
invert: 0 |
|||
type: 0 |
|||
axis: 0 |
|||
joyNum: 0 |
|||
- serializedVersion: 3 |
|||
m_Name: Fire3 |
|||
descriptiveName: |
|||
descriptiveNegativeName: |
|||
negativeButton: |
|||
positiveButton: left shift |
|||
altNegativeButton: |
|||
altPositiveButton: mouse 2 |
|||
gravity: 1000 |
|||
dead: 0.001 |
|||
sensitivity: 1000 |
|||
snap: 0 |
|||
invert: 0 |
|||
type: 0 |
|||
axis: 0 |
|||
joyNum: 0 |
|||
- serializedVersion: 3 |
|||
m_Name: Jump |
|||
descriptiveName: |
|||
descriptiveNegativeName: |
|||
negativeButton: |
|||
positiveButton: space |
|||
altNegativeButton: |
|||
altPositiveButton: |
|||
gravity: 1000 |
|||
dead: 0.001 |
|||
sensitivity: 1000 |
|||
snap: 0 |
|||
invert: 0 |
|||
type: 0 |
|||
axis: 0 |
|||
joyNum: 0 |
|||
- serializedVersion: 3 |
|||
m_Name: Mouse X |
|||
descriptiveName: |
|||
descriptiveNegativeName: |
|||
negativeButton: |
|||
positiveButton: |
|||
altNegativeButton: |
|||
altPositiveButton: |
|||
gravity: 0 |
|||
dead: 0 |
|||
sensitivity: 0.1 |
|||
snap: 0 |
|||
invert: 0 |
|||
type: 1 |
|||
axis: 0 |
|||
joyNum: 0 |
|||
- serializedVersion: 3 |
|||
m_Name: Mouse Y |
|||
descriptiveName: |
|||
descriptiveNegativeName: |
|||
negativeButton: |
|||
positiveButton: |
|||
altNegativeButton: |
|||
altPositiveButton: |
|||
gravity: 0 |
|||
dead: 0 |
|||
sensitivity: 0.1 |
|||
snap: 0 |
|||
invert: 0 |
|||
type: 1 |
|||
axis: 1 |
|||
joyNum: 0 |
|||
- serializedVersion: 3 |
|||
m_Name: Mouse ScrollWheel |
|||
descriptiveName: |
|||
descriptiveNegativeName: |
|||
negativeButton: |
|||
positiveButton: |
|||
altNegativeButton: |
|||
altPositiveButton: |
|||
gravity: 0 |
|||
dead: 0 |
|||
sensitivity: 0.1 |
|||
snap: 0 |
|||
invert: 0 |
|||
type: 1 |
|||
axis: 2 |
|||
joyNum: 0 |
|||
- serializedVersion: 3 |
|||
m_Name: Horizontal |
|||
descriptiveName: |
|||
descriptiveNegativeName: |
|||
negativeButton: |
|||
positiveButton: |
|||
altNegativeButton: |
|||
altPositiveButton: |
|||
gravity: 0 |
|||
dead: 0.19 |
|||
sensitivity: 1 |
|||
snap: 0 |
|||
invert: 0 |
|||
type: 2 |
|||
axis: 0 |
|||
joyNum: 0 |
|||
- serializedVersion: 3 |
|||
m_Name: Vertical |
|||
descriptiveName: |
|||
descriptiveNegativeName: |
|||
negativeButton: |
|||
positiveButton: |
|||
altNegativeButton: |
|||
altPositiveButton: |
|||
gravity: 0 |
|||
dead: 0.19 |
|||
sensitivity: 1 |
|||
snap: 0 |
|||
invert: 1 |
|||
type: 2 |
|||
axis: 1 |
|||
joyNum: 0 |
|||
- serializedVersion: 3 |
|||
m_Name: Fire1 |
|||
descriptiveName: |
|||
descriptiveNegativeName: |
|||
negativeButton: |
|||
positiveButton: joystick button 0 |
|||
altNegativeButton: |
|||
altPositiveButton: |
|||
gravity: 1000 |
|||
dead: 0.001 |
|||
sensitivity: 1000 |
|||
snap: 0 |
|||
invert: 0 |
|||
type: 0 |
|||
axis: 0 |
|||
joyNum: 0 |
|||
- serializedVersion: 3 |
|||
m_Name: Fire2 |
|||
descriptiveName: |
|||
descriptiveNegativeName: |
|||
negativeButton: |
|||
positiveButton: joystick button 1 |
|||
altNegativeButton: |
|||
altPositiveButton: |
|||
gravity: 1000 |
|||
dead: 0.001 |
|||
sensitivity: 1000 |
|||
snap: 0 |
|||
invert: 0 |
|||
type: 0 |
|||
axis: 0 |
|||
joyNum: 0 |
|||
- serializedVersion: 3 |
|||
m_Name: Fire3 |
|||
descriptiveName: |
|||
descriptiveNegativeName: |
|||
negativeButton: |
|||
positiveButton: joystick button 2 |
|||
altNegativeButton: |
|||
altPositiveButton: |
|||
gravity: 1000 |
|||
dead: 0.001 |
|||
sensitivity: 1000 |
|||
snap: 0 |
|||
invert: 0 |
|||
type: 0 |
|||
axis: 0 |
|||
joyNum: 0 |
|||
- serializedVersion: 3 |
|||
m_Name: Jump |
|||
descriptiveName: |
|||
descriptiveNegativeName: |
|||
negativeButton: |
|||
positiveButton: joystick button 3 |
|||
altNegativeButton: |
|||
altPositiveButton: |
|||
gravity: 1000 |
|||
dead: 0.001 |
|||
sensitivity: 1000 |
|||
snap: 0 |
|||
invert: 0 |
|||
type: 0 |
|||
axis: 0 |
|||
joyNum: 0 |
|||
- serializedVersion: 3 |
|||
m_Name: Submit |
|||
descriptiveName: |
|||
descriptiveNegativeName: |
|||
negativeButton: |
|||
positiveButton: return |
|||
altNegativeButton: |
|||
altPositiveButton: joystick button 0 |
|||
gravity: 1000 |
|||
dead: 0.001 |
|||
sensitivity: 1000 |
|||
snap: 0 |
|||
invert: 0 |
|||
type: 0 |
|||
axis: 0 |
|||
joyNum: 0 |
|||
- serializedVersion: 3 |
|||
m_Name: Submit |
|||
descriptiveName: |
|||
descriptiveNegativeName: |
|||
negativeButton: |
|||
positiveButton: enter |
|||
altNegativeButton: |
|||
altPositiveButton: space |
|||
gravity: 1000 |
|||
dead: 0.001 |
|||
sensitivity: 1000 |
|||
snap: 0 |
|||
invert: 0 |
|||
type: 0 |
|||
axis: 0 |
|||
joyNum: 0 |
|||
- serializedVersion: 3 |
|||
m_Name: Cancel |
|||
descriptiveName: |
|||
descriptiveNegativeName: |
|||
negativeButton: |
|||
positiveButton: escape |
|||
altNegativeButton: |
|||
altPositiveButton: joystick button 1 |
|||
gravity: 1000 |
|||
dead: 0.001 |
|||
sensitivity: 1000 |
|||
snap: 0 |
|||
invert: 0 |
|||
type: 0 |
|||
axis: 0 |
|||
joyNum: 0 |
|||
@ -0,0 +1,35 @@ |
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!387306366 &1 |
|||
MemorySettings: |
|||
m_ObjectHideFlags: 0 |
|||
m_EditorMemorySettings: |
|||
m_MainAllocatorBlockSize: -1 |
|||
m_ThreadAllocatorBlockSize: -1 |
|||
m_MainGfxBlockSize: -1 |
|||
m_ThreadGfxBlockSize: -1 |
|||
m_CacheBlockSize: -1 |
|||
m_TypetreeBlockSize: -1 |
|||
m_ProfilerBlockSize: -1 |
|||
m_ProfilerEditorBlockSize: -1 |
|||
m_BucketAllocatorGranularity: -1 |
|||
m_BucketAllocatorBucketsCount: -1 |
|||
m_BucketAllocatorBlockSize: -1 |
|||
m_BucketAllocatorBlockCount: -1 |
|||
m_ProfilerBucketAllocatorGranularity: -1 |
|||
m_ProfilerBucketAllocatorBucketsCount: -1 |
|||
m_ProfilerBucketAllocatorBlockSize: -1 |
|||
m_ProfilerBucketAllocatorBlockCount: -1 |
|||
m_TempAllocatorSizeMain: -1 |
|||
m_JobTempAllocatorBlockSize: -1 |
|||
m_BackgroundJobTempAllocatorBlockSize: -1 |
|||
m_JobTempAllocatorReducedBlockSize: -1 |
|||
m_TempAllocatorSizeGIBakingWorker: -1 |
|||
m_TempAllocatorSizeNavMeshWorker: -1 |
|||
m_TempAllocatorSizeAudioWorker: -1 |
|||
m_TempAllocatorSizeCloudWorker: -1 |
|||
m_TempAllocatorSizeGfx: -1 |
|||
m_TempAllocatorSizeJobWorker: -1 |
|||
m_TempAllocatorSizeBackgroundWorker: -1 |
|||
m_TempAllocatorSizePreloadManager: -1 |
|||
m_PlatformMemorySettings: {} |
|||
@ -0,0 +1,91 @@ |
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!126 &1 |
|||
NavMeshProjectSettings: |
|||
m_ObjectHideFlags: 0 |
|||
serializedVersion: 2 |
|||
areas: |
|||
- name: Walkable |
|||
cost: 1 |
|||
- name: Not Walkable |
|||
cost: 1 |
|||
- name: Jump |
|||
cost: 2 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
- name: |
|||
cost: 1 |
|||
m_LastAgentTypeID: -887442657 |
|||
m_Settings: |
|||
- serializedVersion: 2 |
|||
agentTypeID: 0 |
|||
agentRadius: 0.5 |
|||
agentHeight: 2 |
|||
agentSlope: 45 |
|||
agentClimb: 0.75 |
|||
ledgeDropHeight: 0 |
|||
maxJumpAcrossDistance: 0 |
|||
minRegionArea: 2 |
|||
manualCellSize: 0 |
|||
cellSize: 0.16666667 |
|||
manualTileSize: 0 |
|||
tileSize: 256 |
|||
accuratePlacement: 0 |
|||
debug: |
|||
m_Flags: 0 |
|||
m_SettingNames: |
|||
- Humanoid |
|||
@ -0,0 +1,56 @@ |
|||
{ |
|||
"MonoBehaviour": { |
|||
"m_Enabled": true, |
|||
"m_EditorHideFlags": 0, |
|||
"m_Name": "", |
|||
"m_EditorClassIdentifier": "UnityEditor.PS5.Extensions:UnityEditor.PS5:PS5Settings", |
|||
"npConfigZipPath": "", |
|||
"monoEnv": "", |
|||
"scriptOptimizationLevel": 2, |
|||
"enableApplicationExit": false, |
|||
"resetTempFolder": true, |
|||
"disableAutoHideSplash": false, |
|||
"playerPrefsSupport": false, |
|||
"appType": 0, |
|||
"restrictedAudioUsageRights": false, |
|||
"backgroundImagePath": "", |
|||
"startupBackgroundImagePath": "", |
|||
"startupForegroundImagePath": "", |
|||
"startupImagesFolder": "", |
|||
"iconImagesFolder": "", |
|||
"bgmPath": "", |
|||
"playerPrefsMaxSize": 32768, |
|||
"videoOutInitialWidth": 1920, |
|||
"useResolutionFallback": false, |
|||
"videoOutPixelFormat": 0, |
|||
"videoOutOutputMode": 1, |
|||
"paramFilePath": "", |
|||
"passcode": "vY_2a7KGxaA8HPuZY4oGcMfY_1WFzmys", |
|||
"updateReferencePackage": "", |
|||
"includedModules": [ |
|||
"libc.prx", |
|||
"libSceFace.prx", |
|||
"libSceFaceTracker.prx", |
|||
"libSceJobManager.prx", |
|||
"libSceJobManager_nosubmission.prx", |
|||
"libSceNpCppWebApi.prx", |
|||
"libScePfs.prx" |
|||
], |
|||
"sharedBinaryContentLabels": [], |
|||
"sharedBinarySystemFolders": [], |
|||
"workspaceName": "workspace0", |
|||
"buildCompressionType": 0, |
|||
"buildCompressionLevel": 0, |
|||
"keepPackageFiles": false, |
|||
"buildSubtarget": 0, |
|||
"sdkOverride": "", |
|||
"saveDataImagePath": "", |
|||
"configFileParsed": false, |
|||
"operatingSystemCanDisableSplashScreen": false, |
|||
"supportsVR": false, |
|||
"requiresVR": false, |
|||
"vrrSupport": 0, |
|||
"psvr2PlayAreaSupport": 0, |
|||
"psvr2DetailedGazeTrackingStatusEnabled": false |
|||
} |
|||
} |
|||
@ -0,0 +1,35 @@ |
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!114 &1 |
|||
MonoBehaviour: |
|||
m_ObjectHideFlags: 61 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
m_GameObject: {fileID: 0} |
|||
m_Enabled: 1 |
|||
m_EditorHideFlags: 0 |
|||
m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} |
|||
m_Name: |
|||
m_EditorClassIdentifier: |
|||
m_EnablePreReleasePackages: 0 |
|||
m_EnablePackageDependencies: 0 |
|||
m_AdvancedSettingsExpanded: 1 |
|||
m_ScopedRegistriesSettingsExpanded: 1 |
|||
m_SeeAllPackageVersions: 0 |
|||
oneTimeWarningShown: 0 |
|||
m_Registries: |
|||
- m_Id: main |
|||
m_Name: |
|||
m_Url: https://packages.unity.com |
|||
m_Scopes: [] |
|||
m_IsDefault: 1 |
|||
m_Capabilities: 7 |
|||
m_UserSelectedRegistryName: |
|||
m_UserAddingNewScopedRegistry: 0 |
|||
m_RegistryInfoDraft: |
|||
m_Modified: 0 |
|||
m_ErrorMessage: |
|||
m_UserModificationsInstanceId: -830 |
|||
m_OriginalInstanceId: -832 |
|||
m_LoadAssets: 0 |
|||
@ -0,0 +1,7 @@ |
|||
{ |
|||
"m_Name": "Settings", |
|||
"m_Path": "ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json", |
|||
"m_Dictionary": { |
|||
"m_DictionaryValues": [] |
|||
} |
|||
} |
|||
@ -0,0 +1,56 @@ |
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!19 &1 |
|||
Physics2DSettings: |
|||
m_ObjectHideFlags: 0 |
|||
serializedVersion: 4 |
|||
m_Gravity: {x: 0, y: -9.81} |
|||
m_DefaultMaterial: {fileID: 0} |
|||
m_VelocityIterations: 8 |
|||
m_PositionIterations: 3 |
|||
m_VelocityThreshold: 1 |
|||
m_MaxLinearCorrection: 0.2 |
|||
m_MaxAngularCorrection: 8 |
|||
m_MaxTranslationSpeed: 100 |
|||
m_MaxRotationSpeed: 360 |
|||
m_BaumgarteScale: 0.2 |
|||
m_BaumgarteTimeOfImpactScale: 0.75 |
|||
m_TimeToSleep: 0.5 |
|||
m_LinearSleepTolerance: 0.01 |
|||
m_AngularSleepTolerance: 2 |
|||
m_DefaultContactOffset: 0.01 |
|||
m_JobOptions: |
|||
serializedVersion: 2 |
|||
useMultithreading: 0 |
|||
useConsistencySorting: 0 |
|||
m_InterpolationPosesPerJob: 100 |
|||
m_NewContactsPerJob: 30 |
|||
m_CollideContactsPerJob: 100 |
|||
m_ClearFlagsPerJob: 200 |
|||
m_ClearBodyForcesPerJob: 200 |
|||
m_SyncDiscreteFixturesPerJob: 50 |
|||
m_SyncContinuousFixturesPerJob: 50 |
|||
m_FindNearestContactsPerJob: 100 |
|||
m_UpdateTriggerContactsPerJob: 100 |
|||
m_IslandSolverCostThreshold: 100 |
|||
m_IslandSolverBodyCostScale: 1 |
|||
m_IslandSolverContactCostScale: 10 |
|||
m_IslandSolverJointCostScale: 10 |
|||
m_IslandSolverBodiesPerJob: 50 |
|||
m_IslandSolverContactsPerJob: 50 |
|||
m_AutoSimulation: 1 |
|||
m_QueriesHitTriggers: 1 |
|||
m_QueriesStartInColliders: 1 |
|||
m_CallbacksOnDisable: 1 |
|||
m_ReuseCollisionCallbacks: 1 |
|||
m_AutoSyncTransforms: 0 |
|||
m_AlwaysShowColliders: 0 |
|||
m_ShowColliderSleep: 1 |
|||
m_ShowColliderContacts: 0 |
|||
m_ShowColliderAABB: 0 |
|||
m_ContactArrowScale: 0.2 |
|||
m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} |
|||
m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} |
|||
m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} |
|||
m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} |
|||
m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff |
|||
@ -0,0 +1,7 @@ |
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!1386491679 &1 |
|||
PresetManager: |
|||
m_ObjectHideFlags: 0 |
|||
serializedVersion: 2 |
|||
m_DefaultPresets: {} |
|||
@ -0,0 +1,723 @@ |
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!129 &1 |
|||
PlayerSettings: |
|||
m_ObjectHideFlags: 0 |
|||
serializedVersion: 23 |
|||
productGUID: 20a79ce4e9cd3e842ac458d837c5a65c |
|||
AndroidProfiler: 0 |
|||
AndroidFilterTouchesWhenObscured: 0 |
|||
AndroidEnableSustainedPerformanceMode: 0 |
|||
defaultScreenOrientation: 4 |
|||
targetDevice: 2 |
|||
useOnDemandResources: 0 |
|||
accelerometerFrequency: 60 |
|||
companyName: DefaultCompany |
|||
productName: FSR2Test |
|||
defaultCursor: {fileID: 0} |
|||
cursorHotspot: {x: 0, y: 0} |
|||
m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} |
|||
m_ShowUnitySplashScreen: 1 |
|||
m_ShowUnitySplashLogo: 1 |
|||
m_SplashScreenOverlayOpacity: 1 |
|||
m_SplashScreenAnimation: 1 |
|||
m_SplashScreenLogoStyle: 1 |
|||
m_SplashScreenDrawMode: 0 |
|||
m_SplashScreenBackgroundAnimationZoom: 1 |
|||
m_SplashScreenLogoAnimationZoom: 1 |
|||
m_SplashScreenBackgroundLandscapeAspect: 1 |
|||
m_SplashScreenBackgroundPortraitAspect: 1 |
|||
m_SplashScreenBackgroundLandscapeUvs: |
|||
serializedVersion: 2 |
|||
x: 0 |
|||
y: 0 |
|||
width: 1 |
|||
height: 1 |
|||
m_SplashScreenBackgroundPortraitUvs: |
|||
serializedVersion: 2 |
|||
x: 0 |
|||
y: 0 |
|||
width: 1 |
|||
height: 1 |
|||
m_SplashScreenLogos: [] |
|||
m_VirtualRealitySplashScreen: {fileID: 0} |
|||
m_HolographicTrackingLossScreen: {fileID: 0} |
|||
defaultScreenWidth: 1920 |
|||
defaultScreenHeight: 1080 |
|||
defaultScreenWidthWeb: 960 |
|||
defaultScreenHeightWeb: 600 |
|||
m_StereoRenderingPath: 0 |
|||
m_ActiveColorSpace: 0 |
|||
m_MTRendering: 1 |
|||
mipStripping: 0 |
|||
numberOfMipsStripped: 0 |
|||
m_StackTraceTypes: 010000000100000001000000010000000100000001000000 |
|||
iosShowActivityIndicatorOnLoading: -1 |
|||
androidShowActivityIndicatorOnLoading: -1 |
|||
iosUseCustomAppBackgroundBehavior: 0 |
|||
iosAllowHTTPDownload: 1 |
|||
allowedAutorotateToPortrait: 1 |
|||
allowedAutorotateToPortraitUpsideDown: 1 |
|||
allowedAutorotateToLandscapeRight: 1 |
|||
allowedAutorotateToLandscapeLeft: 1 |
|||
useOSAutorotation: 1 |
|||
use32BitDisplayBuffer: 1 |
|||
preserveFramebufferAlpha: 0 |
|||
disableDepthAndStencilBuffers: 0 |
|||
androidStartInFullscreen: 1 |
|||
androidRenderOutsideSafeArea: 1 |
|||
androidUseSwappy: 1 |
|||
androidBlitType: 0 |
|||
androidResizableWindow: 0 |
|||
androidDefaultWindowWidth: 1920 |
|||
androidDefaultWindowHeight: 1080 |
|||
androidMinimumWindowWidth: 400 |
|||
androidMinimumWindowHeight: 300 |
|||
androidFullscreenMode: 1 |
|||
defaultIsNativeResolution: 1 |
|||
macRetinaSupport: 1 |
|||
runInBackground: 1 |
|||
captureSingleScreen: 0 |
|||
muteOtherAudioSources: 0 |
|||
Prepare IOS For Recording: 0 |
|||
Force IOS Speakers When Recording: 0 |
|||
deferSystemGesturesMode: 0 |
|||
hideHomeButton: 0 |
|||
submitAnalytics: 1 |
|||
usePlayerLog: 1 |
|||
bakeCollisionMeshes: 0 |
|||
forceSingleInstance: 0 |
|||
useFlipModelSwapchain: 1 |
|||
resizableWindow: 0 |
|||
useMacAppStoreValidation: 0 |
|||
macAppStoreCategory: public.app-category.games |
|||
gpuSkinning: 1 |
|||
xboxPIXTextureCapture: 0 |
|||
xboxEnableAvatar: 0 |
|||
xboxEnableKinect: 0 |
|||
xboxEnableKinectAutoTracking: 0 |
|||
xboxEnableFitness: 0 |
|||
visibleInBackground: 1 |
|||
allowFullscreenSwitch: 1 |
|||
fullscreenMode: 1 |
|||
xboxSpeechDB: 0 |
|||
xboxEnableHeadOrientation: 0 |
|||
xboxEnableGuest: 0 |
|||
xboxEnablePIXSampling: 0 |
|||
metalFramebufferOnly: 0 |
|||
xboxOneResolution: 0 |
|||
xboxOneSResolution: 0 |
|||
xboxOneXResolution: 3 |
|||
xboxOneMonoLoggingLevel: 0 |
|||
xboxOneLoggingLevel: 1 |
|||
xboxOneDisableEsram: 0 |
|||
xboxOneEnableTypeOptimization: 0 |
|||
xboxOnePresentImmediateThreshold: 0 |
|||
switchQueueCommandMemory: 0 |
|||
switchQueueControlMemory: 16384 |
|||
switchQueueComputeMemory: 262144 |
|||
switchNVNShaderPoolsGranularity: 33554432 |
|||
switchNVNDefaultPoolsGranularity: 16777216 |
|||
switchNVNOtherPoolsGranularity: 16777216 |
|||
switchNVNMaxPublicTextureIDCount: 0 |
|||
switchNVNMaxPublicSamplerIDCount: 0 |
|||
stadiaPresentMode: 0 |
|||
stadiaTargetFramerate: 0 |
|||
vulkanNumSwapchainBuffers: 3 |
|||
vulkanEnableSetSRGBWrite: 0 |
|||
vulkanEnablePreTransform: 1 |
|||
vulkanEnableLateAcquireNextImage: 0 |
|||
vulkanEnableCommandBufferRecycling: 1 |
|||
m_SupportedAspectRatios: |
|||
4:3: 1 |
|||
5:4: 1 |
|||
16:10: 1 |
|||
16:9: 1 |
|||
Others: 1 |
|||
bundleVersion: 0.1 |
|||
preloadedAssets: [] |
|||
metroInputSource: 0 |
|||
wsaTransparentSwapchain: 0 |
|||
m_HolographicPauseOnTrackingLoss: 1 |
|||
xboxOneDisableKinectGpuReservation: 1 |
|||
xboxOneEnable7thCore: 1 |
|||
vrSettings: |
|||
enable360StereoCapture: 0 |
|||
isWsaHolographicRemotingEnabled: 0 |
|||
enableFrameTimingStats: 0 |
|||
enableOpenGLProfilerGPURecorders: 1 |
|||
useHDRDisplay: 0 |
|||
D3DHDRBitDepth: 0 |
|||
m_ColorGamuts: 00000000 |
|||
targetPixelDensity: 30 |
|||
resolutionScalingMode: 0 |
|||
resetResolutionOnWindowResize: 0 |
|||
androidSupportedAspectRatio: 1 |
|||
androidMaxAspectRatio: 2.1 |
|||
applicationIdentifier: {} |
|||
buildNumber: |
|||
Standalone: 0 |
|||
iPhone: 0 |
|||
tvOS: 0 |
|||
overrideDefaultApplicationIdentifier: 0 |
|||
AndroidBundleVersionCode: 1 |
|||
AndroidMinSdkVersion: 22 |
|||
AndroidTargetSdkVersion: 0 |
|||
AndroidPreferredInstallLocation: 1 |
|||
aotOptions: |
|||
stripEngineCode: 1 |
|||
iPhoneStrippingLevel: 0 |
|||
iPhoneScriptCallOptimization: 0 |
|||
ForceInternetPermission: 0 |
|||
ForceSDCardPermission: 0 |
|||
CreateWallpaper: 0 |
|||
APKExpansionFiles: 0 |
|||
keepLoadedShadersAlive: 0 |
|||
StripUnusedMeshComponents: 1 |
|||
VertexChannelCompressionMask: 4054 |
|||
iPhoneSdkVersion: 988 |
|||
iOSTargetOSVersionString: 11.0 |
|||
tvOSSdkVersion: 0 |
|||
tvOSRequireExtendedGameController: 0 |
|||
tvOSTargetOSVersionString: 11.0 |
|||
uIPrerenderedIcon: 0 |
|||
uIRequiresPersistentWiFi: 0 |
|||
uIRequiresFullScreen: 1 |
|||
uIStatusBarHidden: 1 |
|||
uIExitOnSuspend: 0 |
|||
uIStatusBarStyle: 0 |
|||
appleTVSplashScreen: {fileID: 0} |
|||
appleTVSplashScreen2x: {fileID: 0} |
|||
tvOSSmallIconLayers: [] |
|||
tvOSSmallIconLayers2x: [] |
|||
tvOSLargeIconLayers: [] |
|||
tvOSLargeIconLayers2x: [] |
|||
tvOSTopShelfImageLayers: [] |
|||
tvOSTopShelfImageLayers2x: [] |
|||
tvOSTopShelfImageWideLayers: [] |
|||
tvOSTopShelfImageWideLayers2x: [] |
|||
iOSLaunchScreenType: 0 |
|||
iOSLaunchScreenPortrait: {fileID: 0} |
|||
iOSLaunchScreenLandscape: {fileID: 0} |
|||
iOSLaunchScreenBackgroundColor: |
|||
serializedVersion: 2 |
|||
rgba: 0 |
|||
iOSLaunchScreenFillPct: 100 |
|||
iOSLaunchScreenSize: 100 |
|||
iOSLaunchScreenCustomXibPath: |
|||
iOSLaunchScreeniPadType: 0 |
|||
iOSLaunchScreeniPadImage: {fileID: 0} |
|||
iOSLaunchScreeniPadBackgroundColor: |
|||
serializedVersion: 2 |
|||
rgba: 0 |
|||
iOSLaunchScreeniPadFillPct: 100 |
|||
iOSLaunchScreeniPadSize: 100 |
|||
iOSLaunchScreeniPadCustomXibPath: |
|||
iOSLaunchScreenCustomStoryboardPath: |
|||
iOSLaunchScreeniPadCustomStoryboardPath: |
|||
iOSDeviceRequirements: [] |
|||
iOSURLSchemes: [] |
|||
macOSURLSchemes: [] |
|||
iOSBackgroundModes: 0 |
|||
iOSMetalForceHardShadows: 0 |
|||
metalEditorSupport: 1 |
|||
metalAPIValidation: 1 |
|||
iOSRenderExtraFrameOnPause: 0 |
|||
iosCopyPluginsCodeInsteadOfSymlink: 0 |
|||
appleDeveloperTeamID: |
|||
iOSManualSigningProvisioningProfileID: |
|||
tvOSManualSigningProvisioningProfileID: |
|||
iOSManualSigningProvisioningProfileType: 0 |
|||
tvOSManualSigningProvisioningProfileType: 0 |
|||
appleEnableAutomaticSigning: 0 |
|||
iOSRequireARKit: 0 |
|||
iOSAutomaticallyDetectAndAddCapabilities: 1 |
|||
appleEnableProMotion: 0 |
|||
shaderPrecisionModel: 0 |
|||
clonedFromGUID: c0afd0d1d80e3634a9dac47e8a0426ea |
|||
templatePackageId: com.unity.template.3d@8.1.0 |
|||
templateDefaultScene: Assets/Scenes/SampleScene.unity |
|||
useCustomMainManifest: 0 |
|||
useCustomLauncherManifest: 0 |
|||
useCustomMainGradleTemplate: 0 |
|||
useCustomLauncherGradleManifest: 0 |
|||
useCustomBaseGradleTemplate: 0 |
|||
useCustomGradlePropertiesTemplate: 0 |
|||
useCustomProguardFile: 0 |
|||
AndroidTargetArchitectures: 1 |
|||
AndroidTargetDevices: 0 |
|||
AndroidSplashScreenScale: 0 |
|||
androidSplashScreen: {fileID: 0} |
|||
AndroidKeystoreName: |
|||
AndroidKeyaliasName: |
|||
AndroidBuildApkPerCpuArchitecture: 0 |
|||
AndroidTVCompatibility: 0 |
|||
AndroidIsGame: 1 |
|||
AndroidEnableTango: 0 |
|||
androidEnableBanner: 1 |
|||
androidUseLowAccuracyLocation: 0 |
|||
androidUseCustomKeystore: 0 |
|||
m_AndroidBanners: |
|||
- width: 320 |
|||
height: 180 |
|||
banner: {fileID: 0} |
|||
androidGamepadSupportLevel: 0 |
|||
chromeosInputEmulation: 1 |
|||
AndroidMinifyWithR8: 0 |
|||
AndroidMinifyRelease: 0 |
|||
AndroidMinifyDebug: 0 |
|||
AndroidValidateAppBundleSize: 1 |
|||
AndroidAppBundleSizeToValidate: 150 |
|||
m_BuildTargetIcons: [] |
|||
m_BuildTargetPlatformIcons: [] |
|||
m_BuildTargetBatching: |
|||
- m_BuildTarget: Standalone |
|||
m_StaticBatching: 1 |
|||
m_DynamicBatching: 0 |
|||
- m_BuildTarget: tvOS |
|||
m_StaticBatching: 1 |
|||
m_DynamicBatching: 0 |
|||
- m_BuildTarget: Android |
|||
m_StaticBatching: 1 |
|||
m_DynamicBatching: 0 |
|||
- m_BuildTarget: iPhone |
|||
m_StaticBatching: 1 |
|||
m_DynamicBatching: 0 |
|||
- m_BuildTarget: WebGL |
|||
m_StaticBatching: 0 |
|||
m_DynamicBatching: 0 |
|||
m_BuildTargetGraphicsJobs: |
|||
- m_BuildTarget: MacStandaloneSupport |
|||
m_GraphicsJobs: 0 |
|||
- m_BuildTarget: Switch |
|||
m_GraphicsJobs: 1 |
|||
- m_BuildTarget: MetroSupport |
|||
m_GraphicsJobs: 1 |
|||
- m_BuildTarget: AppleTVSupport |
|||
m_GraphicsJobs: 0 |
|||
- m_BuildTarget: BJMSupport |
|||
m_GraphicsJobs: 1 |
|||
- m_BuildTarget: LinuxStandaloneSupport |
|||
m_GraphicsJobs: 1 |
|||
- m_BuildTarget: PS4Player |
|||
m_GraphicsJobs: 1 |
|||
- m_BuildTarget: iOSSupport |
|||
m_GraphicsJobs: 0 |
|||
- m_BuildTarget: WindowsStandaloneSupport |
|||
m_GraphicsJobs: 1 |
|||
- m_BuildTarget: XboxOnePlayer |
|||
m_GraphicsJobs: 1 |
|||
- m_BuildTarget: LuminSupport |
|||
m_GraphicsJobs: 0 |
|||
- m_BuildTarget: AndroidPlayer |
|||
m_GraphicsJobs: 0 |
|||
- m_BuildTarget: WebGLSupport |
|||
m_GraphicsJobs: 0 |
|||
m_BuildTargetGraphicsJobMode: |
|||
- m_BuildTarget: PS4Player |
|||
m_GraphicsJobMode: 0 |
|||
- m_BuildTarget: XboxOnePlayer |
|||
m_GraphicsJobMode: 0 |
|||
m_BuildTargetGraphicsAPIs: |
|||
- m_BuildTarget: AndroidPlayer |
|||
m_APIs: 150000000b000000 |
|||
m_Automatic: 1 |
|||
- m_BuildTarget: iOSSupport |
|||
m_APIs: 10000000 |
|||
m_Automatic: 1 |
|||
- m_BuildTarget: AppleTVSupport |
|||
m_APIs: 10000000 |
|||
m_Automatic: 1 |
|||
- m_BuildTarget: WebGLSupport |
|||
m_APIs: 0b000000 |
|||
m_Automatic: 1 |
|||
m_BuildTargetVRSettings: |
|||
- m_BuildTarget: Standalone |
|||
m_Enabled: 0 |
|||
m_Devices: |
|||
- Oculus |
|||
- OpenVR |
|||
openGLRequireES31: 0 |
|||
openGLRequireES31AEP: 0 |
|||
openGLRequireES32: 0 |
|||
m_TemplateCustomTags: {} |
|||
mobileMTRendering: |
|||
Android: 1 |
|||
iPhone: 1 |
|||
tvOS: 1 |
|||
m_BuildTargetGroupLightmapEncodingQuality: |
|||
- m_BuildTarget: Android |
|||
m_EncodingQuality: 1 |
|||
- m_BuildTarget: iPhone |
|||
m_EncodingQuality: 1 |
|||
- m_BuildTarget: tvOS |
|||
m_EncodingQuality: 1 |
|||
m_BuildTargetGroupLightmapSettings: [] |
|||
m_BuildTargetNormalMapEncoding: |
|||
- m_BuildTarget: Android |
|||
m_Encoding: 1 |
|||
- m_BuildTarget: iPhone |
|||
m_Encoding: 1 |
|||
- m_BuildTarget: tvOS |
|||
m_Encoding: 1 |
|||
m_BuildTargetDefaultTextureCompressionFormat: |
|||
- m_BuildTarget: Android |
|||
m_Format: 3 |
|||
playModeTestRunnerEnabled: 0 |
|||
runPlayModeTestAsEditModeTest: 0 |
|||
actionOnDotNetUnhandledException: 1 |
|||
enableInternalProfiler: 0 |
|||
logObjCUncaughtExceptions: 1 |
|||
enableCrashReportAPI: 0 |
|||
cameraUsageDescription: |
|||
locationUsageDescription: |
|||
microphoneUsageDescription: |
|||
bluetoothUsageDescription: |
|||
switchNMETAOverride: |
|||
switchNetLibKey: |
|||
switchSocketMemoryPoolSize: 6144 |
|||
switchSocketAllocatorPoolSize: 128 |
|||
switchSocketConcurrencyLimit: 14 |
|||
switchScreenResolutionBehavior: 2 |
|||
switchUseCPUProfiler: 0 |
|||
switchUseGOLDLinker: 0 |
|||
switchLTOSetting: 0 |
|||
switchApplicationID: 0x01004b9000490000 |
|||
switchNSODependencies: |
|||
switchTitleNames_0: |
|||
switchTitleNames_1: |
|||
switchTitleNames_2: |
|||
switchTitleNames_3: |
|||
switchTitleNames_4: |
|||
switchTitleNames_5: |
|||
switchTitleNames_6: |
|||
switchTitleNames_7: |
|||
switchTitleNames_8: |
|||
switchTitleNames_9: |
|||
switchTitleNames_10: |
|||
switchTitleNames_11: |
|||
switchTitleNames_12: |
|||
switchTitleNames_13: |
|||
switchTitleNames_14: |
|||
switchTitleNames_15: |
|||
switchPublisherNames_0: |
|||
switchPublisherNames_1: |
|||
switchPublisherNames_2: |
|||
switchPublisherNames_3: |
|||
switchPublisherNames_4: |
|||
switchPublisherNames_5: |
|||
switchPublisherNames_6: |
|||
switchPublisherNames_7: |
|||
switchPublisherNames_8: |
|||
switchPublisherNames_9: |
|||
switchPublisherNames_10: |
|||
switchPublisherNames_11: |
|||
switchPublisherNames_12: |
|||
switchPublisherNames_13: |
|||
switchPublisherNames_14: |
|||
switchPublisherNames_15: |
|||
switchIcons_0: {fileID: 0} |
|||
switchIcons_1: {fileID: 0} |
|||
switchIcons_2: {fileID: 0} |
|||
switchIcons_3: {fileID: 0} |
|||
switchIcons_4: {fileID: 0} |
|||
switchIcons_5: {fileID: 0} |
|||
switchIcons_6: {fileID: 0} |
|||
switchIcons_7: {fileID: 0} |
|||
switchIcons_8: {fileID: 0} |
|||
switchIcons_9: {fileID: 0} |
|||
switchIcons_10: {fileID: 0} |
|||
switchIcons_11: {fileID: 0} |
|||
switchIcons_12: {fileID: 0} |
|||
switchIcons_13: {fileID: 0} |
|||
switchIcons_14: {fileID: 0} |
|||
switchIcons_15: {fileID: 0} |
|||
switchSmallIcons_0: {fileID: 0} |
|||
switchSmallIcons_1: {fileID: 0} |
|||
switchSmallIcons_2: {fileID: 0} |
|||
switchSmallIcons_3: {fileID: 0} |
|||
switchSmallIcons_4: {fileID: 0} |
|||
switchSmallIcons_5: {fileID: 0} |
|||
switchSmallIcons_6: {fileID: 0} |
|||
switchSmallIcons_7: {fileID: 0} |
|||
switchSmallIcons_8: {fileID: 0} |
|||
switchSmallIcons_9: {fileID: 0} |
|||
switchSmallIcons_10: {fileID: 0} |
|||
switchSmallIcons_11: {fileID: 0} |
|||
switchSmallIcons_12: {fileID: 0} |
|||
switchSmallIcons_13: {fileID: 0} |
|||
switchSmallIcons_14: {fileID: 0} |
|||
switchSmallIcons_15: {fileID: 0} |
|||
switchManualHTML: |
|||
switchAccessibleURLs: |
|||
switchLegalInformation: |
|||
switchMainThreadStackSize: 1048576 |
|||
switchPresenceGroupId: |
|||
switchLogoHandling: 0 |
|||
switchReleaseVersion: 0 |
|||
switchDisplayVersion: 1.0.0 |
|||
switchStartupUserAccount: 0 |
|||
switchTouchScreenUsage: 0 |
|||
switchSupportedLanguagesMask: 0 |
|||
switchLogoType: 0 |
|||
switchApplicationErrorCodeCategory: |
|||
switchUserAccountSaveDataSize: 0 |
|||
switchUserAccountSaveDataJournalSize: 0 |
|||
switchApplicationAttribute: 0 |
|||
switchCardSpecSize: -1 |
|||
switchCardSpecClock: -1 |
|||
switchRatingsMask: 0 |
|||
switchRatingsInt_0: 0 |
|||
switchRatingsInt_1: 0 |
|||
switchRatingsInt_2: 0 |
|||
switchRatingsInt_3: 0 |
|||
switchRatingsInt_4: 0 |
|||
switchRatingsInt_5: 0 |
|||
switchRatingsInt_6: 0 |
|||
switchRatingsInt_7: 0 |
|||
switchRatingsInt_8: 0 |
|||
switchRatingsInt_9: 0 |
|||
switchRatingsInt_10: 0 |
|||
switchRatingsInt_11: 0 |
|||
switchRatingsInt_12: 0 |
|||
switchLocalCommunicationIds_0: |
|||
switchLocalCommunicationIds_1: |
|||
switchLocalCommunicationIds_2: |
|||
switchLocalCommunicationIds_3: |
|||
switchLocalCommunicationIds_4: |
|||
switchLocalCommunicationIds_5: |
|||
switchLocalCommunicationIds_6: |
|||
switchLocalCommunicationIds_7: |
|||
switchParentalControl: 0 |
|||
switchAllowsScreenshot: 1 |
|||
switchAllowsVideoCapturing: 1 |
|||
switchAllowsRuntimeAddOnContentInstall: 0 |
|||
switchDataLossConfirmation: 0 |
|||
switchUserAccountLockEnabled: 0 |
|||
switchSystemResourceMemory: 16777216 |
|||
switchSupportedNpadStyles: 22 |
|||
switchNativeFsCacheSize: 32 |
|||
switchIsHoldTypeHorizontal: 0 |
|||
switchSupportedNpadCount: 8 |
|||
switchSocketConfigEnabled: 0 |
|||
switchTcpInitialSendBufferSize: 32 |
|||
switchTcpInitialReceiveBufferSize: 64 |
|||
switchTcpAutoSendBufferSizeMax: 256 |
|||
switchTcpAutoReceiveBufferSizeMax: 256 |
|||
switchUdpSendBufferSize: 9 |
|||
switchUdpReceiveBufferSize: 42 |
|||
switchSocketBufferEfficiency: 4 |
|||
switchSocketInitializeEnabled: 1 |
|||
switchNetworkInterfaceManagerInitializeEnabled: 1 |
|||
switchPlayerConnectionEnabled: 1 |
|||
switchUseNewStyleFilepaths: 0 |
|||
switchUseMicroSleepForYield: 1 |
|||
switchEnableRamDiskSupport: 0 |
|||
switchMicroSleepForYieldTime: 25 |
|||
switchRamDiskSpaceSize: 12 |
|||
ps4NPAgeRating: 12 |
|||
ps4NPTitleSecret: |
|||
ps4NPTrophyPackPath: |
|||
ps4ParentalLevel: 11 |
|||
ps4ContentID: ED1633-NPXX51362_00-0000000000000000 |
|||
ps4Category: 0 |
|||
ps4MasterVersion: 01.00 |
|||
ps4AppVersion: 01.00 |
|||
ps4AppType: 0 |
|||
ps4ParamSfxPath: |
|||
ps4VideoOutPixelFormat: 0 |
|||
ps4VideoOutInitialWidth: 1920 |
|||
ps4VideoOutBaseModeInitialWidth: 1920 |
|||
ps4VideoOutReprojectionRate: 60 |
|||
ps4PronunciationXMLPath: |
|||
ps4PronunciationSIGPath: |
|||
ps4BackgroundImagePath: |
|||
ps4StartupImagePath: |
|||
ps4StartupImagesFolder: |
|||
ps4IconImagesFolder: |
|||
ps4SaveDataImagePath: |
|||
ps4SdkOverride: |
|||
ps4BGMPath: |
|||
ps4ShareFilePath: |
|||
ps4ShareOverlayImagePath: |
|||
ps4PrivacyGuardImagePath: |
|||
ps4ExtraSceSysFile: |
|||
ps4NPtitleDatPath: |
|||
ps4RemotePlayKeyAssignment: -1 |
|||
ps4RemotePlayKeyMappingDir: |
|||
ps4PlayTogetherPlayerCount: 0 |
|||
ps4EnterButtonAssignment: 1 |
|||
ps4ApplicationParam1: 0 |
|||
ps4ApplicationParam2: 0 |
|||
ps4ApplicationParam3: 0 |
|||
ps4ApplicationParam4: 0 |
|||
ps4DownloadDataSize: 0 |
|||
ps4GarlicHeapSize: 2048 |
|||
ps4ProGarlicHeapSize: 2560 |
|||
playerPrefsMaxSize: 32768 |
|||
ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ |
|||
ps4pnSessions: 1 |
|||
ps4pnPresence: 1 |
|||
ps4pnFriends: 1 |
|||
ps4pnGameCustomData: 1 |
|||
playerPrefsSupport: 0 |
|||
enableApplicationExit: 0 |
|||
resetTempFolder: 1 |
|||
restrictedAudioUsageRights: 0 |
|||
ps4UseResolutionFallback: 0 |
|||
ps4ReprojectionSupport: 0 |
|||
ps4UseAudio3dBackend: 0 |
|||
ps4UseLowGarlicFragmentationMode: 1 |
|||
ps4SocialScreenEnabled: 0 |
|||
ps4ScriptOptimizationLevel: 0 |
|||
ps4Audio3dVirtualSpeakerCount: 14 |
|||
ps4attribCpuUsage: 0 |
|||
ps4PatchPkgPath: |
|||
ps4PatchLatestPkgPath: |
|||
ps4PatchChangeinfoPath: |
|||
ps4PatchDayOne: 0 |
|||
ps4attribUserManagement: 0 |
|||
ps4attribMoveSupport: 0 |
|||
ps4attrib3DSupport: 0 |
|||
ps4attribShareSupport: 0 |
|||
ps4attribExclusiveVR: 0 |
|||
ps4disableAutoHideSplash: 0 |
|||
ps4videoRecordingFeaturesUsed: 0 |
|||
ps4contentSearchFeaturesUsed: 0 |
|||
ps4CompatibilityPS5: 0 |
|||
ps4AllowPS5Detection: 0 |
|||
ps4GPU800MHz: 1 |
|||
ps4attribEyeToEyeDistanceSettingVR: 0 |
|||
ps4IncludedModules: |
|||
- libc.prx |
|||
- libSceAudioLatencyEstimation.prx |
|||
- libSceFace.prx |
|||
- libSceFaceTracker.prx |
|||
- libSceFios2.prx |
|||
- libSceHand.prx |
|||
- libSceHandTracker.prx |
|||
- libSceHeadTracker.prx |
|||
- libSceJobManager.prx |
|||
- libSceNpCppWebApi.prx |
|||
- libSceNpToolkit2.prx |
|||
- libSceS3DConversion.prx |
|||
ps4attribVROutputEnabled: 0 |
|||
monoEnv: |
|||
splashScreenBackgroundSourceLandscape: {fileID: 0} |
|||
splashScreenBackgroundSourcePortrait: {fileID: 0} |
|||
blurSplashScreenBackground: 1 |
|||
spritePackerPolicy: |
|||
webGLMemorySize: 16 |
|||
webGLExceptionSupport: 1 |
|||
webGLNameFilesAsHashes: 0 |
|||
webGLDataCaching: 1 |
|||
webGLDebugSymbols: 0 |
|||
webGLEmscriptenArgs: |
|||
webGLModulesDirectory: |
|||
webGLTemplate: APPLICATION:Default |
|||
webGLAnalyzeBuildSize: 0 |
|||
webGLUseEmbeddedResources: 0 |
|||
webGLCompressionFormat: 1 |
|||
webGLWasmArithmeticExceptions: 0 |
|||
webGLLinkerTarget: 1 |
|||
webGLThreadsSupport: 0 |
|||
webGLDecompressionFallback: 0 |
|||
scriptingDefineSymbols: {} |
|||
additionalCompilerArguments: {} |
|||
platformArchitecture: {} |
|||
scriptingBackend: {} |
|||
il2cppCompilerConfiguration: {} |
|||
managedStrippingLevel: {} |
|||
incrementalIl2cppBuild: {} |
|||
suppressCommonWarnings: 1 |
|||
allowUnsafeCode: 0 |
|||
useDeterministicCompilation: 1 |
|||
enableRoslynAnalyzers: 1 |
|||
additionalIl2CppArgs: |
|||
scriptingRuntimeVersion: 1 |
|||
gcIncremental: 1 |
|||
assemblyVersionValidation: 1 |
|||
gcWBarrierValidation: 0 |
|||
apiCompatibilityLevelPerPlatform: {} |
|||
m_RenderingPath: 1 |
|||
m_MobileRenderingPath: 1 |
|||
metroPackageName: Template_3D |
|||
metroPackageVersion: |
|||
metroCertificatePath: |
|||
metroCertificatePassword: |
|||
metroCertificateSubject: |
|||
metroCertificateIssuer: |
|||
metroCertificateNotAfter: 0000000000000000 |
|||
metroApplicationDescription: Template_3D |
|||
wsaImages: {} |
|||
metroTileShortName: |
|||
metroTileShowName: 0 |
|||
metroMediumTileShowName: 0 |
|||
metroLargeTileShowName: 0 |
|||
metroWideTileShowName: 0 |
|||
metroSupportStreamingInstall: 0 |
|||
metroLastRequiredScene: 0 |
|||
metroDefaultTileSize: 1 |
|||
metroTileForegroundText: 2 |
|||
metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} |
|||
metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1} |
|||
metroSplashScreenUseBackgroundColor: 0 |
|||
platformCapabilities: {} |
|||
metroTargetDeviceFamilies: {} |
|||
metroFTAName: |
|||
metroFTAFileTypes: [] |
|||
metroProtocolName: |
|||
vcxProjDefaultLanguage: |
|||
XboxOneProductId: |
|||
XboxOneUpdateKey: |
|||
XboxOneSandboxId: |
|||
XboxOneContentId: |
|||
XboxOneTitleId: |
|||
XboxOneSCId: |
|||
XboxOneGameOsOverridePath: |
|||
XboxOnePackagingOverridePath: |
|||
XboxOneAppManifestOverridePath: |
|||
XboxOneVersion: 1.0.0.0 |
|||
XboxOnePackageEncryption: 0 |
|||
XboxOnePackageUpdateGranularity: 2 |
|||
XboxOneDescription: |
|||
XboxOneLanguage: |
|||
- enus |
|||
XboxOneCapability: [] |
|||
XboxOneGameRating: {} |
|||
XboxOneIsContentPackage: 0 |
|||
XboxOneEnhancedXboxCompatibilityMode: 0 |
|||
XboxOneEnableGPUVariability: 1 |
|||
XboxOneSockets: {} |
|||
XboxOneSplashScreen: {fileID: 0} |
|||
XboxOneAllowedProductIds: [] |
|||
XboxOnePersistentLocalStorageSize: 0 |
|||
XboxOneXTitleMemory: 8 |
|||
XboxOneOverrideIdentityName: |
|||
XboxOneOverrideIdentityPublisher: |
|||
vrEditorSettings: {} |
|||
cloudServicesEnabled: |
|||
UNet: 1 |
|||
luminIcon: |
|||
m_Name: |
|||
m_ModelFolderPath: |
|||
m_PortalFolderPath: |
|||
luminCert: |
|||
m_CertPath: |
|||
m_SignPackage: 1 |
|||
luminIsChannelApp: 0 |
|||
luminVersion: |
|||
m_VersionCode: 1 |
|||
m_VersionName: |
|||
apiCompatibilityLevel: 6 |
|||
activeInputHandler: 0 |
|||
cloudProjectId: |
|||
framebufferDepthMemorylessMode: 0 |
|||
qualitySettingsNames: [] |
|||
projectName: |
|||
organizationId: |
|||
cloudEnabled: 0 |
|||
legacyClampBlendShapeWeights: 0 |
|||
playerDataPath: |
|||
forceSRGBBlit: 1 |
|||
virtualTexturingSupportEnabled: 0 |
|||
@ -0,0 +1,2 @@ |
|||
m_EditorVersion: 2021.3.5f1 |
|||
m_EditorVersionWithRevision: 2021.3.5f1 (40eb3a945986) |
|||
@ -0,0 +1,232 @@ |
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!47 &1 |
|||
QualitySettings: |
|||
m_ObjectHideFlags: 0 |
|||
serializedVersion: 5 |
|||
m_CurrentQuality: 5 |
|||
m_QualitySettings: |
|||
- serializedVersion: 2 |
|||
name: Very Low |
|||
pixelLightCount: 0 |
|||
shadows: 0 |
|||
shadowResolution: 0 |
|||
shadowProjection: 1 |
|||
shadowCascades: 1 |
|||
shadowDistance: 15 |
|||
shadowNearPlaneOffset: 3 |
|||
shadowCascade2Split: 0.33333334 |
|||
shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} |
|||
shadowmaskMode: 0 |
|||
blendWeights: 1 |
|||
textureQuality: 1 |
|||
anisotropicTextures: 0 |
|||
antiAliasing: 0 |
|||
softParticles: 0 |
|||
softVegetation: 0 |
|||
realtimeReflectionProbes: 0 |
|||
billboardsFaceCameraPosition: 0 |
|||
vSyncCount: 0 |
|||
lodBias: 0.3 |
|||
maximumLODLevel: 0 |
|||
streamingMipmapsActive: 0 |
|||
streamingMipmapsAddAllCameras: 1 |
|||
streamingMipmapsMemoryBudget: 512 |
|||
streamingMipmapsRenderersPerFrame: 512 |
|||
streamingMipmapsMaxLevelReduction: 2 |
|||
streamingMipmapsMaxFileIORequests: 1024 |
|||
particleRaycastBudget: 4 |
|||
asyncUploadTimeSlice: 2 |
|||
asyncUploadBufferSize: 16 |
|||
asyncUploadPersistentBuffer: 1 |
|||
resolutionScalingFixedDPIFactor: 1 |
|||
excludedTargetPlatforms: [] |
|||
- serializedVersion: 2 |
|||
name: Low |
|||
pixelLightCount: 0 |
|||
shadows: 0 |
|||
shadowResolution: 0 |
|||
shadowProjection: 1 |
|||
shadowCascades: 1 |
|||
shadowDistance: 20 |
|||
shadowNearPlaneOffset: 3 |
|||
shadowCascade2Split: 0.33333334 |
|||
shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} |
|||
shadowmaskMode: 0 |
|||
blendWeights: 2 |
|||
textureQuality: 0 |
|||
anisotropicTextures: 0 |
|||
antiAliasing: 0 |
|||
softParticles: 0 |
|||
softVegetation: 0 |
|||
realtimeReflectionProbes: 0 |
|||
billboardsFaceCameraPosition: 0 |
|||
vSyncCount: 0 |
|||
lodBias: 0.4 |
|||
maximumLODLevel: 0 |
|||
streamingMipmapsActive: 0 |
|||
streamingMipmapsAddAllCameras: 1 |
|||
streamingMipmapsMemoryBudget: 512 |
|||
streamingMipmapsRenderersPerFrame: 512 |
|||
streamingMipmapsMaxLevelReduction: 2 |
|||
streamingMipmapsMaxFileIORequests: 1024 |
|||
particleRaycastBudget: 16 |
|||
asyncUploadTimeSlice: 2 |
|||
asyncUploadBufferSize: 16 |
|||
asyncUploadPersistentBuffer: 1 |
|||
resolutionScalingFixedDPIFactor: 1 |
|||
excludedTargetPlatforms: [] |
|||
- serializedVersion: 2 |
|||
name: Medium |
|||
pixelLightCount: 1 |
|||
shadows: 1 |
|||
shadowResolution: 0 |
|||
shadowProjection: 1 |
|||
shadowCascades: 1 |
|||
shadowDistance: 20 |
|||
shadowNearPlaneOffset: 3 |
|||
shadowCascade2Split: 0.33333334 |
|||
shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} |
|||
shadowmaskMode: 0 |
|||
blendWeights: 2 |
|||
textureQuality: 0 |
|||
anisotropicTextures: 1 |
|||
antiAliasing: 0 |
|||
softParticles: 0 |
|||
softVegetation: 0 |
|||
realtimeReflectionProbes: 0 |
|||
billboardsFaceCameraPosition: 0 |
|||
vSyncCount: 1 |
|||
lodBias: 0.7 |
|||
maximumLODLevel: 0 |
|||
streamingMipmapsActive: 0 |
|||
streamingMipmapsAddAllCameras: 1 |
|||
streamingMipmapsMemoryBudget: 512 |
|||
streamingMipmapsRenderersPerFrame: 512 |
|||
streamingMipmapsMaxLevelReduction: 2 |
|||
streamingMipmapsMaxFileIORequests: 1024 |
|||
particleRaycastBudget: 64 |
|||
asyncUploadTimeSlice: 2 |
|||
asyncUploadBufferSize: 16 |
|||
asyncUploadPersistentBuffer: 1 |
|||
resolutionScalingFixedDPIFactor: 1 |
|||
excludedTargetPlatforms: [] |
|||
- serializedVersion: 2 |
|||
name: High |
|||
pixelLightCount: 2 |
|||
shadows: 2 |
|||
shadowResolution: 1 |
|||
shadowProjection: 1 |
|||
shadowCascades: 2 |
|||
shadowDistance: 40 |
|||
shadowNearPlaneOffset: 3 |
|||
shadowCascade2Split: 0.33333334 |
|||
shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} |
|||
shadowmaskMode: 1 |
|||
blendWeights: 2 |
|||
textureQuality: 0 |
|||
anisotropicTextures: 1 |
|||
antiAliasing: 0 |
|||
softParticles: 0 |
|||
softVegetation: 1 |
|||
realtimeReflectionProbes: 1 |
|||
billboardsFaceCameraPosition: 1 |
|||
vSyncCount: 1 |
|||
lodBias: 1 |
|||
maximumLODLevel: 0 |
|||
streamingMipmapsActive: 0 |
|||
streamingMipmapsAddAllCameras: 1 |
|||
streamingMipmapsMemoryBudget: 512 |
|||
streamingMipmapsRenderersPerFrame: 512 |
|||
streamingMipmapsMaxLevelReduction: 2 |
|||
streamingMipmapsMaxFileIORequests: 1024 |
|||
particleRaycastBudget: 256 |
|||
asyncUploadTimeSlice: 2 |
|||
asyncUploadBufferSize: 16 |
|||
asyncUploadPersistentBuffer: 1 |
|||
resolutionScalingFixedDPIFactor: 1 |
|||
excludedTargetPlatforms: [] |
|||
- serializedVersion: 2 |
|||
name: Very High |
|||
pixelLightCount: 3 |
|||
shadows: 2 |
|||
shadowResolution: 2 |
|||
shadowProjection: 1 |
|||
shadowCascades: 2 |
|||
shadowDistance: 70 |
|||
shadowNearPlaneOffset: 3 |
|||
shadowCascade2Split: 0.33333334 |
|||
shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} |
|||
shadowmaskMode: 1 |
|||
blendWeights: 4 |
|||
textureQuality: 0 |
|||
anisotropicTextures: 2 |
|||
antiAliasing: 2 |
|||
softParticles: 1 |
|||
softVegetation: 1 |
|||
realtimeReflectionProbes: 1 |
|||
billboardsFaceCameraPosition: 1 |
|||
vSyncCount: 1 |
|||
lodBias: 1.5 |
|||
maximumLODLevel: 0 |
|||
streamingMipmapsActive: 0 |
|||
streamingMipmapsAddAllCameras: 1 |
|||
streamingMipmapsMemoryBudget: 512 |
|||
streamingMipmapsRenderersPerFrame: 512 |
|||
streamingMipmapsMaxLevelReduction: 2 |
|||
streamingMipmapsMaxFileIORequests: 1024 |
|||
particleRaycastBudget: 1024 |
|||
asyncUploadTimeSlice: 2 |
|||
asyncUploadBufferSize: 16 |
|||
asyncUploadPersistentBuffer: 1 |
|||
resolutionScalingFixedDPIFactor: 1 |
|||
excludedTargetPlatforms: [] |
|||
- serializedVersion: 2 |
|||
name: Ultra |
|||
pixelLightCount: 4 |
|||
shadows: 2 |
|||
shadowResolution: 2 |
|||
shadowProjection: 1 |
|||
shadowCascades: 4 |
|||
shadowDistance: 150 |
|||
shadowNearPlaneOffset: 3 |
|||
shadowCascade2Split: 0.33333334 |
|||
shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} |
|||
shadowmaskMode: 1 |
|||
blendWeights: 4 |
|||
textureQuality: 0 |
|||
anisotropicTextures: 2 |
|||
antiAliasing: 2 |
|||
softParticles: 1 |
|||
softVegetation: 1 |
|||
realtimeReflectionProbes: 1 |
|||
billboardsFaceCameraPosition: 1 |
|||
vSyncCount: 1 |
|||
lodBias: 2 |
|||
maximumLODLevel: 0 |
|||
streamingMipmapsActive: 0 |
|||
streamingMipmapsAddAllCameras: 1 |
|||
streamingMipmapsMemoryBudget: 512 |
|||
streamingMipmapsRenderersPerFrame: 512 |
|||
streamingMipmapsMaxLevelReduction: 2 |
|||
streamingMipmapsMaxFileIORequests: 1024 |
|||
particleRaycastBudget: 4096 |
|||
asyncUploadTimeSlice: 2 |
|||
asyncUploadBufferSize: 16 |
|||
asyncUploadPersistentBuffer: 1 |
|||
resolutionScalingFixedDPIFactor: 1 |
|||
excludedTargetPlatforms: [] |
|||
m_PerPlatformDefaultQuality: |
|||
Android: 2 |
|||
Lumin: 5 |
|||
Nintendo 3DS: 5 |
|||
Nintendo Switch: 5 |
|||
PS4: 5 |
|||
PSP2: 2 |
|||
Stadia: 5 |
|||
Standalone: 5 |
|||
WebGL: 3 |
|||
Windows Store Apps: 5 |
|||
XboxOne: 5 |
|||
iPhone: 2 |
|||
tvOS: 2 |
|||
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<Game xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" configVersion="0"> |
|||
<Identity Name="FSR2Test" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" Version="1.0.0.0" /> |
|||
<ShellVisuals DefaultDisplayName="Default Display Name" PublisherDisplayName="DefaultCompany" StoreLogo="StoreLogo.png" Square150x150Logo="Logo.png" Square44x44Logo="SmallLogo.png" Description="Default Description" BackgroundColor="#000000" SplashScreenImage="SplashScreen.png" /> |
|||
<VirtualMachine /> |
|||
</Game> |
|||
@ -0,0 +1,43 @@ |
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!78 &1 |
|||
TagManager: |
|||
serializedVersion: 2 |
|||
tags: [] |
|||
layers: |
|||
- Default |
|||
- TransparentFX |
|||
- Ignore Raycast |
|||
- |
|||
- Water |
|||
- UI |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
- |
|||
m_SortingLayers: |
|||
- name: Default |
|||
uniqueID: 0 |
|||
locked: 0 |
|||
@ -0,0 +1,9 @@ |
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!5 &1 |
|||
TimeManager: |
|||
m_ObjectHideFlags: 0 |
|||
Fixed Timestep: 0.02 |
|||
Maximum Allowed Timestep: 0.33333334 |
|||
m_TimeScale: 1 |
|||
Maximum Particle Timestep: 0.03 |
|||
@ -0,0 +1,35 @@ |
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!310 &1 |
|||
UnityConnectSettings: |
|||
m_ObjectHideFlags: 0 |
|||
serializedVersion: 1 |
|||
m_Enabled: 0 |
|||
m_TestMode: 0 |
|||
m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events |
|||
m_EventUrl: https://cdp.cloud.unity3d.com/v1/events |
|||
m_ConfigUrl: https://config.uca.cloud.unity3d.com |
|||
m_DashboardUrl: https://dashboard.unity3d.com |
|||
m_TestInitMode: 0 |
|||
CrashReportingSettings: |
|||
m_EventUrl: https://perf-events.cloud.unity3d.com |
|||
m_Enabled: 0 |
|||
m_LogBufferSize: 10 |
|||
m_CaptureEditorExceptions: 1 |
|||
UnityPurchasingSettings: |
|||
m_Enabled: 0 |
|||
m_TestMode: 0 |
|||
UnityAnalyticsSettings: |
|||
m_Enabled: 0 |
|||
m_TestMode: 0 |
|||
m_InitializeOnStartup: 1 |
|||
UnityAdsSettings: |
|||
m_Enabled: 0 |
|||
m_InitializeOnStartup: 1 |
|||
m_TestMode: 0 |
|||
m_IosGameId: |
|||
m_AndroidGameId: |
|||
m_GameIds: {} |
|||
m_GameId: |
|||
PerformanceReportingSettings: |
|||
m_Enabled: 0 |
|||
@ -0,0 +1,12 @@ |
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!937362698 &1 |
|||
VFXManager: |
|||
m_ObjectHideFlags: 0 |
|||
m_IndirectShader: {fileID: 0} |
|||
m_CopyBufferShader: {fileID: 0} |
|||
m_SortShader: {fileID: 0} |
|||
m_StripUpdateShader: {fileID: 0} |
|||
m_RenderPipeSettingsPath: |
|||
m_FixedTimeStep: 0.016666668 |
|||
m_MaxDeltaTime: 0.05 |
|||
@ -0,0 +1,8 @@ |
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!890905787 &1 |
|||
VersionControlSettings: |
|||
m_ObjectHideFlags: 0 |
|||
m_Mode: Visible Meta Files |
|||
m_CollabEditorSettings: |
|||
inProgressEnabled: 1 |
|||
@ -0,0 +1,10 @@ |
|||
{ |
|||
"m_SettingKeys": [ |
|||
"VR Device Disabled", |
|||
"VR Device User Alert" |
|||
], |
|||
"m_SettingValues": [ |
|||
"False", |
|||
"False" |
|||
] |
|||
} |
|||
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<Game xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" configVersion="0"> |
|||
<Identity Name="FSR2Test" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" Version="1.0.0.0" /> |
|||
<ShellVisuals DefaultDisplayName="Default Display Name" PublisherDisplayName="DefaultCompany" StoreLogo="StoreLogo.png" Square150x150Logo="Logo.png" Square44x44Logo="SmallLogo.png" Description="Default Description" BackgroundColor="#000000" SplashScreenImage="SplashScreen.png" /> |
|||
<VirtualMachine /> |
|||
</Game> |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue