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

51 lines
2.1 KiB
C#

using SharpDX.Direct3D;
using SharpDX.Direct3D11;
namespace Lib.render._dx11.api;
[Guid("8c41b312-6628-411c-a61d-604413b73a72")]
internal sealed class SrvFromStructuredBuffer : Instance<SrvFromStructuredBuffer>
{
[Output(Guid = "2A1FCDF6-9416-45B2-96CA-A9D6D2692278")]
public readonly Slot<ShaderResourceView> ShaderResourceView = new();
[Output(Guid = "E96EED5C-AE63-49B7-8ADD-2A818E4A2B89")]
public readonly Slot<int> ElementCount = new();
public SrvFromStructuredBuffer()
{
ShaderResourceView.UpdateAction += Update;
ElementCount.UpdateAction += Update;
}
private void Update(EvaluationContext context)
{
var buffer = Buffer.GetValue(context);
if (buffer != null)
{
if ((buffer.Description.OptionFlags & ResourceOptionFlags.BufferStructured) == 0)
{
Log.Warning($"{nameof(SrvFromStructuredBuffer)} - input buffer is not structured, skipping SRV creation.", this);
return;
}
ShaderResourceView.Value?.Dispose();
var elementCount = buffer.Description.SizeInBytes / buffer.Description.StructureByteStride;
var desc = new ShaderResourceViewDescription()
{
Dimension = ShaderResourceViewDimension.ExtendedBuffer,
Format = Format.Unknown,
BufferEx = new ShaderResourceViewDescription.ExtendedBufferResource()
{
FirstElement = 0,
ElementCount = elementCount
}
};
ShaderResourceView.Value = new ShaderResourceView(ResourceManager.Device, buffer, desc); // todo: create via resource manager
ElementCount.Value = elementCount;
}
}
[Input(Guid = "BD65EF2C-F32A-4279-BB5C-7F6467B23283")]
public readonly InputSlot<Buffer> Buffer = new();
}