A game about forced loneliness, made by TACStudios
1#pragma kernel StpPreTaa
2
3#pragma multi_compile _ ENABLE_DEBUG_MODE
4#pragma multi_compile _ ENABLE_LARGE_KERNEL
5
6#pragma multi_compile _ UNITY_DEVICE_SUPPORTS_NATIVE_16BIT
7
8#pragma multi_compile _ DISABLE_TEXTURE2D_X_ARRAY
9
10#pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch
11
12#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
13#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
14#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl"
15
16#define STP_DIL 1
17#define STP_SAA 1
18
19#include "Packages/com.unity.render-pipelines.core/Runtime/STP/StpCommon.hlsl"
20
21//
22// Input
23//
24
25TEXTURE2D_X(_StpIntermediateConvergence);
26
27//
28// Intermediate Output
29//
30
31RW_TEXTURE2D_X(float, _StpIntermediateWeights);
32
33//
34// History Input/Output
35//
36
37TEXTURE2D_X(_StpLuma);
38RW_TEXTURE2D_X(float, _StpConvergence);
39
40// DIL
41#if defined(STP_16BIT)
42StpH1 StpDilDitH(StpW2 o) { return StpDitH1(o); }
43StpH1 StpDilConH(StpF2 p) { return (StpH1)SAMPLE_TEXTURE2D_X_LOD(_StpIntermediateConvergence, s_linear_clamp_sampler, p, 0).r; }
44StpH4 StpDilCon4H(StpF2 p) { return (StpH4)GATHER_RED_TEXTURE2D_X(_StpIntermediateConvergence, s_point_clamp_sampler, p); }
45#endif
46#if defined(STP_32BIT)
47StpMF1 StpDilDitF(StpMU2 o) { return StpDitF1(o); }
48StpMF1 StpDilConF(StpF2 p) { return (StpMF1)SAMPLE_TEXTURE2D_X_LOD(_StpIntermediateConvergence, s_linear_clamp_sampler, p, 0).r; }
49StpMF4 StpDilCon4F(StpF2 p) { return (StpMF4)GATHER_RED_TEXTURE2D_X(_StpIntermediateConvergence, s_point_clamp_sampler, p); }
50#endif
51
52// SAA
53#if defined(STP_16BIT)
54StpH4 StpSaaLum4H(StpF2 p) { return (StpH4)GATHER_RED_TEXTURE2D_X(_StpLuma, s_point_clamp_sampler, p); }
55#endif
56#if defined(STP_32BIT)
57StpMF4 StpSaaLum4F(StpF2 p) { return (StpMF4)GATHER_RED_TEXTURE2D_X(_StpLuma, s_point_clamp_sampler, p); }
58#endif
59
60#define THREADING_BLOCK_SIZE STP_GROUP_SIZE
61#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Threading.hlsl"
62
63[numthreads(STP_GROUP_SIZE, 1, 1)]
64void StpPreTaa(Threading::Group group)
65{
66 UNITY_XR_ASSIGN_VIEW_INDEX(group.groupID.z);
67
68#if defined(STP_16BIT)
69 StpW1 lane = StpW1_(group.groupIndex);
70 StpW2 groupPos = ComputeGroupPos(StpW2(group.groupID.xy));
71 StpW2 pos = groupPos + StpRemapLaneTo8x16H(lane);
72 StpW2 dilationSize = StpW2(asuint(_StpDilConstants0.zw)); // TODO: 16-bit packed constant?
73#else
74 StpMU1 lane = StpMU1_(group.groupIndex);
75 StpMU2 groupPos = ComputeGroupPos(StpMU2(group.groupID.xy));
76 StpMU2 pos = groupPos + StpRemapLaneTo8x16F(lane);
77 StpMU2 dilationSize = StpMU2(asuint(_StpDilConstants0).zw);
78#endif
79
80 // The dilation logic only runs for a subset of the input image size
81 if (all(groupPos < dilationSize))
82 {
83 half convergence;
84
85#if defined(STP_16BIT)
86 StpDilH(
87#else
88 StpDilF(
89#endif
90 convergence,
91
92 pos,
93
94 asuint(_StpDilConstants0)
95 );
96
97 _StpConvergence[COORD_TEXTURE2D_X(pos)] = convergence;
98 }
99
100 half weights;
101
102#if defined(STP_16BIT)
103 StpSaaH(
104#else
105 StpSaaF(
106#endif
107 weights,
108
109 pos,
110
111 // SAA uses the same constants as the pattern matcher
112 asuint(_StpSetupConstants0)
113 );
114
115 _StpIntermediateWeights[COORD_TEXTURE2D_X(pos)] = weights;
116}
117