@@ -48,7 +48,7 @@ TestRenderTargets ImportAndCreateRenderTargets(RenderGraph g)
48
48
var extraDepthBufferHandle = RTHandles . Alloc ( depthBuffer , "Extra Depth Buffer" ) ;
49
49
var extraDepthBufferBottomLeftHandle = RTHandles . Alloc ( depthBuffer , "Extra Depth Buffer Bottom Left" ) ;
50
50
var extraTextureTopLeftHandle = RTHandles . Alloc ( backBuffer , "ExtraTextureTopLeft" ) ;
51
- var extraTextureBottomLeftHandle = RTHandles . Alloc ( backBuffer , "ExtraTextureBottomLeft" ) ;
51
+ var extraTextureBottomLeftHandle = RTHandles . Alloc ( backBuffer , "ExtraTextureBottomLeft" ) ;
52
52
53
53
ImportResourceParams importParams = new ImportResourceParams ( ) ;
54
54
importParams . textureUVOrigin = TextureUVOrigin . TopLeft ;
@@ -1629,57 +1629,98 @@ public void UpdateSubpassAttachmentIndices_WhenDepthAttachmentIsAdded()
1629
1629
Assert . IsTrue ( subPassDesc3 . inputs [ 0 ] == 3 ) ;
1630
1630
}
1631
1631
1632
- /* //VRS bug. It seems that there is a bug with VRS forcing pass breaking between passes using the same shading rate image where it shouldn't: UUM-102113.
1633
1632
[ Test ]
1634
- public void UpdateShadingRateImageIndex_WhenDepthAttachmentIsAdded ()
1633
+ public void MergePasses_WhenSameShadingRateImage ( )
1635
1634
{
1636
1635
var g = AllocateRenderGraph ( ) ;
1637
1636
var renderTargets = ImportAndCreateRenderTargets ( g ) ;
1638
1637
1639
- using (var builder = g.AddRasterRenderPass<RenderGraphTestPassData>("NoDepth_Subpass0 ", out var passData))
1638
+ using ( var builder = g . AddRasterRenderPass < RenderGraphTestPassData > ( "Pass0 " , out var passData ) )
1640
1639
{
1641
- builder.SetShadingRateImageAttachment(renderTargets.extraTextures[0]);
1642
1640
builder . SetRenderAttachment ( renderTargets . extraTextures [ 1 ] , 0 ) ;
1641
+ builder . SetShadingRateImageAttachment ( renderTargets . extraTextures [ 0 ] ) ;
1643
1642
builder . SetRenderFunc ( ( RenderGraphTestPassData data , RasterGraphContext context ) => { } ) ;
1644
1643
builder . AllowPassCulling ( false ) ;
1645
1644
}
1646
1645
1647
- // Render Pass
1648
- // attachments: [extraTextures[0], extraTextures[1]]
1649
- // shading rate image : [0]
1650
- // subpass 0: color outputs : [1]
1651
-
1652
- using (var builder = g.AddRasterRenderPass<RenderGraphTestPassData>("Depth_Subpass1", out var passData))
1646
+ // Same attachments, we should merge in the same subpass as Pass0's one
1647
+ using ( var builder = g . AddRasterRenderPass < RenderGraphTestPassData > ( "Pass1" , out var passData ) )
1653
1648
{
1649
+ builder . SetRenderAttachment ( renderTargets . extraTextures [ 1 ] , 0 ) ;
1654
1650
builder . SetShadingRateImageAttachment ( renderTargets . extraTextures [ 0 ] ) ;
1655
- builder.SetRenderAttachmentDepth(renderTargets.depthBuffer, AccessFlags.Write);
1656
- builder.SetRenderAttachment(renderTargets.extraTextures[2], 0);
1657
1651
builder . SetRenderFunc ( ( RenderGraphTestPassData data , RasterGraphContext context ) => { } ) ;
1658
1652
builder . AllowPassCulling ( false ) ;
1659
1653
}
1660
1654
1661
- // Render Pass
1662
- // attachments: [depthBuffer, extraTextures[1], extraTextures[0], extraTextures[2]]
1663
- // shading rate image : [0 -> 2]
1664
- // subpass 0: color outputs : [1]
1665
- // subpass 1: color outputs : [3]
1655
+ // Same shading rate image but different render attachments, we should stay in the same native render pass but in a different subpass
1656
+ using ( var builder = g . AddRasterRenderPass < RenderGraphTestPassData > ( "Pass2" , out var passData ) )
1657
+ {
1658
+ builder . SetRenderAttachment ( renderTargets . extraTextures [ 2 ] , 0 ) ;
1659
+ builder . SetShadingRateImageAttachment ( renderTargets . extraTextures [ 0 ] ) ;
1660
+ builder . SetRenderFunc ( ( RenderGraphTestPassData data , RasterGraphContext context ) => { } ) ;
1661
+ builder . AllowPassCulling ( false ) ;
1662
+ }
1666
1663
1667
1664
var result = g . CompileNativeRenderGraph ( g . ComputeGraphHash ( ) ) ;
1668
1665
var passes = result . contextData . GetNativePasses ( ) ;
1669
1666
1670
1667
// All graph passes are merged in the same render pass
1671
- Assert.IsTrue(passes != null && passes.Count == 1 && passes[0].numGraphPasses == 2 && passes[0].numNativeSubPasses == 2);
1668
+ Assert . IsTrue ( passes != null && passes . Count == 1 && passes [ 0 ] . numGraphPasses == 3 && passes [ 0 ] . numNativeSubPasses == 2 ) ;
1672
1669
1673
- // Depth is the first attachment
1674
- Assert.IsTrue(passes[0].attachments[0].handle.index == renderTargets.depthBuffer.handle.index);
1675
- Assert.IsTrue(passes[0].attachments[1].handle.index == renderTargets.extraTextures[1].handle.index);
1676
- Assert.IsTrue(passes[0].attachments[2].handle.index == renderTargets.extraTextures[0].handle.index);
1677
- Assert.IsTrue(passes[0].attachments[3].handle.index == renderTargets.extraTextures[2].handle.index);
1670
+ // If no SRI support, we just discard the API call
1671
+ if ( ShadingRateInfo . supportsPerImageTile )
1672
+ {
1673
+ var shadingRateImageAttachmentIndex = passes [ 0 ] . shadingRateImageIndex ;
1674
+ Assert . IsTrue ( shadingRateImageAttachmentIndex == 1 ) ; // always after color and depth attachments
1675
+ Assert . IsTrue ( passes [ 0 ] . attachments [ shadingRateImageAttachmentIndex ] . handle . index == renderTargets . extraTextures [ 0 ] . handle . index ) ;
1676
+ }
1677
+ }
1678
1678
1679
- // Check Shading Rate Image index is correctly updated
1680
- Assert.IsTrue(passes[0].shadingRateImageIndex == renderTargets.extraTextures[0].handle.index);
1679
+ [ Test ]
1680
+ public void BreakPasses_WhenNoOrDifferentShadingRateImage ( )
1681
+ {
1682
+ var g = AllocateRenderGraph ( ) ;
1683
+ var renderTargets = ImportAndCreateRenderTargets ( g ) ;
1684
+
1685
+ using ( var builder = g . AddRasterRenderPass < RenderGraphTestPassData > ( "Pass0" , out var passData ) )
1686
+ {
1687
+ builder . SetRenderAttachment ( renderTargets . extraTextures [ 1 ] , 0 ) ;
1688
+ builder . SetShadingRateImageAttachment ( renderTargets . extraTextures [ 0 ] ) ;
1689
+ builder . SetRenderFunc ( ( RenderGraphTestPassData data , RasterGraphContext context ) => { } ) ;
1690
+ builder . AllowPassCulling ( false ) ;
1691
+ }
1692
+
1693
+ // Different SRI, we should break into a new native render pass
1694
+ using ( var builder = g . AddRasterRenderPass < RenderGraphTestPassData > ( "Pass1" , out var passData ) )
1695
+ {
1696
+ builder . SetRenderAttachment ( renderTargets . extraTextures [ 1 ] , 0 ) ;
1697
+ builder . SetShadingRateImageAttachment ( renderTargets . extraTextures [ 2 ] ) ;
1698
+ builder . SetRenderFunc ( ( RenderGraphTestPassData data , RasterGraphContext context ) => { } ) ;
1699
+ builder . AllowPassCulling ( false ) ;
1700
+ }
1701
+
1702
+ // No SRI, we should break into a new native render pass
1703
+ using ( var builder = g . AddRasterRenderPass < RenderGraphTestPassData > ( "Pass2" , out var passData ) )
1704
+ {
1705
+ builder . SetRenderAttachment ( renderTargets . extraTextures [ 1 ] , 0 ) ;
1706
+ builder . SetRenderFunc ( ( RenderGraphTestPassData data , RasterGraphContext context ) => { } ) ;
1707
+ builder . AllowPassCulling ( false ) ;
1708
+ }
1709
+
1710
+ var result = g . CompileNativeRenderGraph ( g . ComputeGraphHash ( ) ) ;
1711
+ var passes = result . contextData . GetNativePasses ( ) ;
1712
+
1713
+ if ( ShadingRateInfo . supportsPerImageTile )
1714
+ {
1715
+ // All graph passes are in different native render passes
1716
+ Assert . IsTrue ( passes != null && passes . Count == 3 ) ;
1717
+ }
1718
+ else
1719
+ {
1720
+ // If no SRI support, we just discard the API call, all graph passes are merged together
1721
+ Assert . IsTrue ( passes != null && passes . Count == 1 ) ;
1722
+ }
1681
1723
}
1682
- */
1683
1724
1684
1725
/* // DepthAttachment bug: https://jira.unity3d.com/projects/SRP/issues/SRP-897
1685
1726
[Test]
0 commit comments