Files
Project-M/Packages/com.rukhanka.animation/Rukhanka.Runtime/DebugAndVisualization/ShaderDebugAndValidationSystem.cs
T
2026-05-31 14:27:52 -07:00

75 lines
2.4 KiB
C#

#if RUKHANKA_SHADER_DEBUG
using System;
using Unity.Entities;
using UnityEngine;
/////////////////////////////////////////////////////////////////////////////////
namespace Rukhanka
{
[WorldSystemFilter(WorldSystemFilterFlags.Default | WorldSystemFilterFlags.Editor)]
[UpdateInGroup(typeof(RukhankaDeformationSystemGroup), OrderLast = true)]
public partial class ShaderDebugAndValidationSystem: SystemBase
{
/////////////////////////////////////////////////////////////////////////////////
protected override void OnUpdate()
{
for (var i = 0; i < ShaderDebugAndValidationInitSystem.debugLoggerReadbackData.Length; ++i)
{
var errorsCount = ShaderDebugAndValidationInitSystem.debugLoggerReadbackData[i];
if (errorsCount == 0)
continue;
var dm = (RukhankaDebugMarkers)i;
Debug.LogException(new Exception($"Shader Validation: '{dm.ToString()}' marker error count '{errorsCount}'"));
}
}
}
//-------------------------------------------------------------------------------//
[WorldSystemFilter(WorldSystemFilterFlags.Default | WorldSystemFilterFlags.Editor)]
[UpdateInGroup(typeof(InitializationSystemGroup), OrderFirst = true)]
internal partial class ShaderDebugAndValidationInitSystem: SystemBase
{
public static GraphicsBuffer debugLoggerCB;
public static int[] debugLoggerReadbackData;
public static int[] debugLoggerZeroData;
static readonly int ShaderID_debugLoggerCB = Shader.PropertyToID("debugLoggerCB");
/////////////////////////////////////////////////////////////////////////////////
protected override void OnCreate()
{
var totalMarkers = (int)RukhankaDebugMarkers.Total;
debugLoggerReadbackData = new int[totalMarkers];
debugLoggerZeroData = new int[totalMarkers];
debugLoggerCB = new GraphicsBuffer(GraphicsBuffer.Target.Structured, GraphicsBuffer.UsageFlags.None, totalMarkers, sizeof(int));
debugLoggerCB.SetData(debugLoggerZeroData);
Shader.SetGlobalBuffer(ShaderID_debugLoggerCB, debugLoggerCB);
}
/////////////////////////////////////////////////////////////////////////////////
protected override void OnUpdate()
{
Shader.SetGlobalBuffer(ShaderID_debugLoggerCB, debugLoggerCB);
debugLoggerCB.GetData(debugLoggerReadbackData);
debugLoggerCB.SetData(debugLoggerZeroData);
}
/////////////////////////////////////////////////////////////////////////////////
protected override void OnDestroy()
{
if (debugLoggerCB != null)
debugLoggerCB.Dispose();
}
}
}
#endif