using System;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace UnityEngine.Rendering.UnifiedRayTracing
{
[Scripting.APIUpdating.MovedFrom(
autoUpdateAPI: true,
sourceNamespace: "UnityEngine.Rendering.UnifiedRayTracing",
sourceAssembly: "Unity.Rendering.LightTransport.Runtime"
)]
[Serializable]
[SupportedOnRenderPipeline()]
[Categorization.CategoryInfo(Name = "R: Unified Ray Tracing", Order = 1000), HideInInspector]
internal class RayTracingRenderPipelineResources : IRenderPipelineResources
{
[SerializeField, HideInInspector] int m_Version = 1;
public int version
{
get => m_Version;
}
[SerializeField, ResourcePath("Runtime/UnifiedRayTracing/Common/GeometryPool/GeometryPoolKernels.compute")]
ComputeShader m_GeometryPoolKernels;
[SerializeField, ResourcePath("Runtime/UnifiedRayTracing/Common/Utilities/CopyBuffer.compute")]
ComputeShader m_CopyBuffer;
[SerializeField, ResourcePath("Runtime/UnifiedRayTracing/Compute/RadeonRays/kernels/copyPositions.compute")]
ComputeShader m_CopyPositions;
[SerializeField, ResourcePath("Runtime/UnifiedRayTracing/Compute/RadeonRays/kernels/bit_histogram.compute")]
ComputeShader m_BitHistogram;
[SerializeField, ResourcePath("Runtime/UnifiedRayTracing/Compute/RadeonRays/kernels/block_reduce_part.compute")]
ComputeShader m_BlockReducePart;
[SerializeField, ResourcePath("Runtime/UnifiedRayTracing/Compute/RadeonRays/kernels/block_scan.compute")]
ComputeShader m_BlockScan;
[SerializeField, ResourcePath("Runtime/UnifiedRayTracing/Compute/RadeonRays/kernels/build_hlbvh.compute")]
ComputeShader m_BuildHlbvh;
[SerializeField, ResourcePath("Runtime/UnifiedRayTracing/Compute/RadeonRays/kernels/restructure_bvh.compute")]
ComputeShader m_RestructureBvh;
[SerializeField, ResourcePath("Runtime/UnifiedRayTracing/Compute/RadeonRays/kernels/scatter.compute")]
ComputeShader m_Scatter;
public ComputeShader GeometryPoolKernels
{
get => m_GeometryPoolKernels;
set => this.SetValueAndNotify(ref m_GeometryPoolKernels, value, nameof(m_GeometryPoolKernels));
}
public ComputeShader CopyBuffer
{
get => m_CopyBuffer;
set => this.SetValueAndNotify(ref m_CopyBuffer, value, nameof(m_CopyBuffer));
}
public ComputeShader CopyPositions
{
get => m_CopyPositions;
set => this.SetValueAndNotify(ref m_CopyPositions, value, nameof(m_CopyPositions));
}
public ComputeShader BitHistogram
{
get => m_BitHistogram;
set => this.SetValueAndNotify(ref m_BitHistogram, value, nameof(m_BitHistogram));
}
public ComputeShader BlockReducePart
{
get => m_BlockReducePart;
set => this.SetValueAndNotify(ref m_BlockReducePart, value, nameof(m_BlockReducePart));
}
public ComputeShader BlockScan
{
get => m_BlockScan;
set => this.SetValueAndNotify(ref m_BlockScan, value, nameof(m_BlockScan));
}
public ComputeShader BuildHlbvh
{
get => m_BuildHlbvh;
set => this.SetValueAndNotify(ref m_BuildHlbvh, value, nameof(m_BuildHlbvh));
}
public ComputeShader RestructureBvh
{
get => m_RestructureBvh;
set => this.SetValueAndNotify(ref m_RestructureBvh, value, nameof(m_RestructureBvh));
}
public ComputeShader Scatter
{
get => m_Scatter;
set => this.SetValueAndNotify(ref m_Scatter, value, nameof(m_Scatter));
}
}
///
/// Utility shaders needed by a to operate.
///
public class RayTracingResources
{
internal ComputeShader geometryPoolKernels { get; set; }
internal ComputeShader copyBuffer { get; set; }
internal ComputeShader copyPositions { get; set; }
internal ComputeShader bitHistogram { get; set; }
internal ComputeShader blockReducePart { get; set; }
internal ComputeShader blockScan { get; set; }
internal ComputeShader buildHlbvh { get; set; }
internal ComputeShader restructureBvh { get; set; }
internal ComputeShader scatter { get; set; }
#if UNITY_EDITOR
///
/// Intializes the RayTracingResources.
///
///
/// This API works only in the Unity Editor, not at runtime.
///
public void Load()
{
const string path = "Packages/com.unity.render-pipelines.core/Runtime/";
geometryPoolKernels = AssetDatabase.LoadAssetAtPath(path + "UnifiedRayTracing/Common/GeometryPool/GeometryPoolKernels.compute");
copyBuffer = AssetDatabase.LoadAssetAtPath(path + "UnifiedRayTracing/Common/Utilities/CopyBuffer.compute");
copyPositions = AssetDatabase.LoadAssetAtPath(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/copyPositions.compute");
bitHistogram = AssetDatabase.LoadAssetAtPath(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/bit_histogram.compute");
blockReducePart = AssetDatabase.LoadAssetAtPath(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/block_reduce_part.compute");
blockScan = AssetDatabase.LoadAssetAtPath(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/block_scan.compute");
buildHlbvh = AssetDatabase.LoadAssetAtPath(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/build_hlbvh.compute");
restructureBvh = AssetDatabase.LoadAssetAtPath(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/restructure_bvh.compute");
scatter = AssetDatabase.LoadAssetAtPath(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/scatter.compute");
}
#endif
#if ENABLE_ASSET_BUNDLE
///
/// Intializes the RayTracingResources by loading its utility shaders from an AssetBundle.
///
///
/// The necessary shaders are configured to belong to the unifiedraytracing AssetBundle which can be built by calling
///
/// The AssetBundle to load the shaders from.
public void LoadFromAssetBundle(AssetBundle assetBundle)
{
const string path = "Packages/com.unity.render-pipelines.core/Runtime/";
geometryPoolKernels = assetBundle.LoadAsset(path + "UnifiedRayTracing/Common/GeometryPool/GeometryPoolKernels.compute");
copyBuffer = assetBundle.LoadAsset(path + "UnifiedRayTracing/Common/Utilities/CopyBuffer.compute");
copyPositions = assetBundle.LoadAsset(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/copyPositions.compute");
bitHistogram = assetBundle.LoadAsset(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/bit_histogram.compute");
blockReducePart = assetBundle.LoadAsset(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/block_reduce_part.compute");
blockScan = assetBundle.LoadAsset(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/block_scan.compute");
buildHlbvh = assetBundle.LoadAsset(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/build_hlbvh.compute");
restructureBvh = assetBundle.LoadAsset(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/restructure_bvh.compute");
scatter = assetBundle.LoadAsset(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/scatter.compute");
}
#endif
///
/// Intializes the RayTracingResources by loading its utility shaders via GraphicsSettings.
///
///
/// This method only works in projects that use Scriptable Render Pipeline.
///
/// Whether the resources were successfully loaded.
public bool LoadFromRenderPipelineResources()
{
if (!GraphicsSettings.TryGetRenderPipelineSettings(out var rpResources))
return false;
Debug.Assert(rpResources.GeometryPoolKernels != null);
Debug.Assert(rpResources.CopyBuffer != null);
Debug.Assert(rpResources.CopyPositions != null);
Debug.Assert(rpResources.BitHistogram != null);
Debug.Assert(rpResources.BlockReducePart != null);
Debug.Assert(rpResources.BlockScan != null);
Debug.Assert(rpResources.BuildHlbvh != null);
Debug.Assert(rpResources.RestructureBvh != null);
Debug.Assert(rpResources.Scatter != null);
geometryPoolKernels = rpResources.GeometryPoolKernels;
copyBuffer = rpResources.CopyBuffer;
copyPositions = rpResources.CopyPositions;
bitHistogram = rpResources.BitHistogram;
blockReducePart = rpResources.BlockReducePart;
blockScan = rpResources.BlockScan;
buildHlbvh = rpResources.BuildHlbvh;
restructureBvh = rpResources.RestructureBvh;
scatter = rpResources.Scatter;
return true;
}
}
}