Files
2026-07-13 13:13:17 +08:00

102 lines
3.5 KiB
C#

namespace Lib.render._dx11.buffer;
[Guid("80dff680-5abf-484a-b9e0-81d72f3b7aa4")]
internal sealed class GetBufferComponents : Instance<GetBufferComponents>
{
[Output(Guid = "1368ab8e-d75e-429f-8ecd-0944f3ede9ab")]
public readonly Slot<ShaderResourceView> ShaderResourceView = new();
[Output(Guid = "f03246a7-e39f-4a41-a0c3-22bc976a6000")]
public readonly Slot<UnorderedAccessView> UnorderedAccessView = new();
[Output(Guid = "a7d11905-eb9e-42a4-a077-11d2c1cb41b2")]
public readonly Slot<Buffer> Buffer = new();
[Output(Guid = "D7918FD8-906E-424D-8C5C-9631941CFC9D")]
public readonly Slot<int> Length = new();
[Output(Guid = "6D7A9493-6210-462A-B9C2-525B925DE6C8")]
public readonly Slot<int> Stride = new();
[Output(Guid = "5DCC43AC-4FB9-49C3-A093-0A59A002FB6C")]
public readonly Slot<bool> IsValid = new();
public GetBufferComponents()
{
Buffer.UpdateAction += Update;
ShaderResourceView.UpdateAction += Update;
UnorderedAccessView.UpdateAction += Update;
Length.UpdateAction += Update;
Stride.UpdateAction += Update;
IsValid.UpdateAction += Update;
}
private void Update(EvaluationContext context)
{
var logWarnings = LogWarnings.GetValue(context);
var bufferWithViews = BufferWithViews.GetValue(context);
if (bufferWithViews != null
&& bufferWithViews.Srv != null && !bufferWithViews.Srv.IsDisposed
&& bufferWithViews.Uav != null && !bufferWithViews.Uav.IsDisposed )
{
IsValid.Value = true;
Buffer.Value = bufferWithViews.Buffer;
ShaderResourceView.Value = bufferWithViews.Srv;
UnorderedAccessView.Value = bufferWithViews.Uav;
if (ShaderResourceView?.Value == null)
{
if(logWarnings)
Log.Warning("Can't access undefined shader resource view", this);
SetAsInvalid();
}
else
{
try
{
Length.Value = ShaderResourceView.Value.Description.Buffer.ElementCount;
Stride.Value = bufferWithViews.Buffer.Description.StructureByteStride;
// Buffer.DirtyFlag.Clear();
// ShaderResourceView.DirtyFlag.Clear();
// UnorderedAccessView.DirtyFlag.Clear();
// Length.DirtyFlag.Clear();
// Stride.DirtyFlag.Clear();
}
catch (Exception e)
{
if(logWarnings)
Log.Warning("Can't access undefined SRV description: " + e.Message, this);
SetAsInvalid();
}
}
}
else
{
SetAsInvalid();
}
// Buffer.DirtyFlag.Clear();
// ShaderResourceView.DirtyFlag.Clear();
// UnorderedAccessView.DirtyFlag.Clear();
// Length.DirtyFlag.Clear();
// Stride.DirtyFlag.Clear();
}
private void SetAsInvalid()
{
IsValid.Value = false;
Buffer.Value = null;
ShaderResourceView.Value = null;
UnorderedAccessView.Value = null;
Length.Value = 0;
}
[Input(Guid = "7a13b834-21e5-4cef-ad5b-23c3770ea763")]
public readonly InputSlot<BufferWithViews> BufferWithViews = new();
[Input(Guid = "AC0F9D07-B93D-45D3-8B3F-A4B2F7240AE0")]
public readonly InputSlot<bool> LogWarnings = new();
}