/// <summary> /// /// </summary> /// <param name="structureStride"></param> /// <param name="structureCount"></param> void Create(GraphicsDevice device, int structureStride, int structureCount, StructuredBufferFlags flags) { StructureCapacity = structureCount; StructureStride = structureStride; Width = structureCount; Height = 0; Depth = 0; // create staging buffer : var bufferDesc = new BufferDescription { BindFlags = BindFlags.None, Usage = ResourceUsage.Staging, CpuAccessFlags = CpuAccessFlags.Write | CpuAccessFlags.Read, OptionFlags = ResourceOptionFlags.BufferStructured, SizeInBytes = structureCount * structureStride, StructureByteStride = structureStride }; bufferStaging = new Buffer(device.Device, bufferDesc); // create count buffer : bufferDesc = new BufferDescription { BindFlags = BindFlags.None, Usage = ResourceUsage.Staging, CpuAccessFlags = CpuAccessFlags.Write | CpuAccessFlags.Read, OptionFlags = ResourceOptionFlags.None, SizeInBytes = 4, }; bufferCount = new Buffer(device.Device, bufferDesc); // create GPU buffer : bufferDesc = new BufferDescription { BindFlags = BindFlags.UnorderedAccess | BindFlags.ShaderResource, Usage = ResourceUsage.Default, CpuAccessFlags = CpuAccessFlags.None, OptionFlags = ResourceOptionFlags.BufferStructured, SizeInBytes = structureCount * structureStride, StructureByteStride = structureStride }; bufferGpu = new Buffer(device.Device, bufferDesc); var uavFlag = UnorderedAccessViewBufferFlags.None; if (flags == StructuredBufferFlags.None) { uavFlag = UnorderedAccessViewBufferFlags.None; } if (flags == StructuredBufferFlags.Append) { uavFlag = UnorderedAccessViewBufferFlags.Append; } if (flags == StructuredBufferFlags.Counter) { uavFlag = UnorderedAccessViewBufferFlags.Counter; } // create UAV : var uavDesc = new UnorderedAccessViewDescription { Format = DXGI.Format.Unknown, Dimension = UnorderedAccessViewDimension.Buffer, Buffer = new UnorderedAccessViewDescription.BufferResource { ElementCount = structureCount, FirstElement = 0, Flags = uavFlag } }; uav = new UnorderedAccessView(device.Device, BufferGPU, uavDesc); // create SRV : var srvDesc = new ShaderResourceViewDescription { Format = DXGI.Format.Unknown, Buffer = { ElementCount = structureCount, FirstElement = 0 }, Dimension = ShaderResourceViewDimension.Buffer }; SRV = new ShaderResourceView(device.Device, BufferGPU, srvDesc); }
/// <summary> /// /// </summary> /// <param name="rs"></param> /// <param name="elementCount"></param> /// <param name="elementType"></param> public StructuredBuffer(GraphicsDevice device, int structureStride, int structureCount, StructuredBufferFlags flags) : base(device) { Create(device, structureStride, structureCount, flags); }
/// <summary> /// /// </summary> /// <param name="rs"></param> /// <param name="elementCount"></param> /// <param name="elementType"></param> public StructuredBuffer(GraphicsDevice device, Type structureType, int structureCount, StructuredBufferFlags flags) : base(device) { Create(device, Marshal.SizeOf(structureType), structureCount, flags); }
/// <summary> /// /// </summary> /// <param name="rs"></param> /// <param name="elementCount"></param> /// <param name="elementType"></param> public FormattedBuffer(GraphicsDevice device, VertexFormat format, int elementsCount, StructuredBufferFlags flags) : base(device) { Create(device, format, elementsCount, flags); }