public D3D11Buffer(Device device, uint sizeInBytes, BufferUsage usage, uint structureByteStride) { SizeInBytes = sizeInBytes; Usage = usage; SharpDX.Direct3D11.BufferDescription bd = new SharpDX.Direct3D11.BufferDescription( (int)sizeInBytes, D3D11Formats.VdToD3D11BindFlags(usage), ResourceUsage.Default); if ((usage & BufferUsage.StructuredBufferReadOnly) == BufferUsage.StructuredBufferReadOnly || (usage & BufferUsage.StructuredBufferReadWrite) == BufferUsage.StructuredBufferReadWrite) { bd.OptionFlags = ResourceOptionFlags.BufferStructured; bd.StructureByteStride = (int)structureByteStride; } if ((usage & BufferUsage.IndirectBuffer) == BufferUsage.IndirectBuffer) { bd.OptionFlags = ResourceOptionFlags.DrawIndirectArguments; } if ((usage & BufferUsage.Dynamic) == BufferUsage.Dynamic) { bd.Usage = ResourceUsage.Dynamic; bd.CpuAccessFlags = CpuAccessFlags.Write; } else if ((usage & BufferUsage.Staging) == BufferUsage.Staging) { bd.Usage = ResourceUsage.Staging; bd.CpuAccessFlags = CpuAccessFlags.Read | CpuAccessFlags.Write; } _buffer = new SharpDX.Direct3D11.Buffer(device, bd); if ((usage & BufferUsage.StructuredBufferReadWrite) == BufferUsage.StructuredBufferReadWrite || (usage & BufferUsage.StructuredBufferReadOnly) == BufferUsage.StructuredBufferReadOnly) { ShaderResourceViewDescription srvDesc = new ShaderResourceViewDescription { Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.Buffer }; srvDesc.Buffer.ElementCount = (int)(SizeInBytes / structureByteStride); ShaderResourceView = new ShaderResourceView(device, _buffer, srvDesc); } if ((usage & BufferUsage.StructuredBufferReadWrite) == BufferUsage.StructuredBufferReadWrite) { UnorderedAccessViewDescription uavDesc = new UnorderedAccessViewDescription { Dimension = UnorderedAccessViewDimension.Buffer }; uavDesc.Buffer.ElementCount = (int)(SizeInBytes / structureByteStride); uavDesc.Format = SharpDX.DXGI.Format.Unknown; UnorderedAccessView = new UnorderedAccessView(device, _buffer, uavDesc); } }
public D3D11Buffer(ID3D11Device device, uint sizeInBytes, BufferUsage usage, uint structureByteStride, bool rawBuffer) { _device = device; SizeInBytes = sizeInBytes; Usage = usage; _structureByteStride = structureByteStride; _rawBuffer = rawBuffer; Vortice.Direct3D11.BufferDescription bd = new Vortice.Direct3D11.BufferDescription( (int)sizeInBytes, D3D11Formats.VdToD3D11BindFlags(usage), ResourceUsage.Default); if ((usage & BufferUsage.StructuredBufferReadOnly) == BufferUsage.StructuredBufferReadOnly || (usage & BufferUsage.StructuredBufferReadWrite) == BufferUsage.StructuredBufferReadWrite) { if (rawBuffer) { bd.OptionFlags = ResourceOptionFlags.BufferAllowRawViews; } else { bd.OptionFlags = ResourceOptionFlags.BufferStructured; bd.StructureByteStride = (int)structureByteStride; } } if ((usage & BufferUsage.IndirectBuffer) == BufferUsage.IndirectBuffer) { bd.OptionFlags = ResourceOptionFlags.DrawIndirectArguments; } if ((usage & BufferUsage.Dynamic) == BufferUsage.Dynamic) { bd.Usage = ResourceUsage.Dynamic; bd.CpuAccessFlags = CpuAccessFlags.Write; } else if ((usage & BufferUsage.Staging) == BufferUsage.Staging) { bd.Usage = ResourceUsage.Staging; bd.CpuAccessFlags = CpuAccessFlags.Read | CpuAccessFlags.Write; } _buffer = device.CreateBuffer(bd); }