2012-09-15 13:43:31 +00:00
|
|
|
#region Using Statements
|
2011-11-28 16:06:52 +00:00
|
|
|
using System;
|
|
|
|
using ANX.Framework.Graphics;
|
|
|
|
using ANX.Framework.NonXNA.RenderSystem;
|
2012-09-15 13:43:31 +00:00
|
|
|
|
|
|
|
#endregion
|
2011-11-28 16:06:52 +00:00
|
|
|
|
2012-08-09 09:45:04 +00:00
|
|
|
// This file is part of the ANX.Framework created by the
|
|
|
|
// "ANX.Framework developer group" and released under the Ms-PL license.
|
|
|
|
// For details see: http://anxframework.codeplex.com/license
|
2011-11-28 16:06:52 +00:00
|
|
|
|
2012-09-15 13:43:31 +00:00
|
|
|
using Dx10 = SharpDX.Direct3D10;
|
2015-09-30 21:31:15 +02:00
|
|
|
using SharpDX.DXGI;
|
2012-09-15 13:43:31 +00:00
|
|
|
|
2012-08-09 09:45:04 +00:00
|
|
|
namespace ANX.RenderSystem.Windows.DX10
|
2011-11-28 16:06:52 +00:00
|
|
|
{
|
2012-09-15 13:43:31 +00:00
|
|
|
public class RenderTarget2D_DX10 : DxTexture2D, INativeRenderTarget2D, INativeTexture2D
|
2012-09-06 09:58:13 +00:00
|
|
|
{
|
2015-09-30 21:31:15 +02:00
|
|
|
#if DEBUG
|
|
|
|
static int depthStencilCount = 0;
|
|
|
|
static int renderTargetCount = 0;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
Dx10.Texture2D depthStencil;
|
|
|
|
|
|
|
|
public Dx10.RenderTargetView RenderTargetView
|
|
|
|
{
|
|
|
|
get;
|
|
|
|
protected set;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Dx10.DepthStencilView DepthStencilView
|
|
|
|
{
|
|
|
|
get;
|
|
|
|
protected set;
|
|
|
|
}
|
|
|
|
|
|
|
|
public RenderTarget2D_DX10(GraphicsDeviceDX graphics, Dx10.Texture2D texture, DepthFormat depthFormat)
|
|
|
|
: base(graphics, texture)
|
|
|
|
{
|
|
|
|
Dx10.Device device = graphics.NativeDevice;
|
|
|
|
|
|
|
|
NativeTexture = texture;
|
|
|
|
#if DEBUG
|
|
|
|
NativeTexture.DebugName = "RenderTarget_" + renderTargetCount++;
|
|
|
|
#endif
|
|
|
|
RenderTargetView = new Dx10.RenderTargetView(device, NativeTexture);
|
|
|
|
#if DEBUG
|
|
|
|
RenderTargetView.DebugName = NativeTexture.DebugName + "_RenderTargetView";
|
|
|
|
#endif
|
|
|
|
|
|
|
|
CreateDepthStencil(graphics, depthFormat, texture.Description.Width, texture.Description.Height);
|
|
|
|
}
|
|
|
|
|
2012-09-06 09:58:13 +00:00
|
|
|
#region Constructor
|
2015-09-30 21:31:15 +02:00
|
|
|
public RenderTarget2D_DX10(GraphicsDeviceDX graphics, int width, int height, bool mipMap, SurfaceFormat surfaceFormat,
|
2012-09-06 09:58:13 +00:00
|
|
|
DepthFormat preferredDepthFormat, int preferredMultiSampleCount, RenderTargetUsage usage)
|
2015-09-30 21:31:15 +02:00
|
|
|
: base(graphics)
|
2011-11-28 16:06:52 +00:00
|
|
|
{
|
|
|
|
if (mipMap)
|
|
|
|
throw new NotImplementedException("creating RenderTargets with mip map not yet implemented");
|
2012-09-07 09:48:45 +00:00
|
|
|
|
2012-09-06 09:58:13 +00:00
|
|
|
var description = new Dx10.Texture2DDescription()
|
2011-11-28 16:06:52 +00:00
|
|
|
{
|
|
|
|
Width = width,
|
|
|
|
Height = height,
|
|
|
|
MipLevels = 1,
|
|
|
|
ArraySize = 1,
|
2012-09-15 13:43:31 +00:00
|
|
|
Format = DxFormatConverter.Translate(surfaceFormat),
|
2011-11-28 16:06:52 +00:00
|
|
|
SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0),
|
2012-09-06 09:58:13 +00:00
|
|
|
Usage = Dx10.ResourceUsage.Default,
|
|
|
|
BindFlags = Dx10.BindFlags.ShaderResource | Dx10.BindFlags.RenderTarget,
|
|
|
|
CpuAccessFlags = Dx10.CpuAccessFlags.None,
|
|
|
|
OptionFlags = Dx10.ResourceOptionFlags.None,
|
2011-11-28 16:06:52 +00:00
|
|
|
};
|
|
|
|
|
2015-09-30 21:31:15 +02:00
|
|
|
Dx10.Device device = graphics.NativeDevice;
|
|
|
|
var texture = new Dx10.Texture2D(device, description);
|
|
|
|
#if DEBUG
|
|
|
|
texture.DebugName = "RenderTarget_" + renderTargetCount++;
|
|
|
|
#endif
|
|
|
|
this.Width = width;
|
|
|
|
this.Height = height;
|
|
|
|
|
|
|
|
NativeTexture = texture;
|
|
|
|
RenderTargetView = new Dx10.RenderTargetView(device, NativeTexture);
|
|
|
|
#if DEBUG
|
|
|
|
RenderTargetView.DebugName = NativeTexture.DebugName + "_RenderTargetView";
|
|
|
|
#endif
|
|
|
|
|
|
|
|
CreateDepthStencil(graphics, preferredDepthFormat, width, height);
|
2012-09-06 09:58:13 +00:00
|
|
|
}
|
|
|
|
#endregion
|
2015-09-30 21:31:15 +02:00
|
|
|
|
|
|
|
private void CreateDepthStencil(GraphicsDeviceDX graphics, DepthFormat depthFormat, int width, int height)
|
|
|
|
{
|
|
|
|
//TODO: As we can only ever have 1 active DepthStencil and it's currently not possible to access it from the outside,
|
|
|
|
//we could share the depth stencils as long as they have the correct size and format.
|
|
|
|
|
|
|
|
if (depthFormat == DepthFormat.None)
|
|
|
|
return;
|
|
|
|
|
|
|
|
var dxDepthFormat = DxFormatConverter.Translate(depthFormat);
|
|
|
|
var depthStencilViewDesc = new Dx10.DepthStencilViewDescription()
|
|
|
|
{
|
|
|
|
Format = dxDepthFormat,
|
|
|
|
};
|
|
|
|
|
|
|
|
var depthStencilTextureDesc = new Dx10.Texture2DDescription()
|
|
|
|
{
|
|
|
|
Width = width,
|
|
|
|
Height = height,
|
|
|
|
MipLevels = 1,
|
|
|
|
ArraySize = 1,
|
|
|
|
Format = dxDepthFormat,
|
|
|
|
SampleDescription = new SampleDescription(1, 0),
|
|
|
|
Usage = Dx10.ResourceUsage.Default,
|
|
|
|
BindFlags = Dx10.BindFlags.DepthStencil,
|
|
|
|
CpuAccessFlags = Dx10.CpuAccessFlags.None,
|
|
|
|
OptionFlags = Dx10.ResourceOptionFlags.None
|
|
|
|
};
|
|
|
|
this.depthStencil = new Dx10.Texture2D(graphics.NativeDevice, depthStencilTextureDesc);
|
|
|
|
this.DepthStencilView = new Dx10.DepthStencilView(graphics.NativeDevice, this.depthStencil);
|
|
|
|
#if DEBUG
|
|
|
|
this.depthStencil.DebugName = "DepthStencil_" + depthStencilCount++;
|
|
|
|
this.DepthStencilView.DebugName = this.depthStencil.DebugName + "_View";
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
protected override void Dispose(bool managed)
|
|
|
|
{
|
|
|
|
base.Dispose(managed);
|
|
|
|
|
|
|
|
if (RenderTargetView != null)
|
|
|
|
{
|
|
|
|
RenderTargetView.Dispose();
|
|
|
|
}
|
|
|
|
if (DepthStencilView != null)
|
|
|
|
{
|
|
|
|
DepthStencilView.Dispose();
|
|
|
|
}
|
|
|
|
}
|
2012-09-06 09:58:13 +00:00
|
|
|
}
|
2011-11-28 16:06:52 +00:00
|
|
|
}
|