Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using UnityEngine.Experimental.Rendering;
using UnityEngine.Rendering.HighDefinition;
using System.Diagnostics;
using System.Reflection;
using Debug = UnityEngine.Debug;

namespace UnityEditor.Rendering.HighDefinition
Expand Down Expand Up @@ -321,6 +322,11 @@ public void OnProcessComputeShader(ComputeShader shader, string kernelName, ILis
if (HDRenderPipelineGlobalSettings.Ensure(canCreateNewAsset: false) == null)
return;

// Discard any compute shader use for raytracing if none of the RP asset required it
ComputeShader unused;
if (!ShaderBuildPreprocessor.playerNeedRaytracing && ShaderBuildPreprocessor.computeShaderCache.TryGetValue(shader.GetInstanceID(), out unused))
return;

var exportLog = ShaderBuildPreprocessor.hdrpAssets.Count > 0
&& (HDRenderPipelineGlobalSettings.instance.shaderVariantLogLevel != ShaderVariantLogLevel.Disabled);

Expand Down Expand Up @@ -561,23 +567,74 @@ public void OnProcessShader(Shader shader, ShaderSnippetData snippet, IList<Shad
class ShaderBuildPreprocessor : IPreprocessBuildWithReport
{
private static List<HDRenderPipelineAsset> _hdrpAssets;
private static Dictionary<int, ComputeShader> s_ComputeShaderCache;
private static bool s_PlayerNeedRaytracing;

public static List<HDRenderPipelineAsset> hdrpAssets
{
get
{
if (_hdrpAssets == null || _hdrpAssets.Count == 0) GetAllValidHDRPAssets();
if (_hdrpAssets == null || _hdrpAssets.Count == 0)
GetAllValidHDRPAssets();
return _hdrpAssets;
}
}


public static Dictionary<int, ComputeShader> computeShaderCache
{
get
{
if (s_ComputeShaderCache == null)
BuilRaytracingComputeList();
return s_ComputeShaderCache;
}
}

public static bool playerNeedRaytracing
{
get
{
return s_PlayerNeedRaytracing;
}
}

public static void BuilRaytracingComputeList()
{
if (s_ComputeShaderCache != null)
s_ComputeShaderCache.Clear();
else
s_ComputeShaderCache = new Dictionary<int, ComputeShader>();

if (HDRenderPipelineGlobalSettings.Ensure(canCreateNewAsset: false) == null)
return;

if (HDRenderPipelineGlobalSettings.instance.renderPipelineRayTracingResources == null)
return;

foreach (var fieldInfo in HDRenderPipelineGlobalSettings.instance.renderPipelineRayTracingResources.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static))
{
ComputeShader computeshader;
computeshader = fieldInfo.GetValue(HDRenderPipelineGlobalSettings.instance.renderPipelineRayTracingResources) as ComputeShader;

if (computeshader != null)
{
s_ComputeShaderCache.Add(computeshader.GetInstanceID(), computeshader);
}
}
}

static void GetAllValidHDRPAssets()
{
s_PlayerNeedRaytracing = false;

if (HDRenderPipeline.currentAsset == null)
return;

if (_hdrpAssets != null) _hdrpAssets.Clear();
else _hdrpAssets = new List<HDRenderPipelineAsset>();
if (_hdrpAssets != null)
_hdrpAssets.Clear();
else
_hdrpAssets = new List<HDRenderPipelineAsset>();

using (ListPool<HDRenderPipelineAsset>.Get(out var tmpAssets))
{
Expand Down Expand Up @@ -668,6 +725,15 @@ static void GetAllValidHDRPAssets()
Debug.LogWarning("There is no HDRP Asset provided in GraphicsSettings. Build time can be extremely long without it.");
}
}
else
{
// Take the opportunity to know if we need raytracing at runtime
foreach (var hdrpAsset in _hdrpAssets)
{
if (hdrpAsset.currentPlatformRenderPipelineSettings.supportRayTracing)
s_PlayerNeedRaytracing = true;
}
}

/*
Debug.Log(string.Format("{0} HDRP assets in build:{1}",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -439,21 +439,15 @@ void UpgradeResourcesIfNeeded()
m_GlobalSettings.EnsureEditorResources(forceReload: true);

bool requiresRayTracingResources = false;
if (GatherRayTracingSupport(asset.currentPlatformRenderPipelineSettings))
// Make sure to include ray-tracing resources if at least one of the quality levels needs it
int qualityLevelCount = QualitySettings.names.Length;
for (int i = 0; i < qualityLevelCount && !requiresRayTracingResources; ++i)
{
requiresRayTracingResources = true;
}
// Also make sure to include ray-tracing resources if at least one of the quality levels needs it
else if (rayTracingSupportedBySystem)
{
int qualityLevelCount = QualitySettings.names.Length;
for (int i = 0; i < qualityLevelCount && !requiresRayTracingResources; ++i)
{
var hdrpAsset = QualitySettings.GetRenderPipelineAssetAt(i) as HDRenderPipelineAsset;
if (hdrpAsset != null && hdrpAsset.currentPlatformRenderPipelineSettings.supportRayTracing)
requiresRayTracingResources = true;
}
var hdrpAsset = QualitySettings.GetRenderPipelineAssetAt(i) as HDRenderPipelineAsset;
if (hdrpAsset != null && hdrpAsset.currentPlatformRenderPipelineSettings.supportRayTracing)
requiresRayTracingResources = true;
}

// If ray tracing is not enabled we do not want to have ray tracing resources referenced
if (requiresRayTracingResources)
m_GlobalSettings.EnsureRayTracingResources(forceReload: true);
Expand Down