Skip to content

Commit 2c225f1

Browse files
author
runes
committed
Explicit tile coordinates in GetPositionInput.
~10% faster tile deferred light evaluation in compute
1 parent 7bac59b commit 2c225f1

91 files changed

Lines changed: 64 additions & 8087 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/Resources/DebugViewMaterialGBuffer.shader

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ Shader "Hidden/HDRenderPipeline/DebugViewMaterialGBuffer"
5151
float4 Frag(Varyings input) : SV_Target
5252
{
5353
// input.positionCS is SV_Position
54-
PositionInputs posInput = GetPositionInput(input.positionCS.xy, _ScreenSize.zw);
54+
PositionInputs posInput = GetPositionInput(input.positionCS.xy, _ScreenSize.zw, uint2(0, 0));
5555
float depth = LOAD_TEXTURE2D(_MainDepthTexture, posInput.unPositionSS).x;
5656
UpdatePositionInput(depth, _InvViewProjMatrix, _ViewProjMatrix, posInput);
5757

Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/Resources/DebugViewTiles.shader

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ Shader "Hidden/HDRenderPipeline/DebugViewTiles"
9292
float4 Frag(float4 positionCS : SV_POSITION) : SV_Target
9393
{
9494
// positionCS is SV_Position
95-
PositionInputs posInput = GetPositionInput(positionCS.xy, _ScreenSize.zw);
95+
PositionInputs posInput = GetPositionInput(positionCS.xy, _ScreenSize.zw, uint2(positionCS.xy) / GetTileSize());
9696
float depth = LOAD_TEXTURE2D(_MainDepthTexture, posInput.unPositionSS).x;
9797
UpdatePositionInput(depth, _InvViewProjMatrix, _ViewProjMatrix, posInput);
9898

@@ -134,7 +134,7 @@ Shader "Hidden/HDRenderPipeline/DebugViewTiles"
134134
int maxLights = 32;
135135
if (tileCoord.y < LIGHTCATEGORY_COUNT && tileCoord.x < maxLights + 3)
136136
{
137-
PositionInputs mousePosInput = GetPositionInput(_MousePixelCoord, _ScreenSize.zw);
137+
PositionInputs mousePosInput = GetPositionInput(_MousePixelCoord, _ScreenSize.zw, uint2(0,0));
138138
float depthMouse = LOAD_TEXTURE2D(_MainDepthTexture, mousePosInput.unPositionSS).x;
139139
UpdatePositionInput(depthMouse, _InvViewProjMatrix, _ViewProjMatrix, mousePosInput);
140140

Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/Resources/Deferred.shader

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ Shader "Hidden/HDRenderPipeline/Deferred"
104104
Outputs Frag(Varyings input)
105105
{
106106
// input.positionCS is SV_Position
107-
PositionInputs posInput = GetPositionInput(input.positionCS.xy, _ScreenSize.zw);
107+
PositionInputs posInput = GetPositionInput(input.positionCS.xy, _ScreenSize.zw, uint2(input.positionCS.xy) / GetTileSize());
108108
float depth = LOAD_TEXTURE2D(_MainDepthTexture, posInput.unPositionSS).x;
109109
UpdatePositionInput(depth, _InvViewProjMatrix, _ViewProjMatrix, posInput);
110110
float3 V = GetWorldSpaceNormalizeViewDir(posInput.positionWS);

Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/Resources/shadeopaque.compute

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ DECLARE_GBUFFER_TEXTURE(_GBufferTexture);
4747
void SHADE_OPAQUE_ENTRY(uint2 dispatchThreadId : SV_DispatchThreadID, uint2 groupId : SV_GroupID)
4848
{
4949
uint2 pixelCoord = dispatchThreadId;
50-
PositionInputs posInput = GetPositionInput(pixelCoord.xy, _ScreenSize.zw);
50+
//PositionInputs posInput = GetPositionInput(pixelCoord.xy, _ScreenSize.zw, uint2(pixelCoord.xy) / GetTileSize());
51+
PositionInputs posInput = GetPositionInput(pixelCoord.xy, _ScreenSize.zw, groupId);
5152
float depth = LOAD_TEXTURE2D(_MainDepthTexture, posInput.unPositionSS).x;
5253
UpdatePositionInput(depth, _InvViewProjMatrix, _ViewProjMatrix, posInput);
5354
float3 V = GetWorldSpaceNormalizeViewDir(posInput.positionWS);

Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/TilePassLoop.hlsl

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ void ApplyDebug(LightLoopContext lightLoopContext, float3 positionWS, inout floa
4949
// Calculate the offset in global light index light for current light category
5050
int GetTileOffset(PositionInputs posInput, uint lightCategory)
5151
{
52-
uint2 tileIndex = posInput.unPositionSS / TILE_SIZE_FPTL;
52+
uint2 tileIndex = posInput.unTileCoord;
5353
return (tileIndex.y + lightCategory * _LightingSettings[0].numTileFtplY) * _LightingSettings[0].numTileFtplX + tileIndex.x;
5454
}
5555

@@ -69,9 +69,13 @@ uint FetchIndexTile(uint tileOffset, uint lightIndex)
6969
return (g_vLightListGlobal[DWORD_PER_TILE * tileOffset + (lightIndexPlusOne >> 1)] >> ((lightIndexPlusOne & 1) * DWORD_PER_TILE)) & 0xffff;
7070
}
7171

72-
7372
#ifdef USE_FPTL_LIGHTLIST
7473

74+
uint GetTileSize()
75+
{
76+
return TILE_SIZE_FPTL;
77+
}
78+
7579
void GetCountAndStart(PositionInputs posInput, uint lightCategory, out uint start, out uint lightCount)
7680
{
7781
GetCountAndStartTile(posInput, lightCategory, start, lightCount);
@@ -86,9 +90,14 @@ uint FetchIndex(uint tileOffset, uint lightIndex)
8690

8791
#include "ClusteredUtils.hlsl"
8892

93+
uint GetTileSize()
94+
{
95+
return TILE_SIZE_CLUSTERED;
96+
}
97+
8998
void GetCountAndStartCluster(PositionInputs posInput, uint lightCategory, out uint start, out uint lightCount)
9099
{
91-
uint2 tileIndex = posInput.unPositionSS / TILE_SIZE_CLUSTERED;
100+
uint2 tileIndex = posInput.unTileCoord;
92101

93102
float logBase = g_fClustBase;
94103
if (g_isLogBaseBufferEnabled)
@@ -254,6 +263,12 @@ void LightLoop( float3 V, PositionInputs posInput, PreLightData prelightData, BS
254263

255264
#else // LIGHTLOOP_SINGLE_PASS
256265

266+
uint GetTileSize()
267+
{
268+
return 1;
269+
}
270+
271+
257272
// bakeDiffuseLighting is part of the prototype so a user is able to implement a "base pass" with GI and multipass direct light (aka old unity rendering path)
258273
void LightLoop( float3 V, PositionInputs posInput, PreLightData prelightData, BSDFData bsdfData, float3 bakeDiffuseLighting,
259274
out float3 diffuseLighting,

Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/Resources/CombineSubsurfaceScattering.shader

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ Shader "Hidden/HDRenderPipeline/CombineSubsurfaceScattering"
8383

8484
float4 Frag(Varyings input) : SV_Target
8585
{
86-
PositionInputs posInput = GetPositionInput(input.positionCS.xy, _ScreenSize.zw);
86+
PositionInputs posInput = GetPositionInput(input.positionCS.xy, _ScreenSize.zw, uint2(0, 0));
8787

8888
float2 gBufferData = LOAD_TEXTURE2D(_GBufferTexture2, posInput.unPositionSS).ra;
8989
int profileID = int(gBufferData.y * N_PROFILES);

Assets/ScriptableRenderPipeline/HDRenderPipeline/ShaderPass/ShaderPassDebugViewMaterial.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ void Frag( PackedVaryingsToPS packedInput
3737
FragInputs input = UnpackVaryingsMeshToFragInputs(packedInput.vmesh);
3838

3939
// input.unPositionSS is SV_Position
40-
PositionInputs posInput = GetPositionInput(input.unPositionSS.xy, _ScreenSize.zw);
40+
PositionInputs posInput = GetPositionInput(input.unPositionSS.xy, _ScreenSize.zw, uint2(input.unPositionSS.xy) / GetTileSize());
4141
UpdatePositionInput(input.unPositionSS.z, input.unPositionSS.w, input.positionWS, posInput);
4242
float3 V = GetWorldSpaceNormalizeViewDir(input.positionWS);
4343

Assets/ScriptableRenderPipeline/HDRenderPipeline/ShaderPass/ShaderPassDepthOnly.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ void Frag( PackedVaryingsToPS packedInput,
3434
FragInputs input = UnpackVaryingsMeshToFragInputs(packedInput.vmesh);
3535

3636
// input.unPositionSS is SV_Position
37-
PositionInputs posInput = GetPositionInput(input.unPositionSS.xy, _ScreenSize.zw);
37+
PositionInputs posInput = GetPositionInput(input.unPositionSS.xy, _ScreenSize.zw, uint2(input.unPositionSS.xy) / GetTileSize());
3838
UpdatePositionInput(input.unPositionSS.z, input.unPositionSS.w, input.positionWS, posInput);
3939
float3 V = GetWorldSpaceNormalizeViewDir(input.positionWS);
4040

Assets/ScriptableRenderPipeline/HDRenderPipeline/ShaderPass/ShaderPassDistortion.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ float4 Frag(PackedVaryingsToPS packedInput) : SV_Target
2929
FragInputs input = UnpackVaryingsMeshToFragInputs(packedInput.vmesh);
3030

3131
// input.unPositionSS is SV_Position
32-
PositionInputs posInput = GetPositionInput(input.unPositionSS.xy, _ScreenSize.zw);
32+
PositionInputs posInput = GetPositionInput(input.unPositionSS.xy, _ScreenSize.zw, uint2(input.unPositionSS.xy) / GetTileSize());
3333
UpdatePositionInput(input.unPositionSS.z, input.unPositionSS.w, input.positionWS, posInput);
3434
float3 V = GetWorldSpaceNormalizeViewDir(input.positionWS);
3535

Assets/ScriptableRenderPipeline/HDRenderPipeline/ShaderPass/ShaderPassForward.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ void Frag(PackedVaryingsToPS packedInput,
3434
FragInputs input = UnpackVaryingsMeshToFragInputs(packedInput.vmesh);
3535

3636
// input.unPositionSS is SV_Position
37-
PositionInputs posInput = GetPositionInput(input.unPositionSS.xy, _ScreenSize.zw);
37+
PositionInputs posInput = GetPositionInput(input.unPositionSS.xy, _ScreenSize.zw, uint2(input.unPositionSS.xy) / GetTileSize());
3838
UpdatePositionInput(input.unPositionSS.z, input.unPositionSS.w, input.positionWS, posInput);
3939
float3 V = GetWorldSpaceNormalizeViewDir(input.positionWS);
4040

0 commit comments

Comments
 (0)