102 lines
2.9 KiB
C#

using ANX.Framework.Graphics;
using SharpDX;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dx = SharpDX.Direct3D11;
namespace ANX.RenderSystem.Windows.DX11
{
public abstract class Buffer : IDisposable
{
public Dx.Buffer NativeBuffer
{
get { return nativeBuffer; }
protected set
{
if (value != null)
SizeInBytes = value.Description.SizeInBytes;
else
SizeInBytes = 0;
nativeBuffer = value;
}
}
private Dx.Buffer nativeBuffer;
private Dx.Device device;
private BufferUsage usage;
private bool isDynamic;
public int SizeInBytes
{
get;
private set;
}
protected Buffer(Dx.Device device, BufferUsage usage, bool isDynamic)
{
this.device = device;
this.usage = usage;
this.isDynamic = isDynamic;
}
protected DataStream MapBuffer(Dx.Buffer buffer, ResourceMapping mapping)
{
if ((mapping & ResourceMapping.Read) != 0 && usage == BufferUsage.WriteOnly)
throw new NotSupportedException("Resource was created with WriteOnly, reading from it is not supported.");
Dx.MapMode mapMode;
if (isDynamic && mapping == ResourceMapping.Write)
mapMode = Dx.MapMode.WriteDiscard;
else
mapMode = mapping.ToMapMode();
DataStream dataStream;
device.ImmediateContext.MapSubresource(buffer, mapMode, Dx.MapFlags.None, out dataStream);
return dataStream;
}
protected void UnmapBuffer(Dx.Buffer buffer)
{
device.ImmediateContext.UnmapSubresource(buffer, 0);
}
protected void CopySubresource(Dx.Buffer source, Dx.Buffer destination)
{
BufferHelper.ValidateCopyResource(source, destination);
this.NativeBuffer.Device.ImmediateContext.CopyResource(source, destination);
}
protected bool WriteNeedsStaging
{
get { return !this.isDynamic; }
}
protected Dx.Buffer CreateStagingBuffer(ResourceMapping mapping)
{
var description = new Dx.BufferDescription()
{
Usage = Dx.ResourceUsage.Staging,
SizeInBytes = NativeBuffer.Description.SizeInBytes,
CpuAccessFlags = mapping.ToCpuAccessFlags(),
OptionFlags = Dx.ResourceOptionFlags.None
};
return new Dx.Buffer(device, description);
}
public void Dispose()
{
if (NativeBuffer != null)
{
NativeBuffer.Dispose();
NativeBuffer = null;
}
}
}
}