UnityGame/Library/PackageCache/com.unity.render-pipelines.universal/Tests/Editor/NativeRenderPassTests.cs
2024-10-27 10:53:47 +03:00

132 lines
4.5 KiB
C#

using System;
using NUnit.Framework;
using UnityEngine.TestTools;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
namespace UnityEditor.Rendering.Universal.Tests
{
[TestFixture]
class NativeRenderPassTests
{
internal class TestHelper
{
internal UniversalRendererData rendererData;
internal UniversalCameraData cameraData;
internal UniversalRenderPipelineAsset urpAsset;
internal ScriptableRenderer scriptableRenderer;
public TestHelper()
{
try
{
rendererData = ScriptableObject.CreateInstance<UniversalRendererData>();
urpAsset = UniversalRenderPipelineAsset.Create(rendererData);
urpAsset.name = "TestHelper_URPAsset";
GraphicsSettings.defaultRenderPipeline = urpAsset;
scriptableRenderer = urpAsset.GetRenderer(0);
cameraData = new UniversalCameraData();
ResetData();
}
catch (Exception e)
{
Debug.LogError(e.StackTrace);
Cleanup();
}
}
internal void ResetData()
{
scriptableRenderer.useRenderPassEnabled = true;
}
internal void Cleanup()
{
ScriptableObject.DestroyImmediate(urpAsset);
ScriptableObject.DestroyImmediate(rendererData);
}
}
private TestHelper m_TestHelper;
private RenderPipelineAsset m_PreviousRenderPipelineAssetGraphicsSettings;
private RenderPipelineAsset m_PreviousRenderPipelineAssetQualitySettings;
public class TestRenderPassUseNRP : ScriptableRenderPass
{
public TestRenderPassUseNRP()
{
// Initialize with this argument to true, to avoid other unrelated errors
overrideCameraTarget = true;
// Enable the use of Native Render Pass. This is set to true by defalult, but we want to make it explicit
useNativeRenderPass = true;
}
}
[OneTimeSetUp]
public void OneTimeSetup()
{
m_PreviousRenderPipelineAssetGraphicsSettings = GraphicsSettings.defaultRenderPipeline;
m_PreviousRenderPipelineAssetQualitySettings = QualitySettings.renderPipeline;
GraphicsSettings.defaultRenderPipeline = null;
QualitySettings.renderPipeline = null;
}
[SetUp]
public void Setup()
{
m_TestHelper = new();
m_TestHelper.ResetData();
}
[TearDown]
public void TearDown()
{
m_TestHelper.Cleanup();
}
[OneTimeTearDown]
public void OneTimeTearDown()
{
GraphicsSettings.defaultRenderPipeline = m_PreviousRenderPipelineAssetGraphicsSettings;
QualitySettings.renderPipeline = m_PreviousRenderPipelineAssetQualitySettings;
}
public void InitializeRenderPassQueue(ScriptableRenderer renderer, int count)
{
for (int i = 0; i < count; i++)
{
renderer.EnqueuePass(new TestRenderPassUseNRP());
}
}
[Test]
public void UnderLimitRenderPassInNRP()
{
// Use kRenderPassMaxCount so this is the maximun allowed
InitializeRenderPassQueue(m_TestHelper.scriptableRenderer, ScriptableRenderer.kRenderPassMaxCount);
// Check that no exception is thrown.
Assert.DoesNotThrow(() => m_TestHelper.scriptableRenderer.SetupNativeRenderPassFrameData(m_TestHelper.cameraData, true));
}
[Test]
public void OverLimitRenderPassInNRP()
{
// Increase by one the maximum allowed render passes
InitializeRenderPassQueue(m_TestHelper.scriptableRenderer, ScriptableRenderer.kRenderPassMaxCount+1);
// Check that a logError is thrown, but no other errors are thrown.
m_TestHelper.scriptableRenderer.SetupNativeRenderPassFrameData( m_TestHelper.cameraData, true );
LogAssert.Expect($"Exceeded the maximum number of Render Passes (${ScriptableRenderer.kRenderPassMaxCount}). Please consider using Render Graph to support a higher number of render passes with Native RenderPass, note support will be enabled by default.");
}
}
}