- renamed folder XNAToANXConverter to ProjectConverter

- implemented MultiRenderTargets for DirectX 10 and DirectX 11 RenderSystems (feature #559)
- fixed a minor issue in MultiRenderTarget sample
This commit is contained in:
Glatzemann 2012-08-10 08:38:01 +00:00
parent c4fe773af6
commit 00fc2bf49e
12 changed files with 250 additions and 76 deletions

View File

@ -33,7 +33,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xinput", "Samples\Xinput\Xi
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsGame", "Samples\WindowsGame\WindowsGame.csproj", "{A08575E0-7B21-4822-9D4C-6B9EEB7EFFF7}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsGame", "Samples\WindowsGame\WindowsGame.csproj", "{A08575E0-7B21-4822-9D4C-6B9EEB7EFFF7}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectConverter", "Tools\XNAToANXConverter\ProjectConverter.csproj", "{B5209A04-B2F8-4033-A5E7-545BE771214C}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectConverter", "Tools\ProjectConverter\ProjectConverter.csproj", "{B5209A04-B2F8-4033-A5E7-545BE771214C}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kinect", "Samples\Kinect\Kinect.csproj", "{A42413A9-5189-40CB-AACA-D50F24865431}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kinect", "Samples\Kinect\Kinect.csproj", "{A42413A9-5189-40CB-AACA-D50F24865431}"
EndProject EndProject

View File

@ -33,7 +33,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xinput", "Samples\Xinput\Xi
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsGame", "Samples\WindowsGame\WindowsGame_Linux.csproj", "{A08575E0-7B21-4822-9D4C-6B9EEB7EFFF7}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsGame", "Samples\WindowsGame\WindowsGame_Linux.csproj", "{A08575E0-7B21-4822-9D4C-6B9EEB7EFFF7}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectConverter", "Tools\XNAToANXConverter\ProjectConverter_Linux.csproj", "{B5209A04-B2F8-4033-A5E7-545BE771214C}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectConverter", "Tools\ProjectConverter\ProjectConverter_Linux.csproj", "{B5209A04-B2F8-4033-A5E7-545BE771214C}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kinect", "Samples\Kinect\Kinect_Linux.csproj", "{A42413A9-5189-40CB-AACA-D50F24865431}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kinect", "Samples\Kinect\Kinect_Linux.csproj", "{A42413A9-5189-40CB-AACA-D50F24865431}"
EndProject EndProject

View File

@ -33,7 +33,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xinput", "Samples\Xinput\Xi
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsGame", "Samples\WindowsGame\WindowsGame_PSVita.csproj", "{A08575E0-7B21-4822-9D4C-6B9EEB7EFFF7}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsGame", "Samples\WindowsGame\WindowsGame_PSVita.csproj", "{A08575E0-7B21-4822-9D4C-6B9EEB7EFFF7}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectConverter", "Tools\XNAToANXConverter\ProjectConverter_PSVita.csproj", "{B5209A04-B2F8-4033-A5E7-545BE771214C}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectConverter", "Tools\ProjectConverter\ProjectConverter_PSVita.csproj", "{B5209A04-B2F8-4033-A5E7-545BE771214C}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kinect", "Samples\Kinect\Kinect_PSVita.csproj", "{A42413A9-5189-40CB-AACA-D50F24865431}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kinect", "Samples\Kinect\Kinect_PSVita.csproj", "{A42413A9-5189-40CB-AACA-D50F24865431}"
EndProject EndProject

View File

@ -33,7 +33,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xinput", "Samples\Xinput\Xi
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsGame", "Samples\WindowsGame\WindowsGame_WindowsMetro.csproj", "{A08575E0-7B21-4822-9D4C-6B9EEB7EFFF7}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsGame", "Samples\WindowsGame\WindowsGame_WindowsMetro.csproj", "{A08575E0-7B21-4822-9D4C-6B9EEB7EFFF7}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectConverter", "Tools\XNAToANXConverter\ProjectConverter_WindowsMetro.csproj", "{B5209A04-B2F8-4033-A5E7-545BE771214C}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectConverter", "Tools\ProjectConverter\ProjectConverter_WindowsMetro.csproj", "{B5209A04-B2F8-4033-A5E7-545BE771214C}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kinect", "Samples\Kinect\Kinect_WindowsMetro.csproj", "{A42413A9-5189-40CB-AACA-D50F24865431}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kinect", "Samples\Kinect\Kinect_WindowsMetro.csproj", "{A42413A9-5189-40CB-AACA-D50F24865431}"
EndProject EndProject

View File

@ -56,16 +56,16 @@ namespace ANX.RenderSystem.Windows.DX10
nativeEffectVariable.AsScalar().Set(value); nativeEffectVariable.AsScalar().Set(value);
} }
public void SetValue(Matrix value, bool transpose) public void SetValue(Matrix value, bool transpose)
{ {
// TODO: handle transpose! // TODO: handle transpose!
SharpDX.Matrix m = new SharpDX.Matrix(value.M11, value.M12, value.M13, value.M14, value.M21, value.M22, value.M23, value.M24, value.M31, value.M32, value.M33, value.M34, value.M41, value.M42, value.M43, value.M44); SharpDX.Matrix m = new SharpDX.Matrix(value.M11, value.M12, value.M13, value.M14, value.M21, value.M22, value.M23, value.M24, value.M31, value.M32, value.M33, value.M34, value.M41, value.M42, value.M43, value.M44);
nativeEffectVariable.AsMatrix().SetMatrix(m); nativeEffectVariable.AsMatrix().SetMatrix(m);
} }
public void SetValue(Matrix[] value, bool transpose) public void SetValue(Matrix[] value, bool transpose)
{ {
// TODO: handle transpose! // TODO: handle transpose!
int count = value.Length; int count = value.Length;
SharpDX.Matrix[] m = new SharpDX.Matrix[count]; SharpDX.Matrix[] m = new SharpDX.Matrix[count];
Matrix anxMatrix; Matrix anxMatrix;

View File

@ -7,9 +7,11 @@ using SharpDX;
using SharpDX.DXGI; using SharpDX.DXGI;
using SharpDX.Direct3D; using SharpDX.Direct3D;
using SharpDX.D3DCompiler; using SharpDX.D3DCompiler;
using ANX.Framework.NonXNA;
using SharpDX.Direct3D10; using SharpDX.Direct3D10;
using ANX.Framework;
using ANX.Framework.NonXNA;
using ANX.Framework.Graphics; using ANX.Framework.Graphics;
using System.Runtime.InteropServices;
#endregion // Using Statements #endregion // Using Statements
@ -19,8 +21,6 @@ using ANX.Framework.Graphics;
using Device = SharpDX.Direct3D10.Device; using Device = SharpDX.Direct3D10.Device;
using Buffer = SharpDX.Direct3D10.Buffer; using Buffer = SharpDX.Direct3D10.Buffer;
using System.Runtime.InteropServices;
using ANX.Framework;
using Rectangle = ANX.Framework.Rectangle; using Rectangle = ANX.Framework.Rectangle;
using Vector4 = ANX.Framework.Vector4; using Vector4 = ANX.Framework.Vector4;
using VertexBufferBinding = ANX.Framework.Graphics.VertexBufferBinding; using VertexBufferBinding = ANX.Framework.Graphics.VertexBufferBinding;
@ -61,7 +61,7 @@ namespace ANX.RenderSystem.Windows.DX10
private Device device; private Device device;
private SwapChain swapChain; private SwapChain swapChain;
private RenderTargetView renderView; private RenderTargetView renderView;
private RenderTargetView renderTargetView; private RenderTargetView[] renderTargetView = new RenderTargetView[1];
private DepthStencilView depthStencilView; private DepthStencilView depthStencilView;
private SharpDX.Direct3D10.Texture2D depthStencilBuffer; private SharpDX.Direct3D10.Texture2D depthStencilBuffer;
private SharpDX.Direct3D10.Texture2D backBuffer; private SharpDX.Direct3D10.Texture2D backBuffer;
@ -188,7 +188,22 @@ namespace ANX.RenderSystem.Windows.DX10
clearColor.Alpha = color.A * ColorMultiplier; clearColor.Alpha = color.A * ColorMultiplier;
} }
this.device.ClearRenderTargetView(this.renderTargetView != null ? this.renderTargetView : this.renderView, this.clearColor); if (this.renderTargetView[0] == null)
{
this.device.ClearRenderTargetView(this.renderView, this.clearColor);
}
else
{
for (int i = 0; i < this.renderTargetView.Length; i++)
{
if (this.renderTargetView[i] == null)
{
break;
}
this.device.ClearRenderTargetView(this.renderTargetView[i], this.clearColor);
}
}
} }
public void Clear(ClearOptions options, Vector4 color, float depth, int stencil) public void Clear(ClearOptions options, Vector4 color, float depth, int stencil)
@ -203,7 +218,22 @@ namespace ANX.RenderSystem.Windows.DX10
this.clearColor.Alpha = color.W; this.clearColor.Alpha = color.W;
this.lastClearColor = 0; this.lastClearColor = 0;
this.device.ClearRenderTargetView(this.renderTargetView != null ? this.renderTargetView : this.renderView, this.clearColor); if (this.renderTargetView[0] == null)
{
this.device.ClearRenderTargetView(this.renderView, this.clearColor);
}
else
{
for (int i = 0; i < this.renderTargetView.Length; i++)
{
if (this.renderTargetView[i] == null)
{
break;
}
this.device.ClearRenderTargetView(this.renderTargetView[i], this.clearColor);
}
}
} }
if (this.depthStencilView != null) if (this.depthStencilView != null)
@ -323,7 +353,23 @@ namespace ANX.RenderSystem.Windows.DX10
device.InputAssembler.SetVertexBuffers(0, nativeVertexBufferBindings); device.InputAssembler.SetVertexBuffers(0, nativeVertexBufferBindings);
DrawPrimitives(primitiveType, vertexOffset, primitiveCount); SharpDX.Direct3D10.EffectPass pass; SharpDX.Direct3D10.EffectTechnique technique; ShaderBytecode passSignature;
SetupEffectForDraw(out pass, out technique, out passSignature);
var layout = CreateInputLayout(device, passSignature, vertexDeclaration);
device.InputAssembler.InputLayout = layout;
// Prepare All the stages
device.InputAssembler.PrimitiveTopology = FormatConverter.Translate(primitiveType);
device.Rasterizer.SetViewports(currentViewport);
//device.OutputMerger.SetTargets(this.depthStencilView, this.renderView);
for (int i = 0; i < technique.Description.PassCount; ++i)
{
pass.Apply();
device.Draw(primitiveCount, vertexOffset);
}
} }
#endregion // DrawUserPrimitives<T> #endregion // DrawUserPrimitives<T>
@ -352,7 +398,12 @@ namespace ANX.RenderSystem.Windows.DX10
private void SetupInputLayout(ShaderBytecode passSignature) private void SetupInputLayout(ShaderBytecode passSignature)
{ {
// get the VertexDeclaration from current VertexBuffer to create input layout for the input assembler // get the VertexDeclaration from current VertexBuffer to create input layout for the input assembler
//TODO: check for null and throw exception
if (currentVertexBuffer == null)
{
throw new ArgumentNullException("passSignature");
}
VertexDeclaration vertexDeclaration = currentVertexBuffer.VertexDeclaration; VertexDeclaration vertexDeclaration = currentVertexBuffer.VertexDeclaration;
var layout = CreateInputLayout(device, passSignature, vertexDeclaration); var layout = CreateInputLayout(device, passSignature, vertexDeclaration);
@ -487,10 +538,13 @@ namespace ANX.RenderSystem.Windows.DX10
if (renderTargets == null) if (renderTargets == null)
{ {
// reset the RenderTarget to backbuffer // reset the RenderTarget to backbuffer
if (renderTargetView != null) for (int i = 0; i < renderTargetView.Length; i++)
{ {
renderTargetView.Dispose(); if (renderTargetView[i] != null)
renderTargetView = null; {
renderTargetView[i].Dispose();
renderTargetView[i] = null;
}
} }
device.OutputMerger.SetRenderTargets(1, new RenderTargetView[] { this.renderView }, this.depthStencilView); device.OutputMerger.SetRenderTargets(1, new RenderTargetView[] { this.renderView }, this.depthStencilView);
@ -498,26 +552,60 @@ namespace ANX.RenderSystem.Windows.DX10
} }
else else
{ {
if (renderTargets.Length == 1) int renderTargetCount = renderTargets.Length;
if (this.renderTargetView.Length != renderTargetCount)
{ {
RenderTarget2D renderTarget = renderTargets[0].RenderTarget as RenderTarget2D; for (int i = 0; i < renderTargetView.Length; i++)
RenderTarget2D_DX10 nativeRenderTarget = renderTarget.NativeRenderTarget as RenderTarget2D_DX10; {
if (renderTargetView[i] != null)
{
renderTargetView[i].Dispose();
renderTargetView[i] = null;
}
}
this.renderTargetView = new RenderTargetView[renderTargetCount];
}
for (int i = 0; i < renderTargetCount; i++)
{
RenderTarget2D renderTarget = renderTargets[i].RenderTarget as RenderTarget2D;
if (renderTarget != null) if (renderTarget != null)
{ {
if (renderTargetView != null) RenderTarget2D_DX10 nativeRenderTarget = renderTarget.NativeRenderTarget as RenderTarget2D_DX10;
if (renderTargetView[i] != null)
{ {
renderTargetView.Dispose(); renderTargetView[i].Dispose();
renderTargetView = null;
} }
this.renderTargetView = new RenderTargetView(device, ((Texture2D_DX10)nativeRenderTarget).NativeShaderResourceView.Resource);
DepthStencilView depthStencilView = null; renderTargetView[i] = new RenderTargetView(device, ((Texture2D_DX10)nativeRenderTarget).NativeShaderResourceView.Resource);
device.OutputMerger.SetRenderTargets(1,new RenderTargetView[] { this.renderTargetView }, depthStencilView);
} }
} }
else
{ device.OutputMerger.SetRenderTargets(renderTargetCount, renderTargetView, this.depthStencilView);
throw new NotImplementedException("handling of multiple RenderTargets are not yet implemented"); device.OutputMerger.SetTargets(this.depthStencilView, this.renderTargetView);
}
//if (renderTargets.Length == 1)
//{
// RenderTarget2D renderTarget = renderTargets[0].RenderTarget as RenderTarget2D;
// RenderTarget2D_DX10 nativeRenderTarget = renderTarget.NativeRenderTarget as RenderTarget2D_DX10;
// if (renderTarget != null)
// {
// if (renderTargetView != null)
// {
// renderTargetView.Dispose();
// renderTargetView = null;
// }
// this.renderTargetView = new RenderTargetView(device, ((Texture2D_DX10)nativeRenderTarget).NativeShaderResourceView.Resource);
// DepthStencilView depthStencilView = null;
// device.OutputMerger.SetRenderTargets(1, new RenderTargetView[] { this.renderTargetView }, depthStencilView);
// }
//}
//else
//{
// throw new NotImplementedException("handling of multiple RenderTargets are not yet implemented");
//}
} }
} }
@ -593,10 +681,13 @@ namespace ANX.RenderSystem.Windows.DX10
public void Dispose() public void Dispose()
{ {
if (renderTargetView != null) for (int i = 0; i < renderTargetView.Length; i++)
{ {
renderTargetView.Dispose(); if (renderTargetView[i] != null)
renderTargetView = null; {
renderTargetView[i].Dispose();
renderTargetView[i] = null;
}
} }
if (swapChain != null) if (swapChain != null)

View File

@ -15,6 +15,9 @@ using ANX.Framework;
// "ANX.Framework developer group" and released under the Ms-PL license. // "ANX.Framework developer group" and released under the Ms-PL license.
// For details see: http://anxframework.codeplex.com/license // For details see: http://anxframework.codeplex.com/license
using Texture2D = ANX.Framework.Graphics.Texture2D;
using Texture3D = ANX.Framework.Graphics.Texture3D;
namespace ANX.RenderSystem.Windows.DX11 namespace ANX.RenderSystem.Windows.DX11
{ {
public class EffectParameter_DX11 : INativeEffectParameter public class EffectParameter_DX11 : INativeEffectParameter
@ -53,14 +56,16 @@ namespace ANX.RenderSystem.Windows.DX11
nativeEffectVariable.AsScalar().Set(value); nativeEffectVariable.AsScalar().Set(value);
} }
public void SetValue(Matrix value, bool transpose) public void SetValue(Matrix value, bool transpose)
{ {
// TODO: handle transpose!
SharpDX.Matrix m = new SharpDX.Matrix(value.M11, value.M12, value.M13, value.M14, value.M21, value.M22, value.M23, value.M24, value.M31, value.M32, value.M33, value.M34, value.M41, value.M42, value.M43, value.M44); SharpDX.Matrix m = new SharpDX.Matrix(value.M11, value.M12, value.M13, value.M14, value.M21, value.M22, value.M23, value.M24, value.M31, value.M32, value.M33, value.M34, value.M41, value.M42, value.M43, value.M44);
nativeEffectVariable.AsMatrix().SetMatrix(m); nativeEffectVariable.AsMatrix().SetMatrix(m);
} }
public void SetValue(Matrix[] value, bool transpose) public void SetValue(Matrix[] value, bool transpose)
{ {
// TODO: handle transpose!
int count = value.Length; int count = value.Length;
SharpDX.Matrix[] m = new SharpDX.Matrix[count]; SharpDX.Matrix[] m = new SharpDX.Matrix[count];
Matrix anxMatrix; Matrix anxMatrix;

View File

@ -15,6 +15,8 @@ using ANX.Framework.Graphics;
// "ANX.Framework developer group" and released under the Ms-PL license. // "ANX.Framework developer group" and released under the Ms-PL license.
// For details see: http://anxframework.codeplex.com/license // For details see: http://anxframework.codeplex.com/license
using EffectTechnique = ANX.Framework.Graphics.EffectTechnique;
namespace ANX.RenderSystem.Windows.DX11 namespace ANX.RenderSystem.Windows.DX11
{ {
public class Effect_DX11 : INativeEffect public class Effect_DX11 : INativeEffect
@ -184,14 +186,14 @@ namespace ANX.RenderSystem.Windows.DX11
EffectTechnique_DX11 teqDx11 = new EffectTechnique_DX11(this.managedEffect); EffectTechnique_DX11 teqDx11 = new EffectTechnique_DX11(this.managedEffect);
teqDx11.NativeTechnique = nativeEffect.GetTechniqueByIndex(i); teqDx11.NativeTechnique = nativeEffect.GetTechniqueByIndex(i);
ANX.Framework.Graphics.EffectTechnique teq = new ANX.Framework.Graphics.EffectTechnique(this.managedEffect, teqDx11); EffectTechnique teq = new EffectTechnique(this.managedEffect, teqDx11);
yield return teq; yield return teq;
} }
} }
} }
public IEnumerable<ANX.Framework.Graphics.EffectParameter> Parameters public IEnumerable<EffectParameter> Parameters
{ {
get get
{ {
@ -200,7 +202,7 @@ namespace ANX.RenderSystem.Windows.DX11
EffectParameter_DX11 parDx11 = new EffectParameter_DX11(); EffectParameter_DX11 parDx11 = new EffectParameter_DX11();
parDx11.NativeParameter = nativeEffect.GetVariableByIndex(i); parDx11.NativeParameter = nativeEffect.GetVariableByIndex(i);
ANX.Framework.Graphics.EffectParameter par = new ANX.Framework.Graphics.EffectParameter(); EffectParameter par = new EffectParameter();
par.NativeParameter = parDx11; par.NativeParameter = parDx11;
yield return par; yield return par;

View File

@ -7,9 +7,11 @@ using SharpDX;
using SharpDX.DXGI; using SharpDX.DXGI;
using SharpDX.Direct3D; using SharpDX.Direct3D;
using SharpDX.D3DCompiler; using SharpDX.D3DCompiler;
using ANX.Framework.NonXNA;
using SharpDX.Direct3D11; using SharpDX.Direct3D11;
using ANX.Framework;
using ANX.Framework.NonXNA;
using ANX.Framework.Graphics; using ANX.Framework.Graphics;
using System.Runtime.InteropServices;
#endregion // Using Statements #endregion // Using Statements
@ -19,8 +21,10 @@ using ANX.Framework.Graphics;
using Device = SharpDX.Direct3D11.Device; using Device = SharpDX.Direct3D11.Device;
using Buffer = SharpDX.Direct3D11.Buffer; using Buffer = SharpDX.Direct3D11.Buffer;
using System.Runtime.InteropServices; using Rectangle = ANX.Framework.Rectangle;
using ANX.Framework; using Vector4 = ANX.Framework.Vector4;
using VertexBufferBinding = ANX.Framework.Graphics.VertexBufferBinding;
using Viewport = ANX.Framework.Graphics.Viewport;
namespace ANX.RenderSystem.Windows.DX11 namespace ANX.RenderSystem.Windows.DX11
{ {
@ -57,7 +61,7 @@ namespace ANX.RenderSystem.Windows.DX11
private DeviceContext deviceContext; private DeviceContext deviceContext;
private SwapChain swapChain; private SwapChain swapChain;
private RenderTargetView renderView; private RenderTargetView renderView;
private RenderTargetView renderTargetView; private RenderTargetView[] renderTargetView = new RenderTargetView[1];
private DepthStencilView depthStencilView; private DepthStencilView depthStencilView;
private SharpDX.Direct3D11.Texture2D depthStencilBuffer; private SharpDX.Direct3D11.Texture2D depthStencilBuffer;
private SharpDX.Direct3D11.Texture2D backBuffer; private SharpDX.Direct3D11.Texture2D backBuffer;
@ -187,7 +191,23 @@ namespace ANX.RenderSystem.Windows.DX11
clearColor.Alpha = color.A * ColorMultiplier; clearColor.Alpha = color.A * ColorMultiplier;
} }
this.deviceContext.ClearRenderTargetView(this.renderTargetView != null ? this.renderTargetView : this.renderView, this.clearColor); if (this.renderTargetView[0] == null)
{
this.deviceContext.ClearRenderTargetView(this.renderView, this.clearColor);
}
else
{
for (int i = 0; i < this.renderTargetView.Length; i++)
{
if (this.renderTargetView[i] == null)
{
break;
}
this.deviceContext.ClearRenderTargetView(this.renderTargetView[i], this.clearColor);
}
}
} }
public void Clear(ClearOptions options, ANX.Framework.Vector4 color, float depth, int stencil) public void Clear(ClearOptions options, ANX.Framework.Vector4 color, float depth, int stencil)
@ -202,7 +222,22 @@ namespace ANX.RenderSystem.Windows.DX11
this.clearColor.Alpha = color.W; this.clearColor.Alpha = color.W;
this.lastClearColor = 0; this.lastClearColor = 0;
this.deviceContext.ClearRenderTargetView(this.renderTargetView != null ? this.renderTargetView : this.renderView, this.clearColor); if (this.renderTargetView[0] == null)
{
this.deviceContext.ClearRenderTargetView(this.renderView, this.clearColor);
}
else
{
for (int i = 0; i < this.renderTargetView.Length; i++)
{
if (this.renderTargetView[i] == null)
{
break;
}
this.deviceContext.ClearRenderTargetView(this.renderTargetView[i], this.clearColor);
}
}
} }
if (this.depthStencilView != null) if (this.depthStencilView != null)
@ -322,7 +357,23 @@ namespace ANX.RenderSystem.Windows.DX11
deviceContext.InputAssembler.SetVertexBuffers(0, nativeVertexBufferBindings); deviceContext.InputAssembler.SetVertexBuffers(0, nativeVertexBufferBindings);
DrawPrimitives(primitiveType, vertexOffset, primitiveCount); SharpDX.Direct3D11.EffectPass pass; SharpDX.Direct3D11.EffectTechnique technique; ShaderBytecode passSignature;
SetupEffectForDraw(out pass, out technique, out passSignature);
var layout = CreateInputLayout(deviceContext.Device, passSignature, vertexDeclaration);
deviceContext.InputAssembler.InputLayout = layout;
// Prepare All the stages
deviceContext.InputAssembler.PrimitiveTopology = FormatConverter.Translate(primitiveType);
deviceContext.Rasterizer.SetViewports(currentViewport);
//device.OutputMerger.SetTargets(this.depthStencilView, this.renderView);
for (int i = 0; i < technique.Description.PassCount; ++i)
{
pass.Apply(deviceContext);
deviceContext.Draw(primitiveCount, vertexOffset);
}
} }
#endregion // DrawUserPrimitives<T> #endregion // DrawUserPrimitives<T>
@ -486,10 +537,13 @@ namespace ANX.RenderSystem.Windows.DX11
if (renderTargets == null) if (renderTargets == null)
{ {
// reset the RenderTarget to backbuffer // reset the RenderTarget to backbuffer
if (renderTargetView != null) for (int i = 0; i < renderTargetView.Length; i++)
{ {
renderTargetView.Dispose(); if (renderTargetView[i] != null)
renderTargetView = null; {
renderTargetView[i].Dispose();
renderTargetView[i] = null;
}
} }
deviceContext.OutputMerger.SetRenderTargets(1, new RenderTargetView[] { this.renderView }, this.depthStencilView); deviceContext.OutputMerger.SetRenderTargets(1, new RenderTargetView[] { this.renderView }, this.depthStencilView);
@ -497,26 +551,39 @@ namespace ANX.RenderSystem.Windows.DX11
} }
else else
{ {
if (renderTargets.Length == 1) int renderTargetCount = renderTargets.Length;
if (this.renderTargetView.Length != renderTargetCount)
{ {
RenderTarget2D renderTarget = renderTargets[0].RenderTarget as RenderTarget2D; for (int i = 0; i < renderTargetView.Length; i++)
RenderTarget2D_DX11 nativeRenderTarget = renderTarget.NativeRenderTarget as RenderTarget2D_DX11; {
if (renderTargetView[i] != null)
{
renderTargetView[i].Dispose();
renderTargetView[i] = null;
}
}
this.renderTargetView = new RenderTargetView[renderTargetCount];
}
for (int i = 0; i < renderTargetCount; i++)
{
RenderTarget2D renderTarget = renderTargets[i].RenderTarget as RenderTarget2D;
if (renderTarget != null) if (renderTarget != null)
{ {
if (renderTargetView != null) RenderTarget2D_DX11 nativeRenderTarget = renderTarget.NativeRenderTarget as RenderTarget2D_DX11;
if (renderTargetView[i] != null)
{ {
renderTargetView.Dispose(); renderTargetView[i].Dispose();
renderTargetView = null;
} }
this.renderTargetView = new RenderTargetView(deviceContext.Device, ((Texture2D_DX11)nativeRenderTarget).NativeShaderResourceView.Resource);
DepthStencilView depthStencilView = null; renderTargetView[i] = new RenderTargetView(deviceContext.Device, ((Texture2D_DX11)nativeRenderTarget).NativeShaderResourceView.Resource);
deviceContext.OutputMerger.SetRenderTargets(1, new RenderTargetView[] { this.renderTargetView }, depthStencilView);
} }
} }
else
{ deviceContext.OutputMerger.SetRenderTargets(renderTargetCount, renderTargetView, this.depthStencilView);
throw new NotImplementedException("handling of multiple RenderTargets are not yet implemented"); deviceContext.OutputMerger.SetTargets(this.depthStencilView, this.renderTargetView);
}
} }
} }
@ -592,10 +659,13 @@ namespace ANX.RenderSystem.Windows.DX11
public void Dispose() public void Dispose()
{ {
if (renderTargetView != null) for (int i = 0; i < renderTargetView.Length; i++)
{ {
renderTargetView.Dispose(); if (renderTargetView[i] != null)
renderTargetView = null; {
renderTargetView[i].Dispose();
renderTargetView[i] = null;
}
} }
if (swapChain != null) if (swapChain != null)

View File

@ -67,11 +67,21 @@ namespace MultiRenderTarget
protected override void Draw(GameTime gameTime) protected override void Draw(GameTime gameTime)
{ {
GraphicsDevice.SetRenderTargets(renderTargets[0], renderTargets[1], renderTargets[2], renderTargets[3]); //GraphicsDevice.SetRenderTargets(renderTargets[0], renderTargets[1], renderTargets[2], renderTargets[3]);
GraphicsDevice.Clear(Color.Black); //GraphicsDevice.Clear(Color.Black);
effect.CurrentTechnique.Passes[0].Apply(); //effect.CurrentTechnique.Passes[0].Apply();
GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(PrimitiveType.TriangleList, primitives, 0, 2); //GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(PrimitiveType.TriangleList, primitives, 0, 2);
//GraphicsDevice.SetRenderTarget(null);
//TODO: the code above should work but it looks like there's a problem with DrawUserPrimitives
GraphicsDevice.SetRenderTarget(renderTargets[0]);
GraphicsDevice.Clear(Color.Green);
GraphicsDevice.SetRenderTarget(renderTargets[1]);
GraphicsDevice.Clear(Color.Blue);
GraphicsDevice.SetRenderTarget(renderTargets[2]);
GraphicsDevice.Clear(Color.Yellow);
GraphicsDevice.SetRenderTarget(null); GraphicsDevice.SetRenderTarget(null);
spriteBatch.Begin(); spriteBatch.Begin();

View File

@ -143,11 +143,7 @@
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\..\RenderSystems\ANX.Framework.Windows.DX10\ANX.RenderSystem.Windows.DX10.csproj"> <ProjectReference Include="..\..\RenderSystems\ANX.Framework.Windows.DX10\ANX.RenderSystem.Windows.DX10.csproj">
<Project>{5BE49183-2F6F-4527-AC90-D816911FCF90}</Project> <Project>{5BE49183-2F6F-4527-AC90-D816911FCF90}</Project>
<Name>ANX.Framework.Windows.DX10</Name> <Name>ANX.RenderSystem.Windows.DX10</Name>
</ProjectReference>
<ProjectReference Include="..\..\RenderSystems\ANX.RenderSystem.Windows.DX11\ANX.RenderSystem.Windows.DX11.csproj">
<Project>{B30DE9C2-0926-46B6-8351-9AF276C472D5}</Project>
<Name>ANX.RenderSystem.Windows.DX11</Name>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\..\SoundSystems\ANX.SoundSystem.Windows.XAudio\ANX.SoundSystem.Windows.XAudio.csproj"> <ProjectReference Include="..\..\SoundSystems\ANX.SoundSystem.Windows.XAudio\ANX.SoundSystem.Windows.XAudio.csproj">
<Project>{6A582788-C4D2-410C-96CD-177F75712D65}</Project> <Project>{6A582788-C4D2-410C-96CD-177F75712D65}</Project>

View File

@ -5,7 +5,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ANXStatusComparer", "ANXSta
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StockShaderCodeGenerator", "StockShaderCodeGenerator\StockShaderCodeGenerator.csproj", "{D73E5FF4-AE88-4637-8159-120FBDA564BF}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StockShaderCodeGenerator", "StockShaderCodeGenerator\StockShaderCodeGenerator.csproj", "{D73E5FF4-AE88-4637-8159-120FBDA564BF}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XNAToANXConverter", "XNAToANXConverter\XNAToANXConverter.csproj", "{B5209A04-B2F8-4033-A5E7-545BE771214C}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectConverter", "ProjectConverter\ProjectConverter.csproj", "{B5209A04-B2F8-4033-A5E7-545BE771214C}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution