@@ -48,7 +48,7 @@ TestRenderTargets ImportAndCreateRenderTargets(RenderGraph g)
4848 var extraDepthBufferHandle = RTHandles . Alloc ( depthBuffer , "Extra Depth Buffer" ) ;
4949 var extraDepthBufferBottomLeftHandle = RTHandles . Alloc ( depthBuffer , "Extra Depth Buffer Bottom Left" ) ;
5050 var extraTextureTopLeftHandle = RTHandles . Alloc ( backBuffer , "ExtraTextureTopLeft" ) ;
51- var extraTextureBottomLeftHandle = RTHandles . Alloc ( backBuffer , "ExtraTextureBottomLeft" ) ;
51+ var extraTextureBottomLeftHandle = RTHandles . Alloc ( backBuffer , "ExtraTextureBottomLeft" ) ;
5252
5353 ImportResourceParams importParams = new ImportResourceParams ( ) ;
5454 importParams . textureUVOrigin = TextureUVOrigin . TopLeft ;
@@ -1629,57 +1629,98 @@ public void UpdateSubpassAttachmentIndices_WhenDepthAttachmentIsAdded()
16291629 Assert . IsTrue ( subPassDesc3 . inputs [ 0 ] == 3 ) ;
16301630 }
16311631
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.
16331632 [ Test ]
1634- public void UpdateShadingRateImageIndex_WhenDepthAttachmentIsAdded ()
1633+ public void MergePasses_WhenSameShadingRateImage ( )
16351634 {
16361635 var g = AllocateRenderGraph ( ) ;
16371636 var renderTargets = ImportAndCreateRenderTargets ( g ) ;
16381637
1639- using (var builder = g.AddRasterRenderPass<RenderGraphTestPassData>("NoDepth_Subpass0 ", out var passData))
1638+ using ( var builder = g . AddRasterRenderPass < RenderGraphTestPassData > ( "Pass0 " , out var passData ) )
16401639 {
1641- builder.SetShadingRateImageAttachment(renderTargets.extraTextures[0]);
16421640 builder . SetRenderAttachment ( renderTargets . extraTextures [ 1 ] , 0 ) ;
1641+ builder . SetShadingRateImageAttachment ( renderTargets . extraTextures [ 0 ] ) ;
16431642 builder . SetRenderFunc ( ( RenderGraphTestPassData data , RasterGraphContext context ) => { } ) ;
16441643 builder . AllowPassCulling ( false ) ;
16451644 }
16461645
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 ) )
16531648 {
1649+ builder . SetRenderAttachment ( renderTargets . extraTextures [ 1 ] , 0 ) ;
16541650 builder . SetShadingRateImageAttachment ( renderTargets . extraTextures [ 0 ] ) ;
1655- builder.SetRenderAttachmentDepth(renderTargets.depthBuffer, AccessFlags.Write);
1656- builder.SetRenderAttachment(renderTargets.extraTextures[2], 0);
16571651 builder . SetRenderFunc ( ( RenderGraphTestPassData data , RasterGraphContext context ) => { } ) ;
16581652 builder . AllowPassCulling ( false ) ;
16591653 }
16601654
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+ }
16661663
16671664 var result = g . CompileNativeRenderGraph ( g . ComputeGraphHash ( ) ) ;
16681665 var passes = result . contextData . GetNativePasses ( ) ;
16691666
16701667 // 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 ) ;
16721669
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+ }
16781678
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+ }
16811723 }
1682- */
16831724
16841725/* // DepthAttachment bug: https://jira.unity3d.com/projects/SRP/issues/SRP-897
16851726 [Test]
0 commit comments