80 lines
2.2 KiB
C#
80 lines
2.2 KiB
C#
|
using ANX.Framework.Graphics;
|
|||
|
using SharpDX;
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using Dx = SharpDX.Direct3D10;
|
|||
|
|
|||
|
namespace ANX.RenderSystem.Windows.DX10
|
|||
|
{
|
|||
|
public abstract class Buffer : IDisposable
|
|||
|
{
|
|||
|
public Dx.Buffer NativeBuffer { get; protected set; }
|
|||
|
private Dx.Device device;
|
|||
|
private BufferUsage usage;
|
|||
|
private bool isDynamic;
|
|||
|
|
|||
|
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)
|
|||
|
{
|
|||
|
CheckUsage(mapping);
|
|||
|
|
|||
|
return buffer.Map(mapping.ToMapMode());
|
|||
|
}
|
|||
|
|
|||
|
protected void UnmapBuffer(Dx.Buffer buffer)
|
|||
|
{
|
|||
|
buffer.Unmap();
|
|||
|
}
|
|||
|
|
|||
|
protected void CopySubresource(Dx.Buffer source, Dx.Buffer destination)
|
|||
|
{
|
|||
|
BufferHelper.ValidateCopyResource(source, destination);
|
|||
|
|
|||
|
this.device.CopyResource(source, destination);
|
|||
|
}
|
|||
|
|
|||
|
protected bool WriteNeedsStaging
|
|||
|
{
|
|||
|
get { return !isDynamic; }
|
|||
|
}
|
|||
|
|
|||
|
private void CheckUsage(ResourceMapping mapping)
|
|||
|
{
|
|||
|
if ((mapping & ResourceMapping.Write) != 0 && usage == BufferUsage.None)
|
|||
|
throw new NotSupportedException("Resource was created with WriteOnly, reading from it is not supported.");
|
|||
|
}
|
|||
|
|
|||
|
protected Dx.Buffer CreateStagingBuffer(ResourceMapping mapping)
|
|||
|
{
|
|||
|
CheckUsage(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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|