Skip to content

Fix issue with SC_PrimitiveID not handlded correctly for overdraw (fail to compil with XR) #2164

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Oct 10, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions com.unity.render-pipelines.high-definition/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- Meshes assigned with a decal material are not visible anymore in ray-tracing or path-tracing.
- Removed BLEND shader keywords.
- Remove a rendergraph debug option to clear resources on release from UI.
- added SV_PrimitiveID in the VaryingMesh structure for fulldebugscreenpass as well as primitiveID in FragInputs

## [10.0.0] - 2019-06-10

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ public struct VaryingsMeshToPS
subscriptOptions : StructFieldOptions.Optional);
public static FieldDescriptor instanceID = new FieldDescriptor(VaryingsMeshToPS.name, "instanceID", "", ShaderValueType.Uint,
"CUSTOM_INSTANCE_ID", "UNITY_ANY_INSTANCING_ENABLED");
public static FieldDescriptor primitiveID = new FieldDescriptor(VaryingsMeshToPS.name, "primitiveID", "VARYINGS_NEED_PRIMITIVEID", ShaderValueType.Uint,
"SV_PrimitiveID", "defined(PLATFORM_SUPPORTS_PRIMITIVE_ID_IN_PIXEL_SHADER) && defined(SHADER_STAGE_FRAGMENT) && (defined(VARYINGS_NEED_PRIMITIVEID) || (SHADERPASS == SHADERPASS_FULLSCREEN_DEBUG))", StructFieldOptions.Generated & StructFieldOptions.Optional);
public static FieldDescriptor cullFace = new FieldDescriptor(VaryingsMeshToPS.name, "cullFace", "VARYINGS_NEED_CULLFACE", "FRONT_FACE_TYPE",
"FRONT_FACE_SEMANTIC", "defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)", StructFieldOptions.Generated & StructFieldOptions.Optional);
}
Expand Down Expand Up @@ -96,6 +98,8 @@ public struct FragInputs
subscriptOptions : StructFieldOptions.Optional);
public static FieldDescriptor color = new FieldDescriptor(FragInputs.name, "color", "", ShaderValueType.Float4,
subscriptOptions : StructFieldOptions.Optional);
public static FieldDescriptor primitiveID = new FieldDescriptor(FragInputs.name, "primitiveID", "", ShaderValueType.Uint,
subscriptOptions: StructFieldOptions.Optional);
public static FieldDescriptor IsFrontFace = new FieldDescriptor(FragInputs.name, "isFrontFace", "", ShaderValueType.Boolean,
subscriptOptions : StructFieldOptions.Optional);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ static class HDStructs
HDStructFields.VaryingsMeshToPS.texCoord3,
HDStructFields.VaryingsMeshToPS.color,
HDStructFields.VaryingsMeshToPS.instanceID,
HDStructFields.VaryingsMeshToPS.primitiveID,
HDStructFields.VaryingsMeshToPS.cullFace,
}
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,7 @@ static class CoreFieldDependencies
new FieldDependency(HDStructFields.FragInputs.texCoord2, HDStructFields.VaryingsMeshToPS.texCoord2),
new FieldDependency(HDStructFields.FragInputs.texCoord3, HDStructFields.VaryingsMeshToPS.texCoord3),
new FieldDependency(HDStructFields.FragInputs.color, HDStructFields.VaryingsMeshToPS.color),
new FieldDependency(HDStructFields.FragInputs.primitiveID, HDStructFields.VaryingsMeshToPS.primitiveID),
new FieldDependency(HDStructFields.FragInputs.IsFrontFace, HDStructFields.VaryingsMeshToPS.cullFace),
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ FragInputs BuildFragInputs(VaryingsMeshToPS input)
$FragInputs.texCoord3: output.texCoord3 = input.texCoord3;
$FragInputs.color: output.color = input.color;

#if defined(PLATFORM_SUPPORTS_PRIMITIVE_ID_IN_PIXEL_SHADER) && defined(SHADER_STAGE_FRAGMENT) && (defined(VARYINGS_NEED_PRIMITIVEID) || (SHADERPASS == SHADERPASS_FULLSCREEN_DEBUG))
output.primitiveID = input.primitiveID;
#endif

#if defined(VARYINGS_NEED_CULLFACE) && SHADER_STAGE_FRAGMENT
output.isFrontFace = IS_FRONT_VFACE(input.cullFace, true, false);
#endif
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ struct FragInputs
// When not using surface gradient, each vector of tangentToWorld are normalize (TODO: Maybe they should not even in case of no surface gradient ? Ask Morten)
float3x3 tangentToWorld;

uint primitiveID; // Only with fullscreen pass debug currently - not supported on all platforms

// For two sided lighting
bool isFrontFace;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,21 +31,17 @@ PackedVaryingsToPS VertTesselation(VaryingsToDS input)
#if !defined(_DEPTHOFFSET_ON)
[earlydepthstencil] // quad overshading debug mode writes to UAV
#endif
void Frag(
#ifdef PLATFORM_SUPPORTS_PRIMITIVE_ID_IN_PIXEL_SHADER
uint primitiveID : SV_PrimitiveID, // Must be declare before FRONT_FACE_SEMANTIC
#endif
PackedVaryingsToPS packedInput)
void Frag(PackedVaryingsToPS packedInput)
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput);
FragInputs input = UnpackVaryingsMeshToFragInputs(packedInput.vmesh);

PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS.xyz);

#ifdef PLATFORM_SUPPORTS_PRIMITIVE_ID_IN_PIXEL_SHADER
if (_DebugFullScreenMode == FULLSCREENDEBUGMODE_QUAD_OVERDRAW)
{
#ifdef PLATFORM_SUPPORTS_PRIMITIVE_ID_IN_PIXEL_SHADER
IncrementQuadOverdrawCounter(posInput.positionSS.xy, primitiveID);
#endif
IncrementQuadOverdrawCounter(posInput.positionSS.xy, input.primitiveID);
}
#endif
}
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,18 @@ struct PackedVaryingsMeshToPS
float4 interpolators5 : TEXCOORD5;
#endif

UNITY_VERTEX_INPUT_INSTANCE_ID // Must be declare before FRONT_FACE_SEMANTIC
// In order to compile on all HDRP target platform we need to respect the following order for semantic:
// - SV_RenderTargetArrayIndex // use for stereo instancing - Must be declare before SV_IsFrontFace
// - SV_PrimitiveID // Must be declare before SV_IsFrontFace and after SV_RenderTargetArrayIndex
// - SV_IsFrontFace

UNITY_VERTEX_INPUT_INSTANCE_ID

#ifdef PLATFORM_SUPPORTS_PRIMITIVE_ID_IN_PIXEL_SHADER
#if (defined(VARYINGS_NEED_PRIMITIVEID) || (SHADERPASS == SHADERPASS_FULLSCREEN_DEBUG)) && SHADER_STAGE_FRAGMENT
uint primitiveID : SV_PrimitiveID;
#endif
#endif

#if defined(VARYINGS_NEED_CULLFACE) && SHADER_STAGE_FRAGMENT
FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;
Expand Down Expand Up @@ -169,6 +180,12 @@ FragInputs UnpackVaryingsMeshToFragInputs(PackedVaryingsMeshToPS input)
output.color = input.interpolators5;
#endif

#ifdef PLATFORM_SUPPORTS_PRIMITIVE_ID_IN_PIXEL_SHADER
#if (defined(VARYINGS_NEED_PRIMITIVEID) || (SHADERPASS == SHADERPASS_FULLSCREEN_DEBUG)) && SHADER_STAGE_FRAGMENT
output.primitiveID = input.primitiveID;
#endif
#endif

#if defined(VARYINGS_NEED_CULLFACE) && SHADER_STAGE_FRAGMENT
output.isFrontFace = IS_FRONT_VFACE(input.cullFace, true, false);
#endif
Expand Down