From e1076f89841196b1075881cb51cb1cc4dd2ee6a9 Mon Sep 17 00:00:00 2001 From: Glatzemann Date: Wed, 14 Dec 2011 11:49:04 +0000 Subject: [PATCH] added DX11 stock shaders to build system updated StockShaderCodeGenerator (sscg) to support DX11 shaders updated the DX11 RenderSystem to be on par with the DX10 RenderSystem (it is currently not working completly because of some issues with shaders) --- ANX.Framework.sln | 12 + .../DepthStencilState_DX10.cs | 56 +- .../ANX.RenderSystem.Windows.DX11.csproj | 17 + .../BlendState_DX11.cs | 327 ++++++++ .../ANX.RenderSystem.Windows.DX11/Creator.cs | 235 +++--- .../DepthStencilState_DX11.cs | 342 ++++++++ .../EffectParameter_DX11.cs | 202 +++++ .../EffectPass_DX11.cs | 84 ++ .../EffectTechnique_DX11.cs | 112 +++ .../Effect_DX11.cs | 57 +- .../FormatConverter.cs | 387 +++++++++ .../GraphicsDeviceWindowsDX11.cs | 759 +++++++++--------- .../IndexBuffer_DX11.cs | 155 ++++ .../NativeMethods.cs | 120 +++ .../Properties/AssemblyInfo.cs | 4 +- .../RasterizerState_DX11.cs | 212 +++++ .../RenderTarget2D_DX11.cs | 103 +++ .../SamplerState_DX11.cs | 216 +++++ .../ShaderByteCode.cs | 217 +++++ .../Texture2D_DX11.cs | 316 ++++++++ .../VertexBuffer_DX11.cs | 41 +- .../WindowsGameHost.cs | 137 ++++ .../WindowsGameWindow.cs | 163 ++++ Samples/SimpleSprite/Program.cs | 4 +- Samples/SimpleSprite/SimpleSprite.csproj | 4 + Tools/StockShaderCodeGenerator/Compiler.cs | 4 + .../Properties/AssemblyInfo.cs | 4 +- .../StockShaderCodeGenerator.csproj | 4 + build/ANX.Framework.build | 9 + build/create_shaders.bat | 1 + shader/DX11/AlphaTest.fx | 90 +++ shader/DX11/BasicEffect.fx | 89 ++ shader/DX11/DualTexture.fx | 89 ++ shader/DX11/EnvironmentMap.fx | 89 ++ shader/DX11/Skinned.fx | 89 ++ shader/DX11/SpriteBatch.fx | 87 ++ shader/DX11/build.xml | 29 + 37 files changed, 4311 insertions(+), 555 deletions(-) create mode 100644 RenderSystems/ANX.RenderSystem.Windows.DX11/BlendState_DX11.cs create mode 100644 RenderSystems/ANX.RenderSystem.Windows.DX11/DepthStencilState_DX11.cs create mode 100644 RenderSystems/ANX.RenderSystem.Windows.DX11/EffectParameter_DX11.cs create mode 100644 RenderSystems/ANX.RenderSystem.Windows.DX11/EffectPass_DX11.cs create mode 100644 RenderSystems/ANX.RenderSystem.Windows.DX11/EffectTechnique_DX11.cs create mode 100644 RenderSystems/ANX.RenderSystem.Windows.DX11/FormatConverter.cs create mode 100644 RenderSystems/ANX.RenderSystem.Windows.DX11/IndexBuffer_DX11.cs create mode 100644 RenderSystems/ANX.RenderSystem.Windows.DX11/NativeMethods.cs create mode 100644 RenderSystems/ANX.RenderSystem.Windows.DX11/RasterizerState_DX11.cs create mode 100644 RenderSystems/ANX.RenderSystem.Windows.DX11/RenderTarget2D_DX11.cs create mode 100644 RenderSystems/ANX.RenderSystem.Windows.DX11/SamplerState_DX11.cs create mode 100644 RenderSystems/ANX.RenderSystem.Windows.DX11/ShaderByteCode.cs create mode 100644 RenderSystems/ANX.RenderSystem.Windows.DX11/Texture2D_DX11.cs create mode 100644 RenderSystems/ANX.RenderSystem.Windows.DX11/WindowsGameHost.cs create mode 100644 RenderSystems/ANX.RenderSystem.Windows.DX11/WindowsGameWindow.cs create mode 100644 shader/DX11/AlphaTest.fx create mode 100644 shader/DX11/BasicEffect.fx create mode 100644 shader/DX11/DualTexture.fx create mode 100644 shader/DX11/EnvironmentMap.fx create mode 100644 shader/DX11/Skinned.fx create mode 100644 shader/DX11/SpriteBatch.fx create mode 100644 shader/DX11/build.xml diff --git a/ANX.Framework.sln b/ANX.Framework.sln index d3da0b2e..6f80e5a6 100644 --- a/ANX.Framework.sln +++ b/ANX.Framework.sln @@ -117,6 +117,17 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ANX.RenderSystem.Windows.Me EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RecordingSample", "RecordingSample\RecordingSample\RecordingSample.csproj", "{160150D5-38E6-482D-97F5-2624F322A854}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DX11", "DX11", "{6285F3EF-07DB-49C9-8CDE-A9092789FE4F}" + ProjectSection(SolutionItems) = preProject + shader\DX11\AlphaTest.fx = shader\DX11\AlphaTest.fx + shader\DX11\BasicEffect.fx = shader\DX11\BasicEffect.fx + shader\DX11\build.xml = shader\DX11\build.xml + shader\DX11\DualTexture.fx = shader\DX11\DualTexture.fx + shader\DX11\EnvironmentMap.fx = shader\DX11\EnvironmentMap.fx + shader\DX11\Skinned.fx = shader\DX11\Skinned.fx + shader\DX11\SpriteBatch.fx = shader\DX11\SpriteBatch.fx + EndProjectSection +EndProject Global GlobalSection(SubversionScc) = preSolution Svn-Managed = True @@ -442,5 +453,6 @@ Global {CCB4679D-11AF-4EC6-AAA4-36619FCE70FA} = {60824BDB-AC8A-42ED-9B79-111FB44669FF} {E4FFD875-95FC-48F2-8B6D-8483D0B71666} = {60824BDB-AC8A-42ED-9B79-111FB44669FF} {BD648BB8-EF28-453C-B4F5-EE3C93EB4DAF} = {60824BDB-AC8A-42ED-9B79-111FB44669FF} + {6285F3EF-07DB-49C9-8CDE-A9092789FE4F} = {60824BDB-AC8A-42ED-9B79-111FB44669FF} EndGlobalSection EndGlobal diff --git a/RenderSystems/ANX.Framework.Windows.DX10/DepthStencilState_DX10.cs b/RenderSystems/ANX.Framework.Windows.DX10/DepthStencilState_DX10.cs index 376d4e9c..bef0ca79 100644 --- a/RenderSystems/ANX.Framework.Windows.DX10/DepthStencilState_DX10.cs +++ b/RenderSystems/ANX.Framework.Windows.DX10/DepthStencilState_DX10.cs @@ -1,9 +1,61 @@ -using System; +#region Using Statements +using System; using System.Collections.Generic; using System.Linq; using System.Text; -using ANX.Framework.NonXNA; using SharpDX.Direct3D10; +using ANX.Framework.Graphics; +using ANX.Framework.NonXNA; +using ANX.Framework; + +#endregion // Using Statements + +#region License + +// +// This file is part of the ANX.Framework created by the "ANX.Framework developer group". +// +// This file is released under the Ms-PL license. +// +// +// +// Microsoft Public License (Ms-PL) +// +// This license governs use of the accompanying software. If you use the software, you accept this license. +// If you do not accept the license, do not use the software. +// +// 1.Definitions +// The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning +// here as under U.S. copyright law. +// A "contribution" is the original software, or any additions or changes to the software. +// A "contributor" is any person that distributes its contribution under this license. +// "Licensed patents" are a contributor's patent claims that read directly on its contribution. +// +// 2.Grant of Rights +// (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations +// in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to +// reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution +// or any derivative works that you create. +// (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in +// section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed +// patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution +// in the software or derivative works of the contribution in the software. +// +// 3.Conditions and Limitations +// (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. +// (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your +// patent license from such contributor to the software ends automatically. +// (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution +// notices that are present in the software. +// (D) If you distribute any portion of the software in source code form, you may do so only under this license by including +// a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or +// object code form, you may only do so under a license that complies with this license. +// (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, +// or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the +// extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a +// particular purpose and non-infringement. + +#endregion // License namespace ANX.Framework.Windows.DX10 { diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/ANX.RenderSystem.Windows.DX11.csproj b/RenderSystems/ANX.RenderSystem.Windows.DX11/ANX.RenderSystem.Windows.DX11.csproj index 9b2296b6..5274e18d 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX11/ANX.RenderSystem.Windows.DX11.csproj +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/ANX.RenderSystem.Windows.DX11.csproj @@ -65,18 +65,35 @@ ..\..\lib\SharpDX\Bin\SharpDX.DXGI.dll + + + + + + + + + Metadata.resx True True + + + + + + + + diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/BlendState_DX11.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/BlendState_DX11.cs new file mode 100644 index 00000000..0ebad3bc --- /dev/null +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/BlendState_DX11.cs @@ -0,0 +1,327 @@ +#region Using Statements +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using SharpDX.Direct3D11; +using ANX.Framework.Graphics; +using ANX.Framework.NonXNA; +using ANX.Framework; + +#endregion // Using Statements + +#region License + +// +// This file is part of the ANX.Framework created by the "ANX.Framework developer group". +// +// This file is released under the Ms-PL license. +// +// +// +// Microsoft Public License (Ms-PL) +// +// This license governs use of the accompanying software. If you use the software, you accept this license. +// If you do not accept the license, do not use the software. +// +// 1.Definitions +// The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning +// here as under U.S. copyright law. +// A "contribution" is the original software, or any additions or changes to the software. +// A "contributor" is any person that distributes its contribution under this license. +// "Licensed patents" are a contributor's patent claims that read directly on its contribution. +// +// 2.Grant of Rights +// (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations +// in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to +// reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution +// or any derivative works that you create. +// (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in +// section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed +// patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution +// in the software or derivative works of the contribution in the software. +// +// 3.Conditions and Limitations +// (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. +// (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your +// patent license from such contributor to the software ends automatically. +// (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution +// notices that are present in the software. +// (D) If you distribute any portion of the software in source code form, you may do so only under this license by including +// a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or +// object code form, you may only do so under a license that complies with this license. +// (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, +// or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the +// extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a +// particular purpose and non-infringement. + +#endregion // License + +namespace ANX.RenderSystem.Windows.DX11 +{ + public class BlendState_DX11 : INativeBlendState + { + #region Private Members + private BlendStateDescription blendStateDescription; + private SharpDX.Direct3D11.BlendState nativeBlendState; + private bool nativeBlendStateDirty; + private SharpDX.Color4 blendFactor; + private int multiSampleMask; + private bool bound; + + #endregion // Private Members + + public BlendState_DX11() + { + for (int i = 0; i < blendStateDescription.RenderTarget.Length; i++) + { + blendStateDescription.RenderTarget[i] = new RenderTargetBlendDescription(); + blendStateDescription.IndependentBlendEnable = true; + } + + nativeBlendStateDirty = true; + } + + public void Apply(GraphicsDevice graphics) + { + GraphicsDeviceWindowsDX11 gdx11 = graphics.NativeDevice as GraphicsDeviceWindowsDX11; + SharpDX.Direct3D11.DeviceContext context = gdx11.NativeDevice; + + UpdateNativeBlendState(context.Device); + this.bound = true; + + context.OutputMerger.SetBlendState(nativeBlendState, this.blendFactor, this.multiSampleMask); + } + + public void Release() + { + this.bound = false; + } + + public void Dispose() + { + if (this.nativeBlendState != null) + { + this.nativeBlendState.Dispose(); + this.nativeBlendState = null; + } + } + + public bool IsBound + { + get + { + return this.bound; + } + } + + public Color BlendFactor + { + set + { + const float colorConvert = 1f / 255f; + + blendFactor.Red = value.R * colorConvert; + blendFactor.Green = value.G * colorConvert; + blendFactor.Blue = value.B * colorConvert; + blendFactor.Alpha = value.A * colorConvert; + } + } + + public int MultiSampleMask + { + set + { + this.multiSampleMask = value; + } + } + + public BlendFunction AlphaBlendFunction + { + set + { + BlendOperation alphaBlendOperation = FormatConverter.Translate(value); + + for (int i = 0; i < blendStateDescription.RenderTarget.Length; i++) + { + if (blendStateDescription.RenderTarget[i].AlphaBlendOperation != alphaBlendOperation) + { + nativeBlendStateDirty = true; + blendStateDescription.RenderTarget[i].AlphaBlendOperation = alphaBlendOperation; + } + + } + } + } + + public BlendFunction ColorBlendFunction + { + set + { + BlendOperation blendOperation = FormatConverter.Translate(value); + + for (int i = 0; i < blendStateDescription.RenderTarget.Length; i++) + { + if (blendStateDescription.RenderTarget[i].BlendOperation != blendOperation) + { + nativeBlendStateDirty = true; + blendStateDescription.RenderTarget[i].BlendOperation = blendOperation; + } + + } + } + } + + public Blend AlphaDestinationBlend + { + set + { + BlendOption destinationAlphaBlend = FormatConverter.Translate(value); + + for (int i = 0; i < blendStateDescription.RenderTarget.Length; i++) + { + if (blendStateDescription.RenderTarget[i].DestinationAlphaBlend != destinationAlphaBlend) + { + nativeBlendStateDirty = true; + blendStateDescription.RenderTarget[i].DestinationAlphaBlend = destinationAlphaBlend; + } + + } + } + } + + public Blend ColorDestinationBlend + { + set + { + BlendOption destinationBlend = FormatConverter.Translate(value); + + for (int i = 0; i < blendStateDescription.RenderTarget.Length; i++) + { + if (blendStateDescription.RenderTarget[i].DestinationBlend != destinationBlend) + { + nativeBlendStateDirty = true; + blendStateDescription.RenderTarget[i].DestinationBlend = destinationBlend; + } + + } + } + } + + public ColorWriteChannels ColorWriteChannels + { + set + { + ColorWriteMaskFlags renderTargetWriteMask = FormatConverter.Translate(value); + + //TODO: range check + + if (blendStateDescription.RenderTarget[0].RenderTargetWriteMask != renderTargetWriteMask) + { + nativeBlendStateDirty = true; + blendStateDescription.RenderTarget[0].RenderTargetWriteMask = renderTargetWriteMask; + } + } + } + + public ColorWriteChannels ColorWriteChannels1 + { + set + { + ColorWriteMaskFlags renderTargetWriteMask = FormatConverter.Translate(value); + + //TODO: range check + + if (blendStateDescription.RenderTarget[1].RenderTargetWriteMask != renderTargetWriteMask) + { + nativeBlendStateDirty = true; + blendStateDescription.RenderTarget[1].RenderTargetWriteMask = renderTargetWriteMask; + } + } + } + + public ColorWriteChannels ColorWriteChannels2 + { + set + { + ColorWriteMaskFlags renderTargetWriteMask = FormatConverter.Translate(value); + + //TODO: range check + + if (blendStateDescription.RenderTarget[2].RenderTargetWriteMask != renderTargetWriteMask) + { + nativeBlendStateDirty = true; + blendStateDescription.RenderTarget[2].RenderTargetWriteMask = renderTargetWriteMask; + } + } + } + + public ColorWriteChannels ColorWriteChannels3 + { + set + { + ColorWriteMaskFlags renderTargetWriteMask = FormatConverter.Translate(value); + + //TODO: range check + + if (blendStateDescription.RenderTarget[3].RenderTargetWriteMask != renderTargetWriteMask) + { + nativeBlendStateDirty = true; + blendStateDescription.RenderTarget[3].RenderTargetWriteMask = renderTargetWriteMask; + } + } + } + + public Blend AlphaSourceBlend + { + set + { + BlendOption sourceAlphaBlend = FormatConverter.Translate(value); + + for (int i = 0; i < blendStateDescription.RenderTarget.Length; i++) + { + if (blendStateDescription.RenderTarget[i].SourceAlphaBlend != sourceAlphaBlend) + { + nativeBlendStateDirty = true; + blendStateDescription.RenderTarget[i].SourceAlphaBlend = sourceAlphaBlend; + } + + } + } + } + + public Blend ColorSourceBlend + { + set + { + BlendOption sourceBlend = FormatConverter.Translate(value); + + for (int i = 0; i < blendStateDescription.RenderTarget.Length; i++) + { + if (blendStateDescription.RenderTarget[i].SourceBlend != sourceBlend) + { + nativeBlendStateDirty = true; + blendStateDescription.RenderTarget[i].SourceBlend = sourceBlend; + } + + } + } + } + + private void UpdateNativeBlendState(SharpDX.Direct3D11.Device device) + { + if (this.nativeBlendStateDirty == true || this.nativeBlendState == null) + { + if (this.nativeBlendState != null) + { + this.nativeBlendState.Dispose(); + this.nativeBlendState = null; + } + + this.nativeBlendState = new SharpDX.Direct3D11.BlendState(device, ref this.blendStateDescription); + + this.nativeBlendStateDirty = false; + } + } + } +} diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/Creator.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/Creator.cs index 795377ae..6b6aef25 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX11/Creator.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/Creator.cs @@ -7,6 +7,8 @@ using ANX.Framework.Graphics; using System.IO; using ANX.Framework.NonXNA; using System.Runtime.InteropServices; +using SharpDX.DXGI; +using ANX.Framework.NonXNA.RenderSystem; using ANX.Framework; #endregion // Using Statements @@ -62,17 +64,16 @@ namespace ANX.RenderSystem.Windows.DX11 { public class Creator : IRenderSystemCreator { - - public void RegisterCreator(AddInSystemFactory factory) - { - factory.AddCreator(this); - } - public string Name { get { return "DirectX11"; } } + public int Priority + { + get { return 5; } + } + public bool IsSupported { get @@ -82,173 +83,122 @@ namespace ANX.RenderSystem.Windows.DX11 } } - public int Priority - { - get { return int.MaxValue; } - } - public GameHost CreateGameHost(Game game) { AddInSystemFactory.Instance.PreventRenderSystemChange(); - - throw new NotImplementedException(); - //return new WindowsGameHost(game); + return new WindowsGameHost(game); } public INativeGraphicsDevice CreateGraphicsDevice(PresentationParameters presentationParameters) { AddInSystemFactory.Instance.PreventRenderSystemChange(); - - throw new NotImplementedException(); - //return new GraphicsDeviceWindowsDX11_1(presentationParameters); + return new GraphicsDeviceWindowsDX11(presentationParameters); } public INativeBuffer CreateIndexBuffer(GraphicsDevice graphics, IndexElementSize size, int indexCount, BufferUsage usage) { AddInSystemFactory.Instance.PreventRenderSystemChange(); - - throw new NotImplementedException(); - //return new IndexBuffer_DX 11(graphics, size, indexCount, usage); + return new IndexBuffer_DX11(graphics, size, indexCount, usage); } public INativeBuffer CreateVertexBuffer(GraphicsDevice graphics, VertexDeclaration vertexDeclaration, int vertexCount, BufferUsage usage) { AddInSystemFactory.Instance.PreventRenderSystemChange(); - return new VertexBuffer_DX11(graphics, vertexDeclaration, vertexCount, usage); } - public INativeEffect CreateEffect(GraphicsDevice graphics, Effect effect, Stream vertexShaderByteCode, Stream pixelShaderByteCode) + public INativeEffect CreateEffect(GraphicsDevice graphics, ANX.Framework.Graphics.Effect managedEffect, Stream vertexShaderByteCode, Stream pixelShaderByteCode) { AddInSystemFactory.Instance.PreventRenderSystemChange(); - throw new NotImplementedException(); - //return new Effect_DX11(graphics, vertexShaderByteCode, pixelShaderByteCode); + Effect_DX11 effect = new Effect_DX11(graphics, managedEffect, vertexShaderByteCode, pixelShaderByteCode); + + return effect; } - public INativeEffect CreateEffect(GraphicsDevice graphics, Effect effect, System.IO.Stream byteCode) + public INativeEffect CreateEffect(GraphicsDevice graphics, ANX.Framework.Graphics.Effect managedEffect, System.IO.Stream byteCode) { AddInSystemFactory.Instance.PreventRenderSystemChange(); - throw new NotImplementedException(); - //return new Effect_DX11(graphics, byteCode); + Effect_DX11 effect = new Effect_DX11(graphics, managedEffect, byteCode); + + return effect; } public Texture2D CreateTexture(GraphicsDevice graphics, string fileName) { AddInSystemFactory.Instance.PreventRenderSystemChange(); - throw new NotImplementedException(); - } - - public Texture2D CreateTexture(GraphicsDevice graphics, SurfaceFormat surfaceFormat, int width, int height, int mipCount, byte[] colorData) - { - AddInSystemFactory.Instance.PreventRenderSystemChange(); - + //TODO: implement throw new NotImplementedException(); -/* - if (mipCount > 1) - { - throw new Exception("creating textures with mip map not yet implemented"); - } + //GraphicsDeviceWindowsDX10 graphicsDX10 = graphics.NativeDevice as GraphicsDeviceWindowsDX10; + //SharpDX.Direct3D10.Texture2D nativeTexture = SharpDX.Direct3D10.Texture2D.FromFile(graphicsDX10.NativeDevice, fileName); + //Texture2D_DX10 texture = new Texture2D_DX10(graphics, nativeTexture.Description.Width, nativeTexture.Description.Height, FormatConverter.Translate(nativeTexture.Description.Format), nativeTexture.Description.MipLevels); + //texture.NativeTexture = nativeTexture; - GraphicsDeviceWindowsDX10 graphicsDX10 = graphics.NativeDevice as GraphicsDeviceWindowsDX10; - SharpDX.Direct3D10.Device device = graphicsDX10.NativeDevice; - Texture2D_DX10 texture = new Texture2D_DX10(graphics, width, height); - - SharpDX.Direct3D10.Texture2DDescription description = new SharpDX.Direct3D10.Texture2DDescription() - { - Width = width, - Height = height, - MipLevels = mipCount, - ArraySize = mipCount, - Format = SharpDX.DXGI.Format.R8G8B8A8_UNorm, - SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0), - Usage = SharpDX.Direct3D10.ResourceUsage.Dynamic, - BindFlags = SharpDX.Direct3D10.BindFlags.ShaderResource, - CpuAccessFlags = SharpDX.Direct3D10.CpuAccessFlags.Write, - }; - texture.NativeTexture = new SharpDX.Direct3D10.Texture2D(graphicsDX10.NativeDevice, description); - - // description of texture formats of DX10: http://msdn.microsoft.com/en-us/library/bb694531(v=VS.85).aspx - // more helpfull information on DX10 textures: http://msdn.microsoft.com/en-us/library/windows/desktop/bb205131(v=vs.85).aspx - - if (surfaceFormat == SurfaceFormat.Color) - { - int subresource = SharpDX.Direct3D10.Texture2D.CalculateSubresourceIndex(0, 0, 1); - SharpDX.DataRectangle rectangle = texture.NativeTexture.Map(subresource, SharpDX.Direct3D10.MapMode.WriteDiscard, SharpDX.Direct3D10.MapFlags.None); - int rowPitch = rectangle.Pitch; - - unsafe - { - byte* pTexels = (byte*)rectangle.DataPointer; - int srcIndex = 0; - - for (int row = 0; row < height; row++) - { - int rowStart = row * rowPitch; - - for (int col = 0; col < width; col++) - { - int colStart = col * 4; - pTexels[rowStart + colStart + 0] = colorData[srcIndex++]; - pTexels[rowStart + colStart + 1] = colorData[srcIndex++]; - pTexels[rowStart + colStart + 2] = colorData[srcIndex++]; - pTexels[rowStart + colStart + 3] = colorData[srcIndex++]; - } - } - } - - texture.NativeTexture.Unmap(subresource); - } - else - { - throw new Exception(string.Format("creating textures of format {0} not yet implemented...", surfaceFormat.ToString())); - } - - return texture; -*/ + //return texture; } - public INativeBlendState CreateBlendState() { AddInSystemFactory.Instance.PreventRenderSystemChange(); - - throw new NotImplementedException(); + return new BlendState_DX11(); } - public INativeRasterizerState CreateRasterizerState() { AddInSystemFactory.Instance.PreventRenderSystemChange(); - - throw new NotImplementedException(); + return new RasterizerState_DX11(); } - public INativeDepthStencilState CreateDepthStencilState() { AddInSystemFactory.Instance.PreventRenderSystemChange(); - - throw new NotImplementedException(); + return new DepthStencilState_DX11(); } - public INativeSamplerState CreateSamplerState() { AddInSystemFactory.Instance.PreventRenderSystemChange(); - - throw new NotImplementedException(); + return new SamplerState_DX11(); } - public byte[] GetShaderByteCode(PreDefinedShader type) { AddInSystemFactory.Instance.PreventRenderSystemChange(); - throw new NotImplementedException(); + if (type == PreDefinedShader.SpriteBatch) + { + return ShaderByteCode.SpriteBatchByteCode; + } + else if (type == PreDefinedShader.AlphaTestEffect) + { + return ShaderByteCode.AlphaTestEffectByteCode; + } + else if (type == PreDefinedShader.BasicEffect) + { + return ShaderByteCode.BasicEffectByteCode; + } + else if (type == PreDefinedShader.DualTextureEffect) + { + return ShaderByteCode.DualTextureEffectByteCode; + } + else if (type == PreDefinedShader.EnvironmentMapEffect) + { + return ShaderByteCode.EnvironmentMapEffectByteCode; + } + else if (type == PreDefinedShader.SkinnedEffect) + { + return ShaderByteCode.SkinnedEffectByteCode; + } + + throw new NotImplementedException("ByteCode for '" + type.ToString() + "' is not yet available"); + } + + public void RegisterCreator(AddInSystemFactory factory) + { + factory.AddCreator(this); } @@ -256,21 +206,68 @@ namespace ANX.RenderSystem.Windows.DX11 { AddInSystemFactory.Instance.PreventRenderSystemChange(); - throw new NotImplementedException(); + SharpDX.DXGI.Factory factory = new Factory(); + + List adapterList = new List(); + DisplayModeCollection displayModeCollection = new DisplayModeCollection(); + + for (int i = 0; i < factory.GetAdapterCount(); i++) + { + using (Adapter adapter = factory.GetAdapter(i)) + { + GraphicsAdapter ga = new GraphicsAdapter(); + //ga.CurrentDisplayMode = ; + //ga.Description = ; + ga.DeviceId = adapter.Description.DeviceId; + ga.DeviceName = adapter.Description.Description; + ga.IsDefaultAdapter = i == 0; //TODO: how to set default adapter? + //ga.IsWideScreen = ; + //ga.MonitorHandle = ; + ga.Revision = adapter.Description.Revision; + ga.SubSystemId = adapter.Description.SubsystemId; + //ga.SupportedDisplayModes = ; + ga.VendorId = adapter.Description.VendorId; + + using (Output adapterOutput = adapter.GetOutput(0)) + { + foreach (ModeDescription modeDescription in adapterOutput.GetDisplayModeList(Format.R8G8B8A8_UNorm, DisplayModeEnumerationFlags.Interlaced)) + { + DisplayMode displayMode = new DisplayMode() + { + Format = FormatConverter.Translate(modeDescription.Format), + Width = modeDescription.Width, + Height = modeDescription.Height, + AspectRatio = (float)modeDescription.Width / (float)modeDescription.Height, + TitleSafeArea = new Rectangle(0, 0, modeDescription.Width, modeDescription.Height), //TODO: calculate this for real + }; + + displayModeCollection[displayMode.Format] = new DisplayMode[] { displayMode }; + } + } + + ga.SupportedDisplayModes = displayModeCollection; + + adapterList.Add(ga); + } + } + + factory.Dispose(); + + return new System.Collections.ObjectModel.ReadOnlyCollection(adapterList); } - - public Framework.NonXNA.RenderSystem.INativeTexture2D CreateTexture(GraphicsDevice graphics, SurfaceFormat surfaceFormat, int width, int height, int mipCount) - { - throw new NotImplementedException(); - } - - - public Framework.NonXNA.RenderSystem.INativeRenderTarget2D CreateRenderTarget(GraphicsDevice graphics, int width, int height, bool mipMap, SurfaceFormat preferredFormat, DepthFormat preferredDepthFormat, int preferredMultiSampleCount, RenderTargetUsage usage) + public INativeTexture2D CreateTexture(GraphicsDevice graphics, SurfaceFormat surfaceFormat, int width, int height, int mipCount) { AddInSystemFactory.Instance.PreventRenderSystemChange(); - throw new NotImplementedException(); + return new Texture2D_DX11(graphics, width, height, surfaceFormat, mipCount); + } + + public INativeRenderTarget2D CreateRenderTarget(GraphicsDevice graphics, int width, int height, bool mipMap, SurfaceFormat preferredFormat, DepthFormat preferredDepthFormat, int preferredMultiSampleCount, RenderTargetUsage usage) + { + AddInSystemFactory.Instance.PreventRenderSystemChange(); + + return new RenderTarget2D_DX11(graphics, width, height, mipMap, preferredFormat, preferredDepthFormat, preferredMultiSampleCount, usage); } } } diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/DepthStencilState_DX11.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/DepthStencilState_DX11.cs new file mode 100644 index 00000000..f42e1f69 --- /dev/null +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/DepthStencilState_DX11.cs @@ -0,0 +1,342 @@ +#region Using Statements +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using SharpDX.Direct3D11; +using ANX.Framework.Graphics; +using ANX.Framework.NonXNA; +using ANX.Framework; + +#endregion // Using Statements + +#region License + +// +// This file is part of the ANX.Framework created by the "ANX.Framework developer group". +// +// This file is released under the Ms-PL license. +// +// +// +// Microsoft Public License (Ms-PL) +// +// This license governs use of the accompanying software. If you use the software, you accept this license. +// If you do not accept the license, do not use the software. +// +// 1.Definitions +// The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning +// here as under U.S. copyright law. +// A "contribution" is the original software, or any additions or changes to the software. +// A "contributor" is any person that distributes its contribution under this license. +// "Licensed patents" are a contributor's patent claims that read directly on its contribution. +// +// 2.Grant of Rights +// (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations +// in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to +// reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution +// or any derivative works that you create. +// (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in +// section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed +// patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution +// in the software or derivative works of the contribution in the software. +// +// 3.Conditions and Limitations +// (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. +// (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your +// patent license from such contributor to the software ends automatically. +// (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution +// notices that are present in the software. +// (D) If you distribute any portion of the software in source code form, you may do so only under this license by including +// a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or +// object code form, you may only do so under a license that complies with this license. +// (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, +// or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the +// extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a +// particular purpose and non-infringement. + +#endregion // License + +namespace ANX.RenderSystem.Windows.DX11 +{ + public class DepthStencilState_DX11 : INativeDepthStencilState + { + #region Private Members + private DepthStencilStateDescription description; + private SharpDX.Direct3D11.DepthStencilState nativeDepthStencilState; + private bool nativeDepthStencilStateDirty; + private bool bound; + + private int referenceStencil; + + #endregion // Private Members + + public DepthStencilState_DX11() + { + this.description = new DepthStencilStateDescription(); + + this.nativeDepthStencilStateDirty = true; + } + + public void Apply(ANX.Framework.Graphics.GraphicsDevice graphicsDevice) + { + GraphicsDeviceWindowsDX11 gdx11 = graphicsDevice.NativeDevice as GraphicsDeviceWindowsDX11; + DeviceContext context = gdx11.NativeDevice; + + UpdateNativeDepthStencilState(context.Device); + this.bound = true; + + context.OutputMerger.SetDepthStencilState(nativeDepthStencilState, this.referenceStencil); + } + + public void Release() + { + this.bound = false; + } + + public void Dispose() + { + if (this.nativeDepthStencilState != null) + { + this.nativeDepthStencilState.Dispose(); + this.nativeDepthStencilState = null; + } + } + + public bool IsBound + { + get + { + return this.bound; + } + } + + public ANX.Framework.Graphics.StencilOperation CounterClockwiseStencilDepthBufferFail + { + set + { + SharpDX.Direct3D11.StencilOperation operation = FormatConverter.Translate(value); + + if (description.BackFace.DepthFailOperation != operation) + { + description.BackFace.DepthFailOperation = operation; + nativeDepthStencilStateDirty = true; + } + } + } + + public ANX.Framework.Graphics.StencilOperation CounterClockwiseStencilFail + { + set + { + SharpDX.Direct3D11.StencilOperation operation = FormatConverter.Translate(value); + + if (description.BackFace.FailOperation != operation) + { + description.BackFace.FailOperation = operation; + nativeDepthStencilStateDirty = true; + } + } + } + + public ANX.Framework.Graphics.CompareFunction CounterClockwiseStencilFunction + { + set + { + SharpDX.Direct3D11.Comparison comparison = FormatConverter.Translate(value); + + if (description.BackFace.Comparison != comparison) + { + description.BackFace.Comparison = comparison; + nativeDepthStencilStateDirty = true; + } + } + } + + public ANX.Framework.Graphics.StencilOperation CounterClockwiseStencilPass + { + set + { + SharpDX.Direct3D11.StencilOperation operation = FormatConverter.Translate(value); + + if (description.BackFace.PassOperation != operation) + { + description.BackFace.PassOperation = operation; + nativeDepthStencilStateDirty = true; + } + } + } + + public bool DepthBufferEnable + { + set + { + if (description.IsDepthEnabled != value) + { + description.IsDepthEnabled = value; + nativeDepthStencilStateDirty = true; + } + } + } + + public ANX.Framework.Graphics.CompareFunction DepthBufferFunction + { + set + { + SharpDX.Direct3D11.Comparison comparison = FormatConverter.Translate(value); + + if (description.DepthComparison != comparison) + { + description.DepthComparison = comparison; + nativeDepthStencilStateDirty = true; + } + } + } + + public bool DepthBufferWriteEnable + { + set + { + DepthWriteMask writeMask = value ? DepthWriteMask.All : DepthWriteMask.Zero; + + if (description.DepthWriteMask != writeMask) + { + description.DepthWriteMask = writeMask; + nativeDepthStencilStateDirty = true; + } + } + } + + public int ReferenceStencil + { + set + { + if (this.referenceStencil != value) + { + this.referenceStencil = value; + this.nativeDepthStencilStateDirty = true; + } + } + } + + public ANX.Framework.Graphics.StencilOperation StencilDepthBufferFail + { + set + { + SharpDX.Direct3D11.StencilOperation operation = FormatConverter.Translate(value); + + if (description.FrontFace.DepthFailOperation != operation) + { + description.FrontFace.DepthFailOperation = operation; + nativeDepthStencilStateDirty = true; + } + } + } + + public bool StencilEnable + { + set + { + if (description.IsStencilEnabled != value) + { + description.IsStencilEnabled = value; + nativeDepthStencilStateDirty = true; + } + } + } + + public ANX.Framework.Graphics.StencilOperation StencilFail + { + set + { + SharpDX.Direct3D11.StencilOperation operation = FormatConverter.Translate(value); + + if (description.FrontFace.FailOperation != operation) + { + description.FrontFace.FailOperation = operation; + nativeDepthStencilStateDirty = true; + } + } + } + + public ANX.Framework.Graphics.CompareFunction StencilFunction + { + set + { + SharpDX.Direct3D11.Comparison comparison = FormatConverter.Translate(value); + + if (description.FrontFace.Comparison != comparison) + { + description.FrontFace.Comparison = comparison; + nativeDepthStencilStateDirty = true; + } + } + } + + public int StencilMask + { + set + { + byte stencilMask = (byte)value; //TODO: check range + + if (description.StencilReadMask != stencilMask) + { + description.StencilReadMask = stencilMask; + nativeDepthStencilStateDirty = true; + } + } + } + + public ANX.Framework.Graphics.StencilOperation StencilPass + { + set + { + SharpDX.Direct3D11.StencilOperation operation = FormatConverter.Translate(value); + + if (description.FrontFace.PassOperation != operation) + { + description.FrontFace.PassOperation = operation; + nativeDepthStencilStateDirty = true; + } + } + } + + public int StencilWriteMask + { + set + { + byte stencilWriteMask = (byte)value; //TODO: check range + + if (description.StencilWriteMask != stencilWriteMask) + { + description.StencilWriteMask = stencilWriteMask; + nativeDepthStencilStateDirty = true; + } + } + } + + public bool TwoSidedStencilMode + { + set + { + //TODO: check if we really need this. in xna this enables only counter clockwise stencil operations + } + } + + private void UpdateNativeDepthStencilState(Device device) + { + if (this.nativeDepthStencilStateDirty == true || this.nativeDepthStencilState == null) + { + if (this.nativeDepthStencilState != null) + { + this.nativeDepthStencilState.Dispose(); + this.nativeDepthStencilState = null; + } + + this.nativeDepthStencilState = new SharpDX.Direct3D11.DepthStencilState(device, ref this.description); + + this.nativeDepthStencilStateDirty = false; + } + } + } +} diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectParameter_DX11.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectParameter_DX11.cs new file mode 100644 index 00000000..24054de2 --- /dev/null +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectParameter_DX11.cs @@ -0,0 +1,202 @@ +#region Using Statements +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ANX.Framework.NonXNA; +using SharpDX.Direct3D11; +using ANX.Framework.Graphics; +using ANX.Framework.NonXNA.RenderSystem; +using ANX.Framework; + +#endregion // Using Statements + +#region License + +// +// This file is part of the ANX.Framework created by the "ANX.Framework developer group". +// +// This file is released under the Ms-PL license. +// +// +// +// Microsoft Public License (Ms-PL) +// +// This license governs use of the accompanying software. If you use the software, you accept this license. +// If you do not accept the license, do not use the software. +// +// 1.Definitions +// The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning +// here as under U.S. copyright law. +// A "contribution" is the original software, or any additions or changes to the software. +// A "contributor" is any person that distributes its contribution under this license. +// "Licensed patents" are a contributor's patent claims that read directly on its contribution. +// +// 2.Grant of Rights +// (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations +// in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to +// reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution +// or any derivative works that you create. +// (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in +// section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed +// patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution +// in the software or derivative works of the contribution in the software. +// +// 3.Conditions and Limitations +// (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. +// (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your +// patent license from such contributor to the software ends automatically. +// (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution +// notices that are present in the software. +// (D) If you distribute any portion of the software in source code form, you may do so only under this license by including +// a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or +// object code form, you may only do so under a license that complies with this license. +// (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, +// or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the +// extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a +// particular purpose and non-infringement. + +#endregion // License + +namespace ANX.RenderSystem.Windows.DX11 +{ + public class EffectParameter_DX11 : INativeEffectParameter + { + private EffectVariable nativeEffectVariable; + + public EffectVariable NativeParameter + { + get + { + return this.nativeEffectVariable; + } + internal set + { + this.nativeEffectVariable = value; + } + } + + public void SetValue(bool value) + { + nativeEffectVariable.AsScalar().Set(value); + } + + public void SetValue(bool[] value) + { + nativeEffectVariable.AsScalar().Set(value); + } + + public void SetValue(int value) + { + nativeEffectVariable.AsScalar().Set(value); + } + + public void SetValue(int[] value) + { + nativeEffectVariable.AsScalar().Set(value); + } + + public void SetValue(Matrix value) + { + 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); + } + + public void SetValue(Matrix[] value) + { + int count = value.Length; + SharpDX.Matrix[] m = new SharpDX.Matrix[count]; + Matrix anxMatrix; + for (int i = 0; i < count; i++) + { + anxMatrix = value[i]; + m[i] = new SharpDX.Matrix(anxMatrix.M11, anxMatrix.M12, anxMatrix.M13, anxMatrix.M14, + anxMatrix.M21, anxMatrix.M22, anxMatrix.M23, anxMatrix.M24, + anxMatrix.M31, anxMatrix.M32, anxMatrix.M33, anxMatrix.M34, + anxMatrix.M41, anxMatrix.M42, anxMatrix.M43, anxMatrix.M44); + } + + nativeEffectVariable.AsMatrix().SetMatrix(m); + } + + public void SetValue(Quaternion value) + { + SharpDX.Vector4 q = new SharpDX.Vector4(value.X, value.Y, value.Z, value.W); + nativeEffectVariable.AsVector().Set(q); + } + + public void SetValue(Quaternion[] value) + { + int count = value.Length; + SharpDX.Vector4[] q = new SharpDX.Vector4[count]; + for (int i = 0; i < count; i++) + { + q[i] = new SharpDX.Vector4(value[i].X, value[i].Y, value[i].Z, value[i].W); + } + nativeEffectVariable.AsVector().Set(q); + } + + public void SetValue(float value) + { + nativeEffectVariable.AsScalar().Set(value); + } + + public void SetValue(float[] value) + { + nativeEffectVariable.AsScalar().Set(value); + } + + public void SetValue(Vector2 value) + { + SharpDX.Vector2 v = new SharpDX.Vector2(value.X, value.Y); + nativeEffectVariable.AsVector().Set(v); + } + + public void SetValue(Vector2[] value) + { + throw new NotImplementedException(); + } + + public void SetValue(Vector3 value) + { + SharpDX.Vector3 v = new SharpDX.Vector3(value.X, value.Y, value.Z); + nativeEffectVariable.AsVector().Set(v); + } + + public void SetValue(Vector3[] value) + { + throw new NotImplementedException(); + } + + public void SetValue(Vector4 value) + { + SharpDX.Vector4 v = new SharpDX.Vector4(value.X, value.Y, value.Z, value.W); + nativeEffectVariable.AsVector().Set(v); + } + + public void SetValue(Vector4[] value) + { + int count = value.Length; + SharpDX.Vector4[] q = new SharpDX.Vector4[count]; + for (int i = 0; i < count; i++) + { + q[i] = new SharpDX.Vector4(value[i].X, value[i].Y, value[i].Z, value[i].W); + } + nativeEffectVariable.AsVector().Set(q); + } + + public void SetValue(Texture value) + { + Texture2D_DX11 tex = value.NativeTexture as Texture2D_DX11; + nativeEffectVariable.AsShaderResource().SetResource(tex.NativeShaderResourceView); + } + + public string Name + { + get + { + return nativeEffectVariable.Description.Name; + } + } + } +} diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectPass_DX11.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectPass_DX11.cs new file mode 100644 index 00000000..fef02819 --- /dev/null +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectPass_DX11.cs @@ -0,0 +1,84 @@ +#region Using Statements +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ANX.Framework.NonXNA; +using SharpDX.Direct3D11; + +#endregion // Using Statements + +#region License + +// +// This file is part of the ANX.Framework created by the "ANX.Framework developer group". +// +// This file is released under the Ms-PL license. +// +// +// +// Microsoft Public License (Ms-PL) +// +// This license governs use of the accompanying software. If you use the software, you accept this license. +// If you do not accept the license, do not use the software. +// +// 1.Definitions +// The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning +// here as under U.S. copyright law. +// A "contribution" is the original software, or any additions or changes to the software. +// A "contributor" is any person that distributes its contribution under this license. +// "Licensed patents" are a contributor's patent claims that read directly on its contribution. +// +// 2.Grant of Rights +// (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations +// in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to +// reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution +// or any derivative works that you create. +// (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in +// section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed +// patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution +// in the software or derivative works of the contribution in the software. +// +// 3.Conditions and Limitations +// (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. +// (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your +// patent license from such contributor to the software ends automatically. +// (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution +// notices that are present in the software. +// (D) If you distribute any portion of the software in source code form, you may do so only under this license by including +// a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or +// object code form, you may only do so under a license that complies with this license. +// (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, +// or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the +// extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a +// particular purpose and non-infringement. + +#endregion // License + +namespace ANX.RenderSystem.Windows.DX11 +{ + public class EffectPass_DX11 : INativeEffectPass + { + private EffectPass nativePass; + + public EffectPass NativePass + { + get + { + return this.nativePass; + } + internal set + { + this.nativePass = value; + } + } + + public string Name + { + get + { + return nativePass.Description.Name; + } + } + } +} diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectTechnique_DX11.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectTechnique_DX11.cs new file mode 100644 index 00000000..65a8fd0f --- /dev/null +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectTechnique_DX11.cs @@ -0,0 +1,112 @@ +#region Using Statements +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ANX.Framework.NonXNA; +using SharpDX.Direct3D11; + +#endregion // Using Statements + +#region License + +// +// This file is part of the ANX.Framework created by the "ANX.Framework developer group". +// +// This file is released under the Ms-PL license. +// +// +// +// Microsoft Public License (Ms-PL) +// +// This license governs use of the accompanying software. If you use the software, you accept this license. +// If you do not accept the license, do not use the software. +// +// 1.Definitions +// The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning +// here as under U.S. copyright law. +// A "contribution" is the original software, or any additions or changes to the software. +// A "contributor" is any person that distributes its contribution under this license. +// "Licensed patents" are a contributor's patent claims that read directly on its contribution. +// +// 2.Grant of Rights +// (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations +// in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to +// reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution +// or any derivative works that you create. +// (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in +// section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed +// patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution +// in the software or derivative works of the contribution in the software. +// +// 3.Conditions and Limitations +// (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. +// (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your +// patent license from such contributor to the software ends automatically. +// (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution +// notices that are present in the software. +// (D) If you distribute any portion of the software in source code form, you may do so only under this license by including +// a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or +// object code form, you may only do so under a license that complies with this license. +// (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, +// or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the +// extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a +// particular purpose and non-infringement. + +#endregion // License + +namespace ANX.RenderSystem.Windows.DX11 +{ + public class EffectTechnique_DX11 : INativeEffectTechnique + { + private EffectTechnique nativeTechnique; + private ANX.Framework.Graphics.Effect parentEffect; + + internal EffectTechnique_DX11(ANX.Framework.Graphics.Effect parentEffect) + { + if (parentEffect == null) + { + throw new ArgumentNullException("parentEffect"); + } + + this.parentEffect = parentEffect; + } + + public EffectTechnique NativeTechnique + { + get + { + return this.nativeTechnique; + } + internal set + { + this.nativeTechnique = value; + } + } + + public string Name + { + get + { + return nativeTechnique.Description.Name; + } + } + + + public IEnumerable Passes + { + get + { + for (int i = 0; i < nativeTechnique.Description.PassCount; i++) + { + EffectPass_DX11 passDx11 = new EffectPass_DX11(); + passDx11.NativePass = nativeTechnique.GetPassByIndex(i); + + ANX.Framework.Graphics.EffectPass pass = new ANX.Framework.Graphics.EffectPass(this.parentEffect); + + yield return pass; + } + } + } + } +} diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/Effect_DX11.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/Effect_DX11.cs index b38cd071..932099b9 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX11/Effect_DX11.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/Effect_DX11.cs @@ -66,12 +66,18 @@ namespace ANX.RenderSystem.Windows.DX11 private ShaderBytecode vertexShaderByteCode; private VertexShader vertexShader; private PixelShader pixelShader; - + private ANX.Framework.Graphics.Effect managedEffect; private ShaderBytecode effectByteCode; private SharpDX.Direct3D11.Effect nativeEffect; - public Effect_DX11(GraphicsDevice device, Stream vertexShaderByteCode, Stream pixelShaderByteCode) + public Effect_DX11(GraphicsDevice device, ANX.Framework.Graphics.Effect managedEffect, Stream vertexShaderByteCode, Stream pixelShaderByteCode) { + if (this.managedEffect == null) + { + throw new ArgumentNullException("managedEffect"); + } + this.managedEffect = managedEffect; + if (vertexShaderByteCode.CanSeek) { vertexShaderByteCode.Seek(0, SeekOrigin.Begin); @@ -87,14 +93,20 @@ namespace ANX.RenderSystem.Windows.DX11 this.pixelShader = new PixelShader((SharpDX.Direct3D11.Device)device.NativeDevice, this.pixelShaderByteCode); } - public Effect_DX11(GraphicsDevice device, Stream effectByteCode) + public Effect_DX11(GraphicsDevice device, ANX.Framework.Graphics.Effect managedEffect, Stream effectByteCode) { + if (managedEffect == null) + { + throw new ArgumentNullException("managedEffect"); + } + this.managedEffect = managedEffect; + if (effectByteCode.CanSeek) { effectByteCode.Seek(0, SeekOrigin.Begin); } this.effectByteCode = ShaderBytecode.FromStream(effectByteCode); - this.nativeEffect = new SharpDX.Direct3D11.Effect(((GraphicsDeviceWindowsDX11)device.NativeDevice).NativeDevice, this.effectByteCode); + this.nativeEffect = new SharpDX.Direct3D11.Effect(((GraphicsDeviceWindowsDX11)device.NativeDevice).NativeDevice.Device, this.effectByteCode); } public void Apply(GraphicsDevice graphicsDevice) @@ -209,20 +221,17 @@ namespace ANX.RenderSystem.Windows.DX11 public IEnumerable Techniques { - get + get { - throw new NotImplementedException(); + for (int i = 0; i < nativeEffect.Description.TechniqueCount; i++) + { + EffectTechnique_DX11 teqDx11 = new EffectTechnique_DX11(this.managedEffect); + teqDx11.NativeTechnique = nativeEffect.GetTechniqueByIndex(i); - //for (int i = 0; i < nativeEffect.Description.TechniqueCount; i++) - //{ - // EffectTechnique_DX11 teqDx11 = new EffectTechnique_DX11(); - // teqDx10.NativeTechnique = nativeEffect.GetTechniqueByIndex(i); + ANX.Framework.Graphics.EffectTechnique teq = new ANX.Framework.Graphics.EffectTechnique(this.managedEffect, teqDx11); - // ANX.Framework.Graphics.EffectTechnique teq = new ANX.Framework.Graphics.EffectTechnique(); - // teq.NativeTechnique = teqDx11; - - // yield return teq; - //} + yield return teq; + } } } @@ -230,18 +239,16 @@ namespace ANX.RenderSystem.Windows.DX11 { get { - throw new NotImplementedException(); + for (int i = 0; i < nativeEffect.Description.GlobalVariableCount; i++) + { + EffectParameter_DX11 parDx11 = new EffectParameter_DX11(); + parDx11.NativeParameter = nativeEffect.GetVariableByIndex(i); - //for (int i = 0; i < nativeEffect.Description.GlobalVariableCount; i++) - //{ - // EffectParameter_DX10 parDx10 = new EffectParameter_DX10(); - // parDx10.NativeParameter = nativeEffect.GetVariableByIndex(i); + ANX.Framework.Graphics.EffectParameter par = new ANX.Framework.Graphics.EffectParameter(); + par.NativeParameter = parDx11; - // Graphics.EffectParameter par = new Graphics.EffectParameter(); - // par.NativeParameter = parDx10; - - // yield return par; - //} + yield return par; + } } } } diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/FormatConverter.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/FormatConverter.cs new file mode 100644 index 00000000..007f10f4 --- /dev/null +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/FormatConverter.cs @@ -0,0 +1,387 @@ +#region Using Statements +using System; +using ANX.Framework.Graphics; +using SharpDX.Direct3D11; +using SharpDX.Direct3D; +using SharpDX.DXGI; + +#endregion // Using Statements + +#region License + +// +// This file is part of the ANX.Framework created by the "ANX.Framework developer group". +// +// This file is released under the Ms-PL license. +// +// +// +// Microsoft Public License (Ms-PL) +// +// This license governs use of the accompanying software. If you use the software, you accept this license. +// If you do not accept the license, do not use the software. +// +// 1.Definitions +// The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning +// here as under U.S. copyright law. +// A "contribution" is the original software, or any additions or changes to the software. +// A "contributor" is any person that distributes its contribution under this license. +// "Licensed patents" are a contributor's patent claims that read directly on its contribution. +// +// 2.Grant of Rights +// (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations +// in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to +// reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution +// or any derivative works that you create. +// (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in +// section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed +// patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution +// in the software or derivative works of the contribution in the software. +// +// 3.Conditions and Limitations +// (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. +// (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your +// patent license from such contributor to the software ends automatically. +// (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution +// notices that are present in the software. +// (D) If you distribute any portion of the software in source code form, you may do so only under this license by including +// a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or +// object code form, you may only do so under a license that complies with this license. +// (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, +// or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the +// extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a +// particular purpose and non-infringement. + +#endregion // License + +namespace ANX.RenderSystem.Windows.DX11 +{ + internal class FormatConverter + { + + public static int FormatSize(SurfaceFormat format) + { + switch (format) + { + case SurfaceFormat.Vector4: + return 16; + //case SurfaceFormat.Vector3: + // return 12; + case SurfaceFormat.Vector2: + return 8; + case SurfaceFormat.Single: + case SurfaceFormat.Color: + //case SurfaceFormat.RGBA1010102: + //case SurfaceFormat.RG32: + return 4; + //case SurfaceFormat.BGR565: + //case SurfaceFormat.BGRA5551: + // return 2; + case SurfaceFormat.Dxt1: + case SurfaceFormat.Dxt3: + case SurfaceFormat.Dxt5: + case SurfaceFormat.Alpha8: + return 1; + default: + throw new ArgumentException("Invalid format"); + } + } + + public static SharpDX.DXGI.Format Translate(SurfaceFormat surfaceFormat) + { + switch (surfaceFormat) + { + case SurfaceFormat.Color: + return SharpDX.DXGI.Format.R8G8B8A8_UNorm; + case SurfaceFormat.Dxt3: + return SharpDX.DXGI.Format.BC2_UNorm; + case SurfaceFormat.Dxt5: + return SharpDX.DXGI.Format.BC3_UNorm; + } + + throw new Exception("can't translate SurfaceFormat: " + surfaceFormat.ToString()); + } + + public static Format Translate(ANX.Framework.Graphics.DepthFormat depthFormat) + { + switch (depthFormat) + { + case DepthFormat.Depth16: + return Format.D16_UNorm; + case DepthFormat.Depth24: + //TODO: no DirectX10 24Bit depth format??? + case DepthFormat.Depth24Stencil8: + return Format.D24_UNorm_S8_UInt; + case DepthFormat.None: + return Format.Unknown; + } + + throw new Exception("can't translate DepthFormat: " + depthFormat.ToString()); + } + + public static SurfaceFormat Translate(SharpDX.DXGI.Format format) + { + switch (format) + { + case SharpDX.DXGI.Format.R8G8B8A8_UNorm: + return SurfaceFormat.Color; + case SharpDX.DXGI.Format.BC2_UNorm: + return SurfaceFormat.Dxt3; + case SharpDX.DXGI.Format.BC3_UNorm: + return SurfaceFormat.Dxt5; + } + + throw new Exception("can't translate Format: " + format.ToString()); + } + + public static Filter Translate(TextureFilter filter) + { + switch (filter) + { + case TextureFilter.Anisotropic: + return Filter.Anisotropic; + case TextureFilter.Linear: + return Filter.MinMagMipLinear; + case TextureFilter.LinearMipPoint: + return Filter.MinMagMipPoint; + case TextureFilter.MinLinearMagPointMipLinear: + return Filter.MinLinearMagPointMipLinear; + case TextureFilter.MinLinearMagPointMipPoint: + return Filter.MinLinearMagMipPoint; + case TextureFilter.MinPointMagLinearMipLinear: + return Filter.MinPointMagMipLinear; + case TextureFilter.MinPointMagLinearMipPoint: + return Filter.MinPointMagLinearMipPoint; + case TextureFilter.Point: + return Filter.MinMagMipPoint; + case TextureFilter.PointMipLinear: + return Filter.MinMagPointMipLinear; + } + + throw new NotImplementedException(); + } + + public static SharpDX.Direct3D11.TextureAddressMode Translate(ANX.Framework.Graphics.TextureAddressMode addressMode) + { + switch (addressMode) + { + case ANX.Framework.Graphics.TextureAddressMode.Clamp: + return SharpDX.Direct3D11.TextureAddressMode.Clamp; + case ANX.Framework.Graphics.TextureAddressMode.Mirror: + return SharpDX.Direct3D11.TextureAddressMode.Mirror; + case ANX.Framework.Graphics.TextureAddressMode.Wrap: + return SharpDX.Direct3D11.TextureAddressMode.Wrap; + } + + return SharpDX.Direct3D11.TextureAddressMode.Clamp; + } + + public static PrimitiveTopology Translate(PrimitiveType primitiveType) + { + switch (primitiveType) + { + case PrimitiveType.LineList: + return PrimitiveTopology.LineList; + case PrimitiveType.LineStrip: + return PrimitiveTopology.LineStrip; + case PrimitiveType.TriangleList: + return PrimitiveTopology.TriangleList; + case PrimitiveType.TriangleStrip: + return PrimitiveTopology.TriangleStrip; + default: + throw new InvalidOperationException("unknown PrimitiveType: " + primitiveType.ToString()); + } + } + + public static SharpDX.DXGI.Format Translate(IndexElementSize indexElementSize) + { + switch (indexElementSize) + { + case IndexElementSize.SixteenBits: + return Format.R16_UInt; + case IndexElementSize.ThirtyTwoBits: + return Format.R32_UInt; + default: + throw new InvalidOperationException("unknown IndexElementSize: " + indexElementSize.ToString()); + } + } + + public static string Translate(VertexElementUsage usage) + { + //TODO: map the other Usages + if (usage == VertexElementUsage.TextureCoordinate) + { + return "TEXCOORD"; + } + else + { + return usage.ToString().ToUpperInvariant(); + } + } + + public static BlendOperation Translate(BlendFunction blendFunction) + { + switch (blendFunction) + { + case BlendFunction.Add: + return BlendOperation.Add; + case BlendFunction.Max: + return BlendOperation.Maximum; + case BlendFunction.Min: + return BlendOperation.Minimum; + case BlendFunction.ReverseSubtract: + return BlendOperation.ReverseSubtract; + case BlendFunction.Subtract: + return BlendOperation.Subtract; + } + + throw new NotImplementedException(); + } + + public static BlendOption Translate(Blend blend) + { + switch (blend) + { + case Blend.BlendFactor: + return BlendOption.BlendFactor; + case Blend.DestinationAlpha: + return BlendOption.DestinationAlpha; + case Blend.DestinationColor: + return BlendOption.DestinationColor; + case Blend.InverseBlendFactor: + return BlendOption.InverseBlendFactor; + case Blend.InverseDestinationAlpha: + return BlendOption.InverseDestinationAlpha; + case Blend.InverseDestinationColor: + return BlendOption.InverseDestinationColor; + case Blend.InverseSourceAlpha: + return BlendOption.InverseSourceAlpha; + case Blend.InverseSourceColor: + return BlendOption.InverseSourceColor; + case Blend.One: + return BlendOption.One; + case Blend.SourceAlpha: + return BlendOption.SourceAlpha; + case Blend.SourceAlphaSaturation: + return BlendOption.SourceAlphaSaturate; + case Blend.SourceColor: + return BlendOption.SourceColor; + case Blend.Zero: + return BlendOption.Zero; + } + + throw new NotImplementedException(); + } + + public static ColorWriteMaskFlags Translate(ColorWriteChannels colorWriteChannels) + { + ColorWriteMaskFlags mask = 0; + + if ((colorWriteChannels & ColorWriteChannels.All) == ColorWriteChannels.All) + { + mask |= ColorWriteMaskFlags.All; + } + + if ((colorWriteChannels & ColorWriteChannels.Alpha) == ColorWriteChannels.Alpha) + { + mask |= ColorWriteMaskFlags.Alpha; + } + + if ((colorWriteChannels & ColorWriteChannels.Blue) == ColorWriteChannels.Blue) + { + mask |= ColorWriteMaskFlags.Blue; + } + + if ((colorWriteChannels & ColorWriteChannels.Green) == ColorWriteChannels.Green) + { + mask |= ColorWriteMaskFlags.Green; + } + + if ((colorWriteChannels & ColorWriteChannels.Red) == ColorWriteChannels.Red) + { + mask |= ColorWriteMaskFlags.Red; + } + + return mask; + } + + public static SharpDX.Direct3D11.StencilOperation Translate(ANX.Framework.Graphics.StencilOperation stencilOperation) + { + switch (stencilOperation) + { + case ANX.Framework.Graphics.StencilOperation.Decrement: + return SharpDX.Direct3D11.StencilOperation.Decrement; + case ANX.Framework.Graphics.StencilOperation.DecrementSaturation: + return SharpDX.Direct3D11.StencilOperation.DecrementAndClamp; + case ANX.Framework.Graphics.StencilOperation.Increment: + return SharpDX.Direct3D11.StencilOperation.Increment; + case ANX.Framework.Graphics.StencilOperation.IncrementSaturation: + return SharpDX.Direct3D11.StencilOperation.IncrementAndClamp; + case ANX.Framework.Graphics.StencilOperation.Invert: + return SharpDX.Direct3D11.StencilOperation.Invert; + case ANX.Framework.Graphics.StencilOperation.Keep: + return SharpDX.Direct3D11.StencilOperation.Keep; + case ANX.Framework.Graphics.StencilOperation.Replace: + return SharpDX.Direct3D11.StencilOperation.Replace; + case ANX.Framework.Graphics.StencilOperation.Zero: + return SharpDX.Direct3D11.StencilOperation.Zero; + } + + throw new NotImplementedException("unknown StencilOperation"); + } + + public static Comparison Translate(ANX.Framework.Graphics.CompareFunction compareFunction) + { + switch (compareFunction) + { + case ANX.Framework.Graphics.CompareFunction.Always: + return Comparison.Always; + case ANX.Framework.Graphics.CompareFunction.Equal: + return Comparison.Equal; + case ANX.Framework.Graphics.CompareFunction.Greater: + return Comparison.Greater; + case ANX.Framework.Graphics.CompareFunction.GreaterEqual: + return Comparison.GreaterEqual; + case ANX.Framework.Graphics.CompareFunction.Less: + return Comparison.Less; + case ANX.Framework.Graphics.CompareFunction.LessEqual: + return Comparison.LessEqual; + case ANX.Framework.Graphics.CompareFunction.Never: + return Comparison.Never; + case ANX.Framework.Graphics.CompareFunction.NotEqual: + return Comparison.NotEqual; + } + + throw new NotImplementedException("unknown CompareFunction"); + } + + public static SharpDX.Direct3D11.CullMode Translate(ANX.Framework.Graphics.CullMode cullMode) + { + if (cullMode == ANX.Framework.Graphics.CullMode.CullClockwiseFace) + { + return SharpDX.Direct3D11.CullMode.Front; + } + else if (cullMode == ANX.Framework.Graphics.CullMode.CullCounterClockwiseFace) + { + return SharpDX.Direct3D11.CullMode.Back; + } + else + { + return SharpDX.Direct3D11.CullMode.None; + } + } + + public static SharpDX.Direct3D11.FillMode Translate(ANX.Framework.Graphics.FillMode fillMode) + { + if (fillMode == ANX.Framework.Graphics.FillMode.WireFrame) + { + return SharpDX.Direct3D11.FillMode.Wireframe; + } + else + { + return SharpDX.Direct3D11.FillMode.Solid; + } + } + + } +} diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/GraphicsDeviceWindowsDX11.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/GraphicsDeviceWindowsDX11.cs index 03860877..e855e881 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX11/GraphicsDeviceWindowsDX11.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/GraphicsDeviceWindowsDX11.cs @@ -6,11 +6,10 @@ using System.Text; using SharpDX; using SharpDX.DXGI; using SharpDX.Direct3D; -using ANX.Framework.NonXNA; -using ANX.Framework.Graphics; -using SharpDX.Direct3D11; -using ANX.Framework; using SharpDX.D3DCompiler; +using ANX.Framework.NonXNA; +using SharpDX.Direct3D11; +using ANX.Framework.Graphics; #endregion // Using Statements @@ -63,27 +62,67 @@ using SharpDX.D3DCompiler; using Device = SharpDX.Direct3D11.Device; using Buffer = SharpDX.Direct3D11.Buffer; +using System.Runtime.InteropServices; +using ANX.Framework; namespace ANX.RenderSystem.Windows.DX11 { public class GraphicsDeviceWindowsDX11 : INativeGraphicsDevice - { - private Device device; - private SwapChain swapChain; + { + #region Constants + private const float ColorMultiplier = 1f / 255f; + #endregion + + #region Interop + [DllImport("user32.dll")] + private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int width, int height, uint uFlags); + + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); + + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect); + + [StructLayout(LayoutKind.Sequential)] + public struct RECT + { + public int Left; // x position of upper-left corner + public int Top; // y position of upper-left corner + public int Right; // x position of lower-right corner + public int Bottom; // y position of lower-right corner + } + + #endregion + + #region Private Members + private DeviceContext deviceContext; + private SwapChain swapChain; private RenderTargetView renderView; + private RenderTargetView renderTargetView; + private DepthStencilView depthStencilView; + private SharpDX.Direct3D11.Texture2D depthStencilBuffer; private SharpDX.Direct3D11.Texture2D backBuffer; internal Effect_DX11 currentEffect; private VertexBuffer currentVertexBuffer; private IndexBuffer currentIndexBuffer; private SharpDX.Direct3D11.Viewport currentViewport; + private uint lastClearColor; + private SharpDX.Color4 clearColor; + private bool vSyncEnabled; + + #endregion // Private Members public GraphicsDeviceWindowsDX11(PresentationParameters presentationParameters) { + this.vSyncEnabled = true; + // SwapChain description var desc = new SwapChainDescription() { BufferCount = 1, - ModeDescription = new ModeDescription(presentationParameters.BackBufferWidth, presentationParameters.BackBufferHeight, new Rational(60, 1), Format.R8G8B8A8_UNorm), + ModeDescription = new ModeDescription(presentationParameters.BackBufferWidth, presentationParameters.BackBufferHeight, new Rational(60, 1), FormatConverter.Translate(presentationParameters.BackBufferFormat)), IsWindowed = true, OutputHandle = presentationParameters.DeviceWindowHandle, SampleDescription = new SampleDescription(1, 0), @@ -92,40 +131,222 @@ namespace ANX.RenderSystem.Windows.DX11 }; // Create Device and SwapChain + Device dxDevice; #if DIRECTX_DEBUG_LAYER // http://msdn.microsoft.com/en-us/library/windows/desktop/bb205068(v=vs.85).aspx - Device.CreateWithSwapChain(SharpDX.Direct3D10.DriverType.Hardware, DeviceCreationFlags.Debug, desc, out device, out swapChain); + Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.Debug, desc, out dxDevice, out swapChain); #else - Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.None, desc, out device, out swapChain); + Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.None, desc, out dxDevice, out swapChain); #endif + this.deviceContext = new DeviceContext(dxDevice); // Ignore all windows events Factory factory = swapChain.GetParent(); factory.MakeWindowAssociation(presentationParameters.DeviceWindowHandle, WindowAssociationFlags.IgnoreAll); + ResizeRenderWindow(presentationParameters); + // New RenderTargetView from the backbuffer backBuffer = SharpDX.Direct3D11.Texture2D.FromSwapChain(swapChain, 0); - renderView = new RenderTargetView(device, backBuffer); + renderView = new RenderTargetView(deviceContext.Device, backBuffer); currentViewport = new SharpDX.Direct3D11.Viewport(0, 0, presentationParameters.BackBufferWidth, presentationParameters.BackBufferHeight); + + // + // create the depth stencil buffer + // + Format depthFormat = FormatConverter.Translate(presentationParameters.DepthStencilFormat); + if (depthFormat != Format.Unknown) + { + CreateDepthStencilBuffer(depthFormat); + } } + private void CreateDepthStencilBuffer(Format depthFormat) + { + if (this.depthStencilBuffer != null && + this.depthStencilBuffer.Description.Format == depthFormat && + this.depthStencilBuffer.Description.Width == this.backBuffer.Description.Width && + this.depthStencilBuffer.Description.Height == this.backBuffer.Description.Height) + { + // a DepthStencilBuffer with the right format and the right size already exists -> nothing to do + return; + } + + if (this.depthStencilView != null) + { + this.depthStencilView.Dispose(); + this.depthStencilView = null; + } + + if (this.depthStencilBuffer != null) + { + this.depthStencilBuffer.Dispose(); + this.depthStencilBuffer = null; + } + + if (depthFormat == Format.Unknown) + { + // no DepthStencilBuffer to create... Old one was disposed already... + return; + } + + DepthStencilViewDescription depthStencilViewDesc = new DepthStencilViewDescription() + { + Format = depthFormat, + }; + + Texture2DDescription depthStencilTextureDesc = new Texture2DDescription() + { + Width = this.backBuffer.Description.Width, + Height = this.backBuffer.Description.Height, + MipLevels = 1, + ArraySize = 1, + Format = depthFormat, + SampleDescription = new SampleDescription(1, 0), + Usage = ResourceUsage.Default, + BindFlags = BindFlags.DepthStencil, + CpuAccessFlags = CpuAccessFlags.None, + OptionFlags = ResourceOptionFlags.None + }; + this.depthStencilBuffer = new SharpDX.Direct3D11.Texture2D(deviceContext.Device, depthStencilTextureDesc); + + this.depthStencilView = new DepthStencilView(deviceContext.Device, this.depthStencilBuffer); + + Clear(ClearOptions.DepthBuffer | ClearOptions.Stencil, ANX.Framework.Vector4.Zero, 1.0f, 0); //TODO: this workaround is working but maybe not the best solution to issue #472 + } + + #region Clear public void Clear(ref Color color) { - throw new NotImplementedException(); - //device.ClearRenderTargetView(renderView, new SharpDX.Color4(color.A / 255f, color.R / 255f, color.G / 255f, color.B / 255f)); + uint newClearColor = color.PackedValue; + if (lastClearColor != newClearColor) + { + lastClearColor = newClearColor; + clearColor.Red = color.R * ColorMultiplier; + clearColor.Green = color.G * ColorMultiplier; + clearColor.Blue = color.B * ColorMultiplier; + clearColor.Alpha = color.A * ColorMultiplier; + } + + this.deviceContext.ClearRenderTargetView(this.renderTargetView != null ? this.renderTargetView : this.renderView, this.clearColor); } + public void Clear(ClearOptions options, ANX.Framework.Vector4 color, float depth, int stencil) + { + if ((options & ClearOptions.Target) == ClearOptions.Target) + { + // Clear a RenderTarget (or BackBuffer) + + this.clearColor.Red = color.X; + this.clearColor.Green = color.Y; + this.clearColor.Blue = color.Z; + this.clearColor.Alpha = color.W; + this.lastClearColor = 0; + + this.deviceContext.ClearRenderTargetView(this.renderTargetView != null ? this.renderTargetView : this.renderView, this.clearColor); + } + + if (this.depthStencilView != null) + { + if ((options | ClearOptions.Stencil | ClearOptions.DepthBuffer) == options) + { + // Clear the stencil buffer + deviceContext.ClearDepthStencilView(this.depthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, depth, (byte)stencil); + } + else if ((options | ClearOptions.Stencil) == options) + { + deviceContext.ClearDepthStencilView(this.depthStencilView, DepthStencilClearFlags.Stencil, depth, (byte)stencil); + } + else + { + deviceContext.ClearDepthStencilView(this.depthStencilView, DepthStencilClearFlags.Depth, depth, (byte)stencil); + } + } + } + + #endregion + + #region Present public void Present() { - swapChain.Present(0, PresentFlags.None); + swapChain.Present(this.vSyncEnabled ? 1 : 0, PresentFlags.None); } - internal Device NativeDevice + #endregion // Present + + #region DrawPrimitives & DrawIndexedPrimitives + public void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount) + { + SharpDX.Direct3D11.EffectPass pass; SharpDX.Direct3D11.EffectTechnique technique; ShaderBytecode passSignature; + SetupEffectForDraw(out pass, out technique, out passSignature); + + SetupInputLayout(passSignature); + + // Prepare All the stages + deviceContext.InputAssembler.PrimitiveTopology = FormatConverter.Translate(primitiveType); + deviceContext.Rasterizer.SetViewports(currentViewport); + + deviceContext.OutputMerger.SetTargets(this.depthStencilView, this.renderView); + + for (int i = 0; i < technique.Description.PassCount; ++i) + { + pass.Apply(deviceContext); + deviceContext.DrawIndexed(CalculateVertexCount(primitiveType, primitiveCount), startIndex, baseVertex); + } + } + + public void DrawPrimitives(PrimitiveType primitiveType, int vertexOffset, int primitiveCount) + { + SharpDX.Direct3D11.EffectPass pass; SharpDX.Direct3D11.EffectTechnique technique; ShaderBytecode passSignature; + SetupEffectForDraw(out pass, out technique, out passSignature); + + SetupInputLayout(passSignature); + + // Prepare All the stages + deviceContext.InputAssembler.PrimitiveTopology = FormatConverter.Translate(primitiveType); + deviceContext.Rasterizer.SetViewports(currentViewport); + + deviceContext.OutputMerger.SetTargets(this.depthStencilView, this.renderView); + + for (int i = 0; i < technique.Description.PassCount; ++i) + { + pass.Apply(deviceContext); + deviceContext.Draw(primitiveCount, vertexOffset); + } + } + + #endregion // DrawPrimitives & DrawIndexedPrimitives + + #region DrawInstancedPrimitives + public void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, int instanceCount) + { + throw new NotImplementedException(); + } + + #endregion // DrawInstancedPrimitives + + #region DrawUserIndexedPrimitives + public void DrawUserIndexedPrimitives(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int numVertices, Array indexData, int indexOffset, int primitiveCount, VertexDeclaration vertexDeclaration, IndexElementSize indexFormat) where T : struct, IVertexType + { + throw new NotImplementedException(); + } + + #endregion // DrawUserIndexedPrimitives + + #region DrawUserPrimitives + public void DrawUserPrimitives(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int primitiveCount, VertexDeclaration vertexDeclaration) where T : struct, IVertexType + { + throw new NotImplementedException(); + } + + #endregion // DrawUserPrimitives + + internal DeviceContext NativeDevice { get { - return this.device; + return this.deviceContext; } } @@ -147,11 +368,9 @@ namespace ANX.RenderSystem.Windows.DX11 // get the VertexDeclaration from current VertexBuffer to create input layout for the input assembler //TODO: check for null and throw exception VertexDeclaration vertexDeclaration = currentVertexBuffer.VertexDeclaration; - var layout = CreateInputLayout(device, passSignature, vertexDeclaration); + var layout = CreateInputLayout(deviceContext.Device, passSignature, vertexDeclaration); - throw new NotImplementedException(); - - //device.InputAssembler.InputLayout = layout; + deviceContext.InputAssembler.InputLayout = layout; } private int CalculateVertexCount(PrimitiveType type, int primitiveCount) @@ -178,49 +397,6 @@ namespace ANX.RenderSystem.Windows.DX11 } } - public void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount) - { - SharpDX.Direct3D11.EffectPass pass; SharpDX.Direct3D11.EffectTechnique technique; ShaderBytecode passSignature; - SetupEffectForDraw(out pass, out technique, out passSignature); - - SetupInputLayout(passSignature); - - throw new NotImplementedException(); - - // Prepare All the stages - //device.InputAssembler.PrimitiveTopology = Translate(primitiveType); - //device.Rasterizer.SetViewports(currentViewport); - - //device.OutputMerger.SetTargets(this.renderView); - - //for (int i = 0; i < technique.Description.PassCount; ++i) - //{ - // pass.Apply(); - // device.DrawIndexed(CalculateVertexCount(primitiveType, primitiveCount), startIndex, baseVertex); - //} - } - - public void DrawPrimitives(PrimitiveType primitiveType, int vertexOffset, int primitiveCount) - { - SharpDX.Direct3D11.EffectPass pass; SharpDX.Direct3D11.EffectTechnique technique; ShaderBytecode passSignature; - SetupEffectForDraw(out pass, out technique, out passSignature); - - SetupInputLayout(passSignature); - - throw new NotImplementedException(); - - // Prepare All the stages - //device.InputAssembler.PrimitiveTopology = Translate(primitiveType); - //device.Rasterizer.SetViewports(currentViewport); - //device.OutputMerger.SetTargets(this.renderView); - - //for (int i = 0; i < technique.Description.PassCount; ++i) - //{ - // pass.Apply(); - // device.Draw(primitiveCount, vertexOffset); - //} - } - public void SetIndexBuffer(IndexBuffer indexBuffer) { if (indexBuffer == null) @@ -230,23 +406,44 @@ namespace ANX.RenderSystem.Windows.DX11 this.currentIndexBuffer = indexBuffer; - throw new NotImplementedException(); + IndexBuffer_DX11 nativeIndexBuffer = indexBuffer.NativeIndexBuffer as IndexBuffer_DX11; - //IndexBuffer_DX11 nativeIndexBuffer = indexBuffer.NativeIndexBuffer as IndexBuffer_DX11; - - //if (nativeIndexBuffer != null) - //{ - // device.InputAssembler.SetIndexBuffer(nativeIndexBuffer.NativeBuffer, Translate(indexBuffer.IndexElementSize), 0); - //} - //else - //{ - // throw new Exception("couldn't fetch native DirectX11.1 IndexBuffer"); - //} + if (nativeIndexBuffer != null) + { + deviceContext.InputAssembler.SetIndexBuffer(nativeIndexBuffer.NativeBuffer, FormatConverter.Translate(indexBuffer.IndexElementSize), 0); + } + else + { + throw new Exception("couldn't fetch native DirectX10 IndexBuffer"); + } } public void SetVertexBuffers(ANX.Framework.Graphics.VertexBufferBinding[] vertexBuffers) { - throw new NotImplementedException(); + if (vertexBuffers == null) + { + throw new ArgumentNullException("vertexBuffers"); + } + + this.currentVertexBuffer = vertexBuffers[0].VertexBuffer; //TODO: hmmmmm, not nice :-) + + SharpDX.Direct3D11.VertexBufferBinding[] nativeVertexBufferBindings = new SharpDX.Direct3D11.VertexBufferBinding[vertexBuffers.Length]; + for (int i = 0; i < vertexBuffers.Length; i++) + { + ANX.Framework.Graphics.VertexBufferBinding anxVertexBufferBinding = vertexBuffers[i]; + VertexBuffer_DX11 nativeVertexBuffer = anxVertexBufferBinding.VertexBuffer.NativeVertexBuffer as VertexBuffer_DX11; + + if (nativeVertexBuffer != null) + { + nativeVertexBufferBindings[i] = new SharpDX.Direct3D11.VertexBufferBinding(nativeVertexBuffer.NativeBuffer, anxVertexBufferBinding.VertexBuffer.VertexDeclaration.VertexStride, anxVertexBufferBinding.VertexOffset); + } + else + { + throw new Exception("couldn't fetch native DirectX10 VertexBuffer"); + } + } + + deviceContext.InputAssembler.SetVertexBuffers(0, nativeVertexBufferBindings); } public void SetViewport(ANX.Framework.Graphics.Viewport viewport) @@ -254,126 +451,6 @@ namespace ANX.RenderSystem.Windows.DX11 this.currentViewport = new SharpDX.Direct3D11.Viewport(viewport.X, viewport.Y, viewport.Width, viewport.Height, viewport.MinDepth, viewport.MaxDepth); } - public void ApplyStateObject(ANX.Framework.Graphics.BlendState blendState) - { - throw new NotImplementedException(); - - //BlendStateDescription description = new BlendStateDescription(); - //description.AlphaBlendOperation = Translate(blendState.AlphaBlendFunction); - //description.BlendOperation = Translate(blendState.ColorBlendFunction); - //description.DestinationAlphaBlend = Translate(blendState.AlphaDestinationBlend); - //description.DestinationBlend = Translate(blendState.ColorDestinationBlend); - - //for (int i = 0; i < 4; i++) - //{ - // description.IsBlendEnabled[i] = true; - //} - - //description.RenderTargetWriteMask[0] = Translate(blendState.ColorWriteChannels); - //description.RenderTargetWriteMask[1] = Translate(blendState.ColorWriteChannels1); - //description.RenderTargetWriteMask[2] = Translate(blendState.ColorWriteChannels2); - //description.RenderTargetWriteMask[3] = Translate(blendState.ColorWriteChannels3); - - //description.SourceAlphaBlend = Translate(blendState.AlphaSourceBlend); - //description.SourceBlend = Translate(blendState.ColorSourceBlend); - - //SharpDX.Direct3D11.BlendState nativeBlendState = new SharpDX.Direct3D11.BlendState(device, description); - - //Vector4 tempVector = blendState.BlendFactor.ToVector4(); - //SharpDX.Color4 blendFactor = new Color4(tempVector.X, tempVector.Y, tempVector.Z, tempVector.W); - //device.OutputMerger.SetBlendState(nativeBlendState, blendFactor, blendState.MultiSampleMask); - } - - public void ApplyStateObject(ANX.Framework.Graphics.RasterizerState rasterizerState) - { - RasterizerStateDescription description = new RasterizerStateDescription(); - description.CullMode = Translate(rasterizerState.CullMode); - description.DepthBias = (int)rasterizerState.DepthBias; //TODO: this looks wrong!!! - description.IsScissorEnabled = rasterizerState.ScissorTestEnable; - description.SlopeScaledDepthBias = rasterizerState.SlopeScaleDepthBias; - description.IsMultisampleEnabled = rasterizerState.MultiSampleAntiAlias; - description.FillMode = Translate(rasterizerState.FillMode); - - description.IsAntialiasedLineEnabled = false; //TODO: this should be ok - - SharpDX.Direct3D11.RasterizerState nativeRasterizerState = new SharpDX.Direct3D11.RasterizerState(device, description); - - //device.Rasterizer.State = nativeRasterizerState; - throw new NotImplementedException(); - } - - public void ApplyStateObject(ANX.Framework.Graphics.DepthStencilState depthStencilState) - { - DepthStencilStateDescription description = new DepthStencilStateDescription(); - description.IsStencilEnabled = depthStencilState.StencilEnable; - description.IsDepthEnabled = depthStencilState.DepthBufferEnable; - description.DepthComparison = Translate(depthStencilState.DepthBufferFunction); - - //TODO: more to implement - - SharpDX.Direct3D11.DepthStencilState nativeDepthStencilState = new SharpDX.Direct3D11.DepthStencilState(device, description); - //device.OutputMerger.SetDepthStencilState(nativeDepthStencilState, depthStencilState.ReferenceStencil); - throw new NotImplementedException(); - } - - public void ApplyStateObject(int slot, ANX.Framework.Graphics.SamplerState samplerState) - { - SamplerStateDescription description = new SamplerStateDescription(); - description.AddressU = Translate(samplerState.AddressU); - description.AddressV = Translate(samplerState.AddressV); - description.AddressW = Translate(samplerState.AddressW); - description.Filter = Translate(samplerState.Filter); - description.MaximumAnisotropy = samplerState.MaxAnisotropy; - description.MaximumLod = samplerState.MaxMipLevel; //TODO: is this correct? - description.MipLodBias = samplerState.MipMapLevelOfDetailBias; - - SharpDX.Direct3D11.SamplerState nativeSamplerState = new SharpDX.Direct3D11.SamplerState(device, description); - //device.PixelShader.SetSampler(slot, nativeSamplerState); - throw new NotImplementedException(); - } - - private Filter Translate(TextureFilter filter) - { - switch (filter) - { - case TextureFilter.Anisotropic: - return Filter.Anisotropic; - case TextureFilter.Linear: - return Filter.MinMagMipLinear; - case TextureFilter.LinearMipPoint: - return Filter.MinMagMipPoint; - case TextureFilter.MinLinearMagPointMipLinear: - return Filter.MinLinearMagPointMipLinear; - case TextureFilter.MinLinearMagPointMipPoint: - return Filter.MinLinearMagMipPoint; - case TextureFilter.MinPointMagLinearMipLinear: - return Filter.MinPointMagMipLinear; - case TextureFilter.MinPointMagLinearMipPoint: - return Filter.MinPointMagLinearMipPoint; - case TextureFilter.Point: - return Filter.MinMagMipPoint; - case TextureFilter.PointMipLinear: - return Filter.MinMagPointMipLinear; - } - - throw new NotImplementedException(); - } - - private SharpDX.Direct3D11.TextureAddressMode Translate(ANX.Framework.Graphics.TextureAddressMode addressMode) - { - switch (addressMode) - { - case ANX.Framework.Graphics.TextureAddressMode.Clamp: - return SharpDX.Direct3D11.TextureAddressMode.Clamp; - case ANX.Framework.Graphics.TextureAddressMode.Mirror: - return SharpDX.Direct3D11.TextureAddressMode.Mirror; - case ANX.Framework.Graphics.TextureAddressMode.Wrap: - return SharpDX.Direct3D11.TextureAddressMode.Wrap; - } - - return SharpDX.Direct3D11.TextureAddressMode.Clamp; - } - /// /// This method creates a InputLayout which is needed by DirectX 10 for rendering primitives. The VertexDeclaration of ANX/XNA needs to be mapped /// to the DirectX 10 types. This is what this method is for. @@ -395,7 +472,7 @@ namespace ANX.RenderSystem.Windows.DX11 private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement) { - string elementName = Translate(vertexElement.VertexElementUsage); + string elementName = FormatConverter.Translate(vertexElement.VertexElementUsage); Format elementFormat; switch (vertexElement.VertexElementFormat) @@ -419,182 +496,46 @@ namespace ANX.RenderSystem.Windows.DX11 return new InputElement(elementName, vertexElement.UsageIndex, elementFormat, vertexElement.Offset, 0); } - private PrimitiveTopology Translate(PrimitiveType primitiveType) + public void SetRenderTargets(params RenderTargetBinding[] renderTargets) { - switch (primitiveType) + if (renderTargets == null) { - case PrimitiveType.LineList: - return PrimitiveTopology.LineList; - case PrimitiveType.LineStrip: - return PrimitiveTopology.LineStrip; - case PrimitiveType.TriangleList: - return PrimitiveTopology.TriangleList; - case PrimitiveType.TriangleStrip: - return PrimitiveTopology.TriangleStrip; - default: - throw new InvalidOperationException("unknown PrimitiveType: " + primitiveType.ToString()); - } - } + // reset the RenderTarget to backbuffer + if (renderTargetView != null) + { + renderTargetView.Dispose(); + renderTargetView = null; + } - private SharpDX.DXGI.Format Translate(IndexElementSize indexElementSize) - { - switch (indexElementSize) - { - case IndexElementSize.SixteenBits: - return Format.R16_UInt; - case IndexElementSize.ThirtyTwoBits: - return Format.R32_UInt; - default: - throw new InvalidOperationException("unknown IndexElementSize: " + indexElementSize.ToString()); - } - } - - private string Translate(VertexElementUsage usage) - { - //TODO: map the other Usages - if (usage == VertexElementUsage.TextureCoordinate) - { - return "TEXCOORD"; + deviceContext.OutputMerger.SetRenderTargets(1, new RenderTargetView[] { this.renderView }, this.depthStencilView); + deviceContext.OutputMerger.SetTargets(this.depthStencilView, this.renderView); } else { - return usage.ToString().ToUpperInvariant(); + if (renderTargets.Length == 1) + { + RenderTarget2D renderTarget = renderTargets[0].RenderTarget as RenderTarget2D; + RenderTarget2D_DX11 nativeRenderTarget = renderTarget.NativeRenderTarget as RenderTarget2D_DX11; + if (renderTarget != null) + { + if (renderTargetView != null) + { + renderTargetView.Dispose(); + renderTargetView = null; + } + this.renderTargetView = new RenderTargetView(deviceContext.Device, ((Texture2D_DX11)nativeRenderTarget).NativeShaderResourceView.Resource); + DepthStencilView depthStencilView = null; + deviceContext.OutputMerger.SetRenderTargets(1, new RenderTargetView[] { this.renderTargetView }, depthStencilView); + } + } + else + { + throw new NotImplementedException("handling of multiple RenderTargets are not yet implemented"); + } } } - private ColorWriteMaskFlags Translate(ColorWriteChannels colorWriteChannels) - { - switch (colorWriteChannels) - { - case ColorWriteChannels.All: - return ColorWriteMaskFlags.All; - case ColorWriteChannels.Alpha: - return ColorWriteMaskFlags.Alpha; - case ColorWriteChannels.Blue: - return ColorWriteMaskFlags.Blue; - case ColorWriteChannels.Green: - return ColorWriteMaskFlags.Green; - case ColorWriteChannels.Red: - return ColorWriteMaskFlags.Red; - } - - return 0; - } - - private BlendOption Translate(Blend blend) - { - switch (blend) - { - case Blend.BlendFactor: - return BlendOption.BlendFactor; - case Blend.DestinationAlpha: - return BlendOption.DestinationAlpha; - case Blend.DestinationColor: - return BlendOption.DestinationColor; - case Blend.InverseBlendFactor: - return BlendOption.InverseBlendFactor; - case Blend.InverseDestinationAlpha: - return BlendOption.InverseDestinationAlpha; - case Blend.InverseDestinationColor: - return BlendOption.InverseDestinationColor; - case Blend.InverseSourceAlpha: - return BlendOption.InverseSourceAlpha; - case Blend.InverseSourceColor: - return BlendOption.InverseSourceColor; - case Blend.One: - return BlendOption.One; - case Blend.SourceAlpha: - return BlendOption.SourceAlpha; - case Blend.SourceAlphaSaturation: - return BlendOption.SourceAlphaSaturate; - case Blend.SourceColor: - return BlendOption.SourceColor; - case Blend.Zero: - return BlendOption.Zero; - } - - return BlendOption.One; - } - - private BlendOperation Translate(BlendFunction blendFunction) - { - switch (blendFunction) - { - case BlendFunction.Add: - return BlendOperation.Add; - case BlendFunction.Max: - return BlendOperation.Maximum; - case BlendFunction.Min: - return BlendOperation.Minimum; - case BlendFunction.ReverseSubtract: - return BlendOperation.ReverseSubtract; - case BlendFunction.Subtract: - return BlendOperation.Subtract; - } - - return BlendOperation.Add; - } - - private SharpDX.Direct3D11.FillMode Translate(ANX.Framework.Graphics.FillMode fillMode) - { - if (fillMode == ANX.Framework.Graphics.FillMode.WireFrame) - { - return SharpDX.Direct3D11.FillMode.Wireframe; - } - else - { - return SharpDX.Direct3D11.FillMode.Solid; - } - } - - private SharpDX.Direct3D11.CullMode Translate(ANX.Framework.Graphics.CullMode cullMode) - { - if (cullMode == ANX.Framework.Graphics.CullMode.CullClockwiseFace) - { - return SharpDX.Direct3D11.CullMode.Front; - } - else if (cullMode == ANX.Framework.Graphics.CullMode.CullCounterClockwiseFace) - { - return SharpDX.Direct3D11.CullMode.Back; - } - else - { - return SharpDX.Direct3D11.CullMode.None; - } - } - - private Comparison Translate(CompareFunction compareFunction) - { - switch (compareFunction) - { - case CompareFunction.Always: - return Comparison.Always; - case CompareFunction.Equal: - return Comparison.Equal; - case CompareFunction.Greater: - return Comparison.Greater; - case CompareFunction.GreaterEqual: - return Comparison.GreaterEqual; - case CompareFunction.Less: - return Comparison.Less; - case CompareFunction.LessEqual: - return Comparison.LessEqual; - case CompareFunction.Never: - return Comparison.Never; - case CompareFunction.NotEqual: - return Comparison.NotEqual; - } - - return Comparison.Always; - } - - public void SetRenderTargets(params Framework.Graphics.RenderTargetBinding[] renderTargets) - { - throw new NotImplementedException(); - } - - - public void GetBackBufferData(Framework.Rectangle? rect, T[] data, int startIndex, int elementCount) where T : struct + public void GetBackBufferData(ANX.Framework.Rectangle? rect, T[] data, int startIndex, int elementCount) where T : struct { throw new NotImplementedException(); } @@ -609,49 +550,91 @@ namespace ANX.RenderSystem.Windows.DX11 throw new NotImplementedException(); } - - public void Clear(Framework.Graphics.ClearOptions options, Framework.Vector4 color, float depth, int stencil) + public void ResizeBuffers(PresentationParameters presentationParameters) { - throw new NotImplementedException(); + if (swapChain != null) + { + renderView.Dispose(); + backBuffer.Dispose(); + + //TODO: handle format + + swapChain.ResizeBuffers(swapChain.Description.BufferCount, presentationParameters.BackBufferWidth, presentationParameters.BackBufferHeight, Format.R8G8B8A8_UNorm, (int)swapChain.Description.Flags); + + backBuffer = SharpDX.Direct3D11.Texture2D.FromSwapChain(swapChain, 0); + renderView = new RenderTargetView(deviceContext.Device, backBuffer); + + currentViewport = new SharpDX.Direct3D11.Viewport(0, 0, presentationParameters.BackBufferWidth, presentationParameters.BackBufferHeight); + + // + // create the depth stencil buffer + // + Format depthFormat = FormatConverter.Translate(presentationParameters.DepthStencilFormat); + if (depthFormat != Format.Unknown) + { + CreateDepthStencilBuffer(depthFormat); + } + } + + ResizeRenderWindow(presentationParameters); } - public void DrawInstancedPrimitives(Framework.Graphics.PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, int instanceCount) + private void ResizeRenderWindow(PresentationParameters presentationParameters) { - throw new NotImplementedException(); + RECT windowRect; + RECT clientRect; + if (GetWindowRect(presentationParameters.DeviceWindowHandle, out windowRect) && + GetClientRect(presentationParameters.DeviceWindowHandle, out clientRect)) + { + int width = presentationParameters.BackBufferWidth + ((windowRect.Right - windowRect.Left) - clientRect.Right); + int height = presentationParameters.BackBufferHeight + ((windowRect.Bottom - windowRect.Top) - clientRect.Bottom); + + SetWindowPos(presentationParameters.DeviceWindowHandle, IntPtr.Zero, windowRect.Left, windowRect.Top, width, height, 0); + } } - public void DrawUserIndexedPrimitives(Framework.Graphics.PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int numVertices, Array indexData, int indexOffset, int primitiveCount, Framework.Graphics.VertexDeclaration vertexDeclaration, Framework.Graphics.IndexElementSize indexFormat) where T : struct, Framework.Graphics.IVertexType - { - throw new NotImplementedException(); - } - - public void DrawUserPrimitives(Framework.Graphics.PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int primitiveCount, Framework.Graphics.VertexDeclaration vertexDeclaration) where T : struct, Framework.Graphics.IVertexType - { - throw new NotImplementedException(); - } - - - public void ResizeBuffers(Framework.Graphics.PresentationParameters presentationParameters) - { - throw new NotImplementedException(); - } - - public bool VSync { get { - throw new NotImplementedException(); + return this.vSyncEnabled; } set { - throw new NotImplementedException(); + this.vSyncEnabled = value; } } public void Dispose() { - //TODO: implement + if (renderTargetView != null) + { + renderTargetView.Dispose(); + renderTargetView = null; + } + + if (swapChain != null) + { + renderView.Dispose(); + renderView = null; + + backBuffer.Dispose(); + backBuffer = null; + + swapChain.Dispose(); + swapChain = null; + } + + if (this.depthStencilView != null) + { + this.depthStencilBuffer.Dispose(); + this.depthStencilBuffer = null; + + this.depthStencilView.Dispose(); + this.depthStencilView = null; + } + + //TODO: dispose everything else } } } diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/IndexBuffer_DX11.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/IndexBuffer_DX11.cs new file mode 100644 index 00000000..6f2ce43a --- /dev/null +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/IndexBuffer_DX11.cs @@ -0,0 +1,155 @@ +#region Using Statements +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ANX.Framework.NonXNA; +using SharpDX.Direct3D11; +using ANX.Framework.Graphics; +using System.Runtime.InteropServices; + +#endregion // Using Statements + +#region License + +// +// This file is part of the ANX.Framework created by the "ANX.Framework developer group". +// +// This file is released under the Ms-PL license. +// +// +// +// Microsoft Public License (Ms-PL) +// +// This license governs use of the accompanying software. If you use the software, you accept this license. +// If you do not accept the license, do not use the software. +// +// 1.Definitions +// The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning +// here as under U.S. copyright law. +// A "contribution" is the original software, or any additions or changes to the software. +// A "contributor" is any person that distributes its contribution under this license. +// "Licensed patents" are a contributor's patent claims that read directly on its contribution. +// +// 2.Grant of Rights +// (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations +// in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to +// reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution +// or any derivative works that you create. +// (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in +// section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed +// patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution +// in the software or derivative works of the contribution in the software. +// +// 3.Conditions and Limitations +// (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. +// (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your +// patent license from such contributor to the software ends automatically. +// (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution +// notices that are present in the software. +// (D) If you distribute any portion of the software in source code form, you may do so only under this license by including +// a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or +// object code form, you may only do so under a license that complies with this license. +// (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, +// or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the +// extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a +// particular purpose and non-infringement. + +#endregion // License + +namespace ANX.RenderSystem.Windows.DX11 +{ + public class IndexBuffer_DX11 : INativeBuffer, IDisposable + { + private SharpDX.Direct3D11.Buffer buffer; + private IndexElementSize size; + + public IndexBuffer_DX11(GraphicsDevice graphics, IndexElementSize size, int indexCount, BufferUsage usage) + { + this.size = size; + + //TODO: translate and use usage + + GraphicsDeviceWindowsDX11 gd11 = graphics.NativeDevice as GraphicsDeviceWindowsDX11; + SharpDX.Direct3D11.DeviceContext context = gd11 != null ? gd11.NativeDevice as SharpDX.Direct3D11.DeviceContext : null; + + if (context != null) + { + BufferDescription description = new BufferDescription() + { + Usage = ResourceUsage.Dynamic, + SizeInBytes = (size == IndexElementSize.SixteenBits ? 2 : 4) * indexCount, + BindFlags = BindFlags.IndexBuffer, + CpuAccessFlags = CpuAccessFlags.Write, + OptionFlags = ResourceOptionFlags.None + }; + + this.buffer = new SharpDX.Direct3D11.Buffer(context.Device, description); + //this.buffer.Unmap(); + } + } + + public void SetData(GraphicsDevice graphicsDevice, T[] data) where T : struct + { + SetData(graphicsDevice, data, 0, data.Length); + } + + public void SetData(GraphicsDevice graphicsDevice, int offsetInBytes, T[] data, int startIndex, int elementCount) where T : struct + { + if (startIndex > 0 || elementCount < data.Length) + { + throw new NotImplementedException("currently starIndex and elementCount of SetData are not implemented"); + } + + GraphicsDeviceWindowsDX11 dx11GraphicsDevice = graphicsDevice.NativeDevice as GraphicsDeviceWindowsDX11; + DeviceContext context = dx11GraphicsDevice.NativeDevice; + + //TODO: check offsetInBytes parameter for bounds etc. + + GCHandle pinnedArray = GCHandle.Alloc(data, GCHandleType.Pinned); + IntPtr dataPointer = pinnedArray.AddrOfPinnedObject(); + + int dataLength = Marshal.SizeOf(typeof(T)) * data.Length; + + unsafe + { + using (var vData = new SharpDX.DataStream(dataPointer, dataLength, true, false)) + { + if (offsetInBytes > 0) + { + vData.Seek(offsetInBytes / (size == IndexElementSize.SixteenBits ? 2 : 4), System.IO.SeekOrigin.Begin); + } + + SharpDX.DataStream stream; + SharpDX.DataBox box = context.MapSubresource(this.buffer, MapMode.WriteDiscard, MapFlags.None, out stream); + vData.CopyTo(stream); + context.UnmapSubresource(this.buffer, 0); + } + } + + pinnedArray.Free(); + } + + public void SetData(GraphicsDevice graphicsDevice, T[] data, int startIndex, int elementCount) where T : struct + { + SetData(graphicsDevice, 0, data, startIndex, elementCount); + } + + public SharpDX.Direct3D11.Buffer NativeBuffer + { + get + { + return this.buffer; + } + } + + public void Dispose() + { + if (this.buffer != null) + { + buffer.Dispose(); + buffer = null; + } + } + } +} diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/NativeMethods.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/NativeMethods.cs new file mode 100644 index 00000000..fc47bb72 --- /dev/null +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/NativeMethods.cs @@ -0,0 +1,120 @@ +#region Using Statements +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Runtime.InteropServices; +using System.Security; +using System.Drawing; + +#endregion // Using Statements + +#region License + +// +// This file is part of the ANX.Framework created by the "ANX.Framework developer group". +// +// This file is released under the Ms-PL license. +// +// +// +// Microsoft Public License (Ms-PL) +// +// This license governs use of the accompanying software. If you use the software, you accept this license. +// If you do not accept the license, do not use the software. +// +// 1.Definitions +// The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning +// here as under U.S. copyright law. +// A "contribution" is the original software, or any additions or changes to the software. +// A "contributor" is any person that distributes its contribution under this license. +// "Licensed patents" are a contributor's patent claims that read directly on its contribution. +// +// 2.Grant of Rights +// (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations +// in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to +// reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution +// or any derivative works that you create. +// (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in +// section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed +// patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution +// in the software or derivative works of the contribution in the software. +// +// 3.Conditions and Limitations +// (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. +// (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your +// patent license from such contributor to the software ends automatically. +// (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution +// notices that are present in the software. +// (D) If you distribute any portion of the software in source code form, you may do so only under this license by including +// a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or +// object code form, you may only do so under a license that complies with this license. +// (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, +// or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the +// extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a +// particular purpose and non-infringement. + +#endregion // License + +namespace ANX.RenderSystem.Windows.DX11 +{ + internal sealed class NativeMethods + { + [SuppressUnmanagedCodeSecurity, DllImport("user32.dll", CharSet = CharSet.Auto)] + internal static extern bool PeekMessage(out Message msg, IntPtr hWnd, uint messageFilterMin, uint messageFilterMax, uint flags); + + // Nested Types + [StructLayout(LayoutKind.Sequential)] + public struct Message + { + public IntPtr hWnd; + public NativeMethods.WindowMessage msg; + public IntPtr wParam; + public IntPtr lParam; + public uint time; + public Point p; + } + + internal enum WindowMessage : uint + { + ActivateApplication = 0x1c, + Character = 0x102, + Close = 0x10, + Destroy = 2, + EnterMenuLoop = 0x211, + EnterSizeMove = 0x231, + ExitMenuLoop = 530, + ExitSizeMove = 0x232, + GetMinMax = 0x24, + KeyDown = 0x100, + KeyUp = 0x101, + LeftButtonDoubleClick = 0x203, + LeftButtonDown = 0x201, + LeftButtonUp = 0x202, + MiddleButtonDoubleClick = 0x209, + MiddleButtonDown = 0x207, + MiddleButtonUp = 520, + MouseFirst = 0x201, + MouseLast = 0x20d, + MouseMove = 0x200, + MouseWheel = 0x20a, + NonClientHitTest = 0x84, + Paint = 15, + PowerBroadcast = 0x218, + Quit = 0x12, + RightButtonDoubleClick = 0x206, + RightButtonDown = 0x204, + RightButtonUp = 0x205, + SetCursor = 0x20, + Size = 5, + SystemCharacter = 0x106, + SystemCommand = 0x112, + SystemKeyDown = 260, + SystemKeyUp = 0x105, + XButtonDoubleClick = 0x20d, + XButtonDown = 0x20b, + XButtonUp = 0x20c + } + + } +} diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/Properties/AssemblyInfo.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/Properties/AssemblyInfo.cs index cffaef81..2cb0c827 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX11/Properties/AssemblyInfo.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Buildnummer // Revision // -[assembly: AssemblyVersion("0.1.3.0")] -[assembly: AssemblyFileVersion("0.1.3.0")] +[assembly: AssemblyVersion("0.7.0.0")] +[assembly: AssemblyFileVersion("0.7.0.0")] diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/RasterizerState_DX11.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/RasterizerState_DX11.cs new file mode 100644 index 00000000..490d8bdc --- /dev/null +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/RasterizerState_DX11.cs @@ -0,0 +1,212 @@ +#region Using Statements +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using SharpDX.Direct3D11; +using ANX.Framework.Graphics; +using ANX.Framework.NonXNA; + +#endregion // Using Statements + +#region License + +// +// This file is part of the ANX.Framework created by the "ANX.Framework developer group". +// +// This file is released under the Ms-PL license. +// +// +// +// Microsoft Public License (Ms-PL) +// +// This license governs use of the accompanying software. If you use the software, you accept this license. +// If you do not accept the license, do not use the software. +// +// 1.Definitions +// The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning +// here as under U.S. copyright law. +// A "contribution" is the original software, or any additions or changes to the software. +// A "contributor" is any person that distributes its contribution under this license. +// "Licensed patents" are a contributor's patent claims that read directly on its contribution. +// +// 2.Grant of Rights +// (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations +// in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to +// reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution +// or any derivative works that you create. +// (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in +// section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed +// patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution +// in the software or derivative works of the contribution in the software. +// +// 3.Conditions and Limitations +// (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. +// (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your +// patent license from such contributor to the software ends automatically. +// (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution +// notices that are present in the software. +// (D) If you distribute any portion of the software in source code form, you may do so only under this license by including +// a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or +// object code form, you may only do so under a license that complies with this license. +// (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, +// or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the +// extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a +// particular purpose and non-infringement. + +#endregion // License + +namespace ANX.RenderSystem.Windows.DX11 +{ + public class RasterizerState_DX11 : INativeRasterizerState + { + #region Private Members + private RasterizerStateDescription description; + private SharpDX.Direct3D11.RasterizerState nativeRasterizerState; + private bool nativeRasterizerStateDirty; + private bool bound; + + private const int intMaxOver16 = int.MaxValue / 16; + + #endregion // Private Members + + public RasterizerState_DX11() + { + this.description = new RasterizerStateDescription(); + + this.description.IsAntialiasedLineEnabled = false; + + this.nativeRasterizerStateDirty = true; + } + + public void Apply(ANX.Framework.Graphics.GraphicsDevice graphicsDevice) + { + GraphicsDeviceWindowsDX11 gdx11 = graphicsDevice.NativeDevice as GraphicsDeviceWindowsDX11; + DeviceContext context = gdx11.NativeDevice; + + UpdateNativeRasterizerState(context.Device); + this.bound = true; + + context.Rasterizer.State = this.nativeRasterizerState; + } + + public void Release() + { + this.bound = false; + } + + public void Dispose() + { + if (this.nativeRasterizerState != null) + { + this.nativeRasterizerState.Dispose(); + this.nativeRasterizerState = null; + } + } + + public bool IsBound + { + get + { + return this.bound; + } + } + + public ANX.Framework.Graphics.CullMode CullMode + { + set + { + SharpDX.Direct3D11.CullMode cullMode = FormatConverter.Translate(value); + + if (description.CullMode != cullMode) + { + nativeRasterizerStateDirty = true; + description.CullMode = cullMode; + } + } + } + + public float DepthBias + { + set + { + // XNA uses a float value in the range of 0f..16f as value + // DirectX 10 uses a INT value + + int depthBiasValue = (int)(value * intMaxOver16); + + if (description.DepthBias != depthBiasValue) + { + nativeRasterizerStateDirty = true; + description.DepthBias = depthBiasValue; + } + } + } + + public ANX.Framework.Graphics.FillMode FillMode + { + set + { + SharpDX.Direct3D11.FillMode fillMode = FormatConverter.Translate(value); + + if (description.FillMode != fillMode) + { + nativeRasterizerStateDirty = true; + description.FillMode = fillMode; + } + } + } + + public bool MultiSampleAntiAlias + { + set + { + if (description.IsMultisampleEnabled != value) + { + nativeRasterizerStateDirty = true; + description.IsMultisampleEnabled = value; + } + } + } + + public bool ScissorTestEnable + { + set + { + if (description.IsScissorEnabled != value) + { + nativeRasterizerStateDirty = true; + description.IsScissorEnabled = value; + } + } + } + + public float SlopeScaleDepthBias + { + set + { + if (description.SlopeScaledDepthBias != value) + { + nativeRasterizerStateDirty = true; + description.SlopeScaledDepthBias = value; + } + } + } + + private void UpdateNativeRasterizerState(Device device) + { + if (this.nativeRasterizerStateDirty == true || this.nativeRasterizerState == null) + { + if (this.nativeRasterizerState != null) + { + this.nativeRasterizerState.Dispose(); + this.nativeRasterizerState = null; + } + + this.nativeRasterizerState = new SharpDX.Direct3D11.RasterizerState(device, ref this.description); + + this.nativeRasterizerStateDirty = false; + } + } + } +} diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/RenderTarget2D_DX11.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/RenderTarget2D_DX11.cs new file mode 100644 index 00000000..62a7db96 --- /dev/null +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/RenderTarget2D_DX11.cs @@ -0,0 +1,103 @@ +#region Using Statements +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ANX.Framework.Graphics; +using ANX.Framework.NonXNA.RenderSystem; +using SharpDX.Direct3D11; + +#endregion // Using Statements + +#region License + +// +// This file is part of the ANX.Framework created by the "ANX.Framework developer group". +// +// This file is released under the Ms-PL license. +// +// +// +// Microsoft Public License (Ms-PL) +// +// This license governs use of the accompanying software. If you use the software, you accept this license. +// If you do not accept the license, do not use the software. +// +// 1.Definitions +// The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning +// here as under U.S. copyright law. +// A "contribution" is the original software, or any additions or changes to the software. +// A "contributor" is any person that distributes its contribution under this license. +// "Licensed patents" are a contributor's patent claims that read directly on its contribution. +// +// 2.Grant of Rights +// (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations +// in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to +// reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution +// or any derivative works that you create. +// (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in +// section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed +// patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution +// in the software or derivative works of the contribution in the software. +// +// 3.Conditions and Limitations +// (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. +// (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your +// patent license from such contributor to the software ends automatically. +// (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution +// notices that are present in the software. +// (D) If you distribute any portion of the software in source code form, you may do so only under this license by including +// a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or +// object code form, you may only do so under a license that complies with this license. +// (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, +// or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the +// extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a +// particular purpose and non-infringement. + +#endregion // License + +namespace ANX.RenderSystem.Windows.DX11 +{ + public class RenderTarget2D_DX11 : Texture2D_DX11, INativeRenderTarget2D, INativeTexture2D + { + #region Private Members + + #endregion // Private Members + + public RenderTarget2D_DX11(GraphicsDevice graphics, int width, int height, bool mipMap, SurfaceFormat preferredFormat, DepthFormat preferredDepthFormat, int preferredMultiSampleCount, RenderTargetUsage usage) + : base(graphics) + { + if (mipMap) + { + throw new NotImplementedException("creating RenderTargets with mip map not yet implemented"); + } + + this.surfaceFormat = surfaceFormat; + + GraphicsDeviceWindowsDX11 graphicsDX11 = graphicsDevice.NativeDevice as GraphicsDeviceWindowsDX11; + SharpDX.Direct3D11.DeviceContext device = graphicsDX11.NativeDevice; + + SharpDX.Direct3D11.Texture2DDescription description = new SharpDX.Direct3D11.Texture2DDescription() + { + Width = width, + Height = height, + MipLevels = 1, + ArraySize = 1, + Format = FormatConverter.Translate(preferredFormat), + SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0), + Usage = SharpDX.Direct3D11.ResourceUsage.Default, + BindFlags = SharpDX.Direct3D11.BindFlags.ShaderResource | SharpDX.Direct3D11.BindFlags.RenderTarget, + CpuAccessFlags = SharpDX.Direct3D11.CpuAccessFlags.None, + OptionFlags = SharpDX.Direct3D11.ResourceOptionFlags.None, + }; + this.nativeTexture = new SharpDX.Direct3D11.Texture2D(graphicsDX11.NativeDevice.Device, description); + this.nativeShaderResourceView = new SharpDX.Direct3D11.ShaderResourceView(graphicsDX11.NativeDevice.Device, this.nativeTexture); + + // description of texture formats of DX10: http://msdn.microsoft.com/en-us/library/bb694531(v=VS.85).aspx + // more helpfull information on DX10 textures: http://msdn.microsoft.com/en-us/library/windows/desktop/bb205131(v=vs.85).aspx + + this.formatSize = FormatConverter.FormatSize(surfaceFormat); + } + + } +} diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/SamplerState_DX11.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/SamplerState_DX11.cs new file mode 100644 index 00000000..b44b19ed --- /dev/null +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/SamplerState_DX11.cs @@ -0,0 +1,216 @@ +#region Using Statements +using System; +using ANX.Framework.Graphics; +using ANX.Framework.NonXNA; +using SharpDX.Direct3D11; + +#endregion // Using Statements + +#region License + +// +// This file is part of the ANX.Framework created by the "ANX.Framework developer group". +// +// This file is released under the Ms-PL license. +// +// +// +// Microsoft Public License (Ms-PL) +// +// This license governs use of the accompanying software. If you use the software, you accept this license. +// If you do not accept the license, do not use the software. +// +// 1.Definitions +// The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning +// here as under U.S. copyright law. +// A "contribution" is the original software, or any additions or changes to the software. +// A "contributor" is any person that distributes its contribution under this license. +// "Licensed patents" are a contributor's patent claims that read directly on its contribution. +// +// 2.Grant of Rights +// (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations +// in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to +// reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution +// or any derivative works that you create. +// (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in +// section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed +// patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution +// in the software or derivative works of the contribution in the software. +// +// 3.Conditions and Limitations +// (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. +// (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your +// patent license from such contributor to the software ends automatically. +// (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution +// notices that are present in the software. +// (D) If you distribute any portion of the software in source code form, you may do so only under this license by including +// a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or +// object code form, you may only do so under a license that complies with this license. +// (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, +// or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the +// extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a +// particular purpose and non-infringement. + +#endregion // License + +namespace ANX.RenderSystem.Windows.DX11 +{ + public class SamplerState_DX11 : INativeSamplerState + { + #region Private Members + private SamplerStateDescription description; + private SharpDX.Direct3D11.SamplerState nativeSamplerState; + private bool nativeSamplerStateDirty; + private bool bound; + + #endregion // Private Members + + public SamplerState_DX11() + { + this.description = new SamplerStateDescription(); + + this.nativeSamplerStateDirty = true; + } + + public void Apply(GraphicsDevice graphicsDevice, int index) + { + GraphicsDeviceWindowsDX11 gdx11 = graphicsDevice.NativeDevice as GraphicsDeviceWindowsDX11; + DeviceContext context = gdx11.NativeDevice; + + UpdateNativeSamplerState(context.Device); + this.bound = true; + + context.PixelShader.SetSampler(index, this.nativeSamplerState); + } + + public void Release() + { + this.bound = false; + } + + public bool IsBound + { + get + { + return this.bound; + } + } + + public ANX.Framework.Graphics.TextureAddressMode AddressU + { + set + { + SharpDX.Direct3D11.TextureAddressMode mode = FormatConverter.Translate(value); + + if (description.AddressU != mode) + { + description.AddressU = mode; + nativeSamplerStateDirty = true; + } + } + } + + public ANX.Framework.Graphics.TextureAddressMode AddressV + { + set + { + SharpDX.Direct3D11.TextureAddressMode mode = FormatConverter.Translate(value); + + if (description.AddressV != mode) + { + description.AddressV = mode; + nativeSamplerStateDirty = true; + } + } + } + + public ANX.Framework.Graphics.TextureAddressMode AddressW + { + set + { + SharpDX.Direct3D11.TextureAddressMode mode = FormatConverter.Translate(value); + + if (description.AddressW != mode) + { + description.AddressW = mode; + nativeSamplerStateDirty = true; + } + } + } + + public TextureFilter Filter + { + set + { + SharpDX.Direct3D11.Filter filter = FormatConverter.Translate(value); + + if (description.Filter != filter) + { + description.Filter = filter; + nativeSamplerStateDirty = true; + } + } + } + + public int MaxAnisotropy + { + set + { + if (description.MaximumAnisotropy != value) + { + description.MaximumAnisotropy = value; + nativeSamplerStateDirty = true; + } + } + } + + public int MaxMipLevel + { + set + { + if (description.MaximumLod != value) + { + description.MaximumLod = value; + nativeSamplerStateDirty = true; + } + } + } + + public float MipMapLevelOfDetailBias + { + set + { + if (description.MipLodBias != value) + { + description.MipLodBias = value; + nativeSamplerStateDirty = true; + } + } + } + + public void Dispose() + { + if (this.nativeSamplerState != null) + { + this.nativeSamplerState.Dispose(); + this.nativeSamplerState = null; + } + } + + private void UpdateNativeSamplerState(Device device) + { + if (this.nativeSamplerStateDirty == true || this.nativeSamplerState == null) + { + if (this.nativeSamplerState != null) + { + this.nativeSamplerState.Dispose(); + this.nativeSamplerState = null; + } + + this.nativeSamplerState = new SharpDX.Direct3D11.SamplerState(device, ref this.description); + + this.nativeSamplerStateDirty = false; + } + } + } +} diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/ShaderByteCode.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/ShaderByteCode.cs new file mode 100644 index 00000000..d702cea2 --- /dev/null +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/ShaderByteCode.cs @@ -0,0 +1,217 @@ +#region Using Statements +using System; +#endregion // Using Statements + +#region License +// +// This file is part of the ANX.Framework created by the "ANX.Framework developer group". +// +// This file is released under the Ms-PL license. +// +// +// +// Microsoft Public License (Ms-PL) +// +// This license governs use of the accompanying software. If you use the software, you accept this license. +// If you do not accept the license, do not use the software. +// +// 1.Definitions +// The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning +// here as under U.S. copyright law. +// A "contribution" is the original software, or any additions or changes to the software. +// A "contributor" is any person that distributes its contribution under this license. +// "Licensed patents" are a contributor's patent claims that read directly on its contribution. +// +// 2.Grant of Rights +// (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations +// in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to +// reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution +// or any derivative works that you create. +// (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in +// section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed +// patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution +// in the software or derivative works of the contribution in the software. +// +// 3.Conditions and Limitations +// (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. +// (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your +// patent license from such contributor to the software ends automatically. +// (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution +// notices that are present in the software. +// (D) If you distribute any portion of the software in source code form, you may do so only under this license by including +// a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or +// object code form, you may only do so under a license that complies with this license. +// (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, +// or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the +// extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a +// particular purpose and non-infringement. +#endregion // License + +namespace ANX.RenderSystem.Windows.DX11 +{ + internal static class ShaderByteCode + { + #region SpriteBatchShader + internal static byte[] SpriteBatchByteCode = new byte[] + { + 068, + 088, 066, 067, 025, 110, 120, 179, 245, 124, 038, 142, 158, 241, 235, 093, 024, 198, 181, 194, 001, + 000, 000, 000, 128, 001, 000, 000, 001, 000, 000, 000, 036, 000, 000, 000, 070, 088, 049, 048, 084, + 001, 000, 000, 001, 016, 255, 254, 001, 000, 000, 000, 001, 000, 000, 000, 002, 000, 000, 000, 000, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 168, 000, 000, 000, 000, + 000, 000, 000, 001, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 001, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, + 000, 000, 000, 036, 071, 108, 111, 098, 097, 108, 115, 000, 102, 108, 111, 097, 116, 052, 120, 052, + 000, 013, 000, 000, 000, 001, 000, 000, 000, 000, 000, 000, 000, 064, 000, 000, 000, 064, 000, 000, + 000, 064, 000, 000, 000, 011, 100, 000, 000, 077, 097, 116, 114, 105, 120, 084, 114, 097, 110, 115, + 102, 111, 114, 109, 000, 084, 101, 120, 116, 117, 114, 101, 050, 068, 000, 066, 000, 000, 000, 002, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 012, + 000, 000, 000, 084, 101, 120, 116, 117, 114, 101, 000, 083, 097, 109, 112, 108, 101, 114, 083, 116, + 097, 116, 101, 000, 112, 000, 000, 000, 002, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, + 000, 000, 000, 000, 000, 000, 000, 000, 021, 000, 000, 000, 084, 101, 120, 116, 117, 114, 101, 083, + 097, 109, 112, 108, 101, 114, 000, 004, 000, 000, 000, 064, 000, 000, 000, 000, 000, 000, 000, 001, + 000, 000, 000, 255, 255, 255, 255, 000, 000, 000, 000, 050, 000, 000, 000, 022, 000, 000, 000, 000, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 104, + 000, 000, 000, 076, 000, 000, 000, 000, 000, 000, 000, 255, 255, 255, 255, 000, 000, 000, 000, 153, + 000, 000, 000, 125, 000, 000, 000, 000, 000, 000, 000, 255, 255, 255, 255, 000, 000, 000, 000, 000, + 000, 000, 000 + }; + #endregion //SpriteBatchShader + + #region AlphaTestEffectShader + internal static byte[] AlphaTestEffectByteCode = new byte[] + { + 068, + 088, 066, 067, 025, 110, 120, 179, 245, 124, 038, 142, 158, 241, 235, 093, 024, 198, 181, 194, 001, + 000, 000, 000, 128, 001, 000, 000, 001, 000, 000, 000, 036, 000, 000, 000, 070, 088, 049, 048, 084, + 001, 000, 000, 001, 016, 255, 254, 001, 000, 000, 000, 001, 000, 000, 000, 002, 000, 000, 000, 000, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 168, 000, 000, 000, 000, + 000, 000, 000, 001, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 001, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, + 000, 000, 000, 036, 071, 108, 111, 098, 097, 108, 115, 000, 102, 108, 111, 097, 116, 052, 120, 052, + 000, 013, 000, 000, 000, 001, 000, 000, 000, 000, 000, 000, 000, 064, 000, 000, 000, 064, 000, 000, + 000, 064, 000, 000, 000, 011, 100, 000, 000, 077, 097, 116, 114, 105, 120, 084, 114, 097, 110, 115, + 102, 111, 114, 109, 000, 084, 101, 120, 116, 117, 114, 101, 050, 068, 000, 066, 000, 000, 000, 002, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 012, + 000, 000, 000, 084, 101, 120, 116, 117, 114, 101, 000, 083, 097, 109, 112, 108, 101, 114, 083, 116, + 097, 116, 101, 000, 112, 000, 000, 000, 002, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, + 000, 000, 000, 000, 000, 000, 000, 000, 021, 000, 000, 000, 084, 101, 120, 116, 117, 114, 101, 083, + 097, 109, 112, 108, 101, 114, 000, 004, 000, 000, 000, 064, 000, 000, 000, 000, 000, 000, 000, 001, + 000, 000, 000, 255, 255, 255, 255, 000, 000, 000, 000, 050, 000, 000, 000, 022, 000, 000, 000, 000, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 104, + 000, 000, 000, 076, 000, 000, 000, 000, 000, 000, 000, 255, 255, 255, 255, 000, 000, 000, 000, 153, + 000, 000, 000, 125, 000, 000, 000, 000, 000, 000, 000, 255, 255, 255, 255, 000, 000, 000, 000, 000, + 000, 000, 000 + }; + #endregion //AlphaTestEffectShader + + #region BasicEffectShader + internal static byte[] BasicEffectByteCode = new byte[] + { + 068, + 088, 066, 067, 025, 110, 120, 179, 245, 124, 038, 142, 158, 241, 235, 093, 024, 198, 181, 194, 001, + 000, 000, 000, 128, 001, 000, 000, 001, 000, 000, 000, 036, 000, 000, 000, 070, 088, 049, 048, 084, + 001, 000, 000, 001, 016, 255, 254, 001, 000, 000, 000, 001, 000, 000, 000, 002, 000, 000, 000, 000, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 168, 000, 000, 000, 000, + 000, 000, 000, 001, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 001, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, + 000, 000, 000, 036, 071, 108, 111, 098, 097, 108, 115, 000, 102, 108, 111, 097, 116, 052, 120, 052, + 000, 013, 000, 000, 000, 001, 000, 000, 000, 000, 000, 000, 000, 064, 000, 000, 000, 064, 000, 000, + 000, 064, 000, 000, 000, 011, 100, 000, 000, 077, 097, 116, 114, 105, 120, 084, 114, 097, 110, 115, + 102, 111, 114, 109, 000, 084, 101, 120, 116, 117, 114, 101, 050, 068, 000, 066, 000, 000, 000, 002, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 012, + 000, 000, 000, 084, 101, 120, 116, 117, 114, 101, 000, 083, 097, 109, 112, 108, 101, 114, 083, 116, + 097, 116, 101, 000, 112, 000, 000, 000, 002, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, + 000, 000, 000, 000, 000, 000, 000, 000, 021, 000, 000, 000, 084, 101, 120, 116, 117, 114, 101, 083, + 097, 109, 112, 108, 101, 114, 000, 004, 000, 000, 000, 064, 000, 000, 000, 000, 000, 000, 000, 001, + 000, 000, 000, 255, 255, 255, 255, 000, 000, 000, 000, 050, 000, 000, 000, 022, 000, 000, 000, 000, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 104, + 000, 000, 000, 076, 000, 000, 000, 000, 000, 000, 000, 255, 255, 255, 255, 000, 000, 000, 000, 153, + 000, 000, 000, 125, 000, 000, 000, 000, 000, 000, 000, 255, 255, 255, 255, 000, 000, 000, 000, 000, + 000, 000, 000 + }; + #endregion //BasicEffectShader + + #region DualTextureEffectShader + internal static byte[] DualTextureEffectByteCode = new byte[] + { + 068, + 088, 066, 067, 025, 110, 120, 179, 245, 124, 038, 142, 158, 241, 235, 093, 024, 198, 181, 194, 001, + 000, 000, 000, 128, 001, 000, 000, 001, 000, 000, 000, 036, 000, 000, 000, 070, 088, 049, 048, 084, + 001, 000, 000, 001, 016, 255, 254, 001, 000, 000, 000, 001, 000, 000, 000, 002, 000, 000, 000, 000, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 168, 000, 000, 000, 000, + 000, 000, 000, 001, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 001, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, + 000, 000, 000, 036, 071, 108, 111, 098, 097, 108, 115, 000, 102, 108, 111, 097, 116, 052, 120, 052, + 000, 013, 000, 000, 000, 001, 000, 000, 000, 000, 000, 000, 000, 064, 000, 000, 000, 064, 000, 000, + 000, 064, 000, 000, 000, 011, 100, 000, 000, 077, 097, 116, 114, 105, 120, 084, 114, 097, 110, 115, + 102, 111, 114, 109, 000, 084, 101, 120, 116, 117, 114, 101, 050, 068, 000, 066, 000, 000, 000, 002, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 012, + 000, 000, 000, 084, 101, 120, 116, 117, 114, 101, 000, 083, 097, 109, 112, 108, 101, 114, 083, 116, + 097, 116, 101, 000, 112, 000, 000, 000, 002, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, + 000, 000, 000, 000, 000, 000, 000, 000, 021, 000, 000, 000, 084, 101, 120, 116, 117, 114, 101, 083, + 097, 109, 112, 108, 101, 114, 000, 004, 000, 000, 000, 064, 000, 000, 000, 000, 000, 000, 000, 001, + 000, 000, 000, 255, 255, 255, 255, 000, 000, 000, 000, 050, 000, 000, 000, 022, 000, 000, 000, 000, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 104, + 000, 000, 000, 076, 000, 000, 000, 000, 000, 000, 000, 255, 255, 255, 255, 000, 000, 000, 000, 153, + 000, 000, 000, 125, 000, 000, 000, 000, 000, 000, 000, 255, 255, 255, 255, 000, 000, 000, 000, 000, + 000, 000, 000 + }; + #endregion //DualTextureEffectShader + + #region EnvironmentMapEffectShader + internal static byte[] EnvironmentMapEffectByteCode = new byte[] + { + 068, + 088, 066, 067, 025, 110, 120, 179, 245, 124, 038, 142, 158, 241, 235, 093, 024, 198, 181, 194, 001, + 000, 000, 000, 128, 001, 000, 000, 001, 000, 000, 000, 036, 000, 000, 000, 070, 088, 049, 048, 084, + 001, 000, 000, 001, 016, 255, 254, 001, 000, 000, 000, 001, 000, 000, 000, 002, 000, 000, 000, 000, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 168, 000, 000, 000, 000, + 000, 000, 000, 001, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 001, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, + 000, 000, 000, 036, 071, 108, 111, 098, 097, 108, 115, 000, 102, 108, 111, 097, 116, 052, 120, 052, + 000, 013, 000, 000, 000, 001, 000, 000, 000, 000, 000, 000, 000, 064, 000, 000, 000, 064, 000, 000, + 000, 064, 000, 000, 000, 011, 100, 000, 000, 077, 097, 116, 114, 105, 120, 084, 114, 097, 110, 115, + 102, 111, 114, 109, 000, 084, 101, 120, 116, 117, 114, 101, 050, 068, 000, 066, 000, 000, 000, 002, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 012, + 000, 000, 000, 084, 101, 120, 116, 117, 114, 101, 000, 083, 097, 109, 112, 108, 101, 114, 083, 116, + 097, 116, 101, 000, 112, 000, 000, 000, 002, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, + 000, 000, 000, 000, 000, 000, 000, 000, 021, 000, 000, 000, 084, 101, 120, 116, 117, 114, 101, 083, + 097, 109, 112, 108, 101, 114, 000, 004, 000, 000, 000, 064, 000, 000, 000, 000, 000, 000, 000, 001, + 000, 000, 000, 255, 255, 255, 255, 000, 000, 000, 000, 050, 000, 000, 000, 022, 000, 000, 000, 000, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 104, + 000, 000, 000, 076, 000, 000, 000, 000, 000, 000, 000, 255, 255, 255, 255, 000, 000, 000, 000, 153, + 000, 000, 000, 125, 000, 000, 000, 000, 000, 000, 000, 255, 255, 255, 255, 000, 000, 000, 000, 000, + 000, 000, 000 + }; + #endregion //EnvironmentMapEffectShader + + #region SkinnedEffectShader + internal static byte[] SkinnedEffectByteCode = new byte[] + { + 068, + 088, 066, 067, 025, 110, 120, 179, 245, 124, 038, 142, 158, 241, 235, 093, 024, 198, 181, 194, 001, + 000, 000, 000, 128, 001, 000, 000, 001, 000, 000, 000, 036, 000, 000, 000, 070, 088, 049, 048, 084, + 001, 000, 000, 001, 016, 255, 254, 001, 000, 000, 000, 001, 000, 000, 000, 002, 000, 000, 000, 000, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 168, 000, 000, 000, 000, + 000, 000, 000, 001, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 001, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, + 000, 000, 000, 036, 071, 108, 111, 098, 097, 108, 115, 000, 102, 108, 111, 097, 116, 052, 120, 052, + 000, 013, 000, 000, 000, 001, 000, 000, 000, 000, 000, 000, 000, 064, 000, 000, 000, 064, 000, 000, + 000, 064, 000, 000, 000, 011, 100, 000, 000, 077, 097, 116, 114, 105, 120, 084, 114, 097, 110, 115, + 102, 111, 114, 109, 000, 084, 101, 120, 116, 117, 114, 101, 050, 068, 000, 066, 000, 000, 000, 002, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 012, + 000, 000, 000, 084, 101, 120, 116, 117, 114, 101, 000, 083, 097, 109, 112, 108, 101, 114, 083, 116, + 097, 116, 101, 000, 112, 000, 000, 000, 002, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, + 000, 000, 000, 000, 000, 000, 000, 000, 021, 000, 000, 000, 084, 101, 120, 116, 117, 114, 101, 083, + 097, 109, 112, 108, 101, 114, 000, 004, 000, 000, 000, 064, 000, 000, 000, 000, 000, 000, 000, 001, + 000, 000, 000, 255, 255, 255, 255, 000, 000, 000, 000, 050, 000, 000, 000, 022, 000, 000, 000, 000, + 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 104, + 000, 000, 000, 076, 000, 000, 000, 000, 000, 000, 000, 255, 255, 255, 255, 000, 000, 000, 000, 153, + 000, 000, 000, 125, 000, 000, 000, 000, 000, 000, 000, 255, 255, 255, 255, 000, 000, 000, 000, 000, + 000, 000, 000 + }; + #endregion //SkinnedEffectShader + + } +} diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/Texture2D_DX11.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/Texture2D_DX11.cs new file mode 100644 index 00000000..28cad385 --- /dev/null +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/Texture2D_DX11.cs @@ -0,0 +1,316 @@ +#region Using Statements +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ANX.Framework.Graphics; +using SharpDX.Direct3D11; +using ANX.Framework.NonXNA.RenderSystem; +using System.IO; +using System.Runtime.InteropServices; + +#endregion // Using Statements + +#region License + +// +// This file is part of the ANX.Framework created by the "ANX.Framework developer group". +// +// This file is released under the Ms-PL license. +// +// +// +// Microsoft Public License (Ms-PL) +// +// This license governs use of the accompanying software. If you use the software, you accept this license. +// If you do not accept the license, do not use the software. +// +// 1.Definitions +// The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning +// here as under U.S. copyright law. +// A "contribution" is the original software, or any additions or changes to the software. +// A "contributor" is any person that distributes its contribution under this license. +// "Licensed patents" are a contributor's patent claims that read directly on its contribution. +// +// 2.Grant of Rights +// (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations +// in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to +// reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution +// or any derivative works that you create. +// (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in +// section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed +// patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution +// in the software or derivative works of the contribution in the software. +// +// 3.Conditions and Limitations +// (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. +// (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your +// patent license from such contributor to the software ends automatically. +// (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution +// notices that are present in the software. +// (D) If you distribute any portion of the software in source code form, you may do so only under this license by including +// a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or +// object code form, you may only do so under a license that complies with this license. +// (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, +// or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the +// extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a +// particular purpose and non-infringement. + +#endregion // License + +namespace ANX.RenderSystem.Windows.DX11 +{ + public class Texture2D_DX11 : INativeTexture2D + { + #region Private Members + protected internal SharpDX.Direct3D11.Texture2D nativeTexture; + protected internal SharpDX.Direct3D11.ShaderResourceView nativeShaderResourceView; + protected internal int formatSize; + protected internal SurfaceFormat surfaceFormat; + protected internal GraphicsDevice graphicsDevice; + + #endregion // Private Members + + internal Texture2D_DX11(GraphicsDevice graphicsDevice) + { + this.graphicsDevice = graphicsDevice; + } + + public Texture2D_DX11(GraphicsDevice graphicsDevice, int width, int height, SurfaceFormat surfaceFormat, int mipCount) + { + if (mipCount > 1) + { + throw new Exception("creating textures with mip map not yet implemented"); + } + + this.graphicsDevice = graphicsDevice; + this.surfaceFormat = surfaceFormat; + + GraphicsDeviceWindowsDX11 graphicsDX11 = graphicsDevice.NativeDevice as GraphicsDeviceWindowsDX11; + SharpDX.Direct3D11.DeviceContext context = graphicsDX11.NativeDevice; + + SharpDX.Direct3D11.Texture2DDescription description = new SharpDX.Direct3D11.Texture2DDescription() + { + Width = width, + Height = height, + MipLevels = mipCount, + ArraySize = mipCount, + Format = FormatConverter.Translate(surfaceFormat), + SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0), + Usage = SharpDX.Direct3D11.ResourceUsage.Dynamic, + BindFlags = SharpDX.Direct3D11.BindFlags.ShaderResource, + CpuAccessFlags = SharpDX.Direct3D11.CpuAccessFlags.Write, + OptionFlags = SharpDX.Direct3D11.ResourceOptionFlags.None, + }; + this.nativeTexture = new SharpDX.Direct3D11.Texture2D(context.Device, description); + this.nativeShaderResourceView = new SharpDX.Direct3D11.ShaderResourceView(context.Device, this.nativeTexture); + + // description of texture formats of DX10: http://msdn.microsoft.com/en-us/library/bb694531(v=VS.85).aspx + // more helpfull information on DX10 textures: http://msdn.microsoft.com/en-us/library/windows/desktop/bb205131(v=vs.85).aspx + + this.formatSize = FormatConverter.FormatSize(surfaceFormat); + } + + public override int GetHashCode() + { + return NativeTexture.NativePointer.ToInt32(); + } + + internal SharpDX.Direct3D11.Texture2D NativeTexture + { + get + { + return this.nativeTexture; + } + set + { + if (this.nativeTexture != value) + { + if (this.nativeTexture != null) + { + this.nativeTexture.Dispose(); + } + + this.nativeTexture = value; + } + } + } + + internal SharpDX.Direct3D11.ShaderResourceView NativeShaderResourceView + { + get + { + return this.nativeShaderResourceView; + } + set + { + if (this.nativeShaderResourceView != value) + { + if (this.nativeShaderResourceView != null) + { + this.nativeShaderResourceView.Dispose(); + } + + this.nativeShaderResourceView = value; + } + } + } + + public void SetData(GraphicsDevice graphicsDevice, T[] data) where T : struct + { + SetData(graphicsDevice, 0, data, 0, data.Length); + } + + public void SetData(GraphicsDevice graphicsDevice, T[] data, int startIndex, int elementCount) where T : struct + { + SetData(graphicsDevice, 0, data, startIndex, elementCount); + } + + public void SetData(GraphicsDevice graphicsDevice, int offsetInBytes, T[] data, int startIndex, int elementCount) where T : struct + { + //TODO: handle offsetInBytes parameter + //TODO: handle startIndex parameter + //TODO: handle elementCount parameter + + GraphicsDeviceWindowsDX11 dx11GraphicsDevice = graphicsDevice.NativeDevice as GraphicsDeviceWindowsDX11; + DeviceContext context = dx11GraphicsDevice.NativeDevice; + + if (this.surfaceFormat == SurfaceFormat.Color) + { + int subresource = SharpDX.Direct3D11.Texture2D.CalculateSubResourceIndex(0, 0, 1); + SharpDX.DataBox rectangle = context.MapSubresource(this.nativeTexture, subresource, MapMode.WriteDiscard, MapFlags.None); + int rowPitch = rectangle.RowPitch; + + unsafe + { + GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned); + byte* colorData = (byte*)handle.AddrOfPinnedObject(); + + byte* pTexels = (byte*)rectangle.DataPointer; + int srcIndex = 0; + + for (int row = 0; row < Height; row++) + { + int rowStart = row * rowPitch; + + for (int col = 0; col < Width; col++) + { + int colStart = col * formatSize; + pTexels[rowStart + colStart + 0] = colorData[srcIndex++]; + pTexels[rowStart + colStart + 1] = colorData[srcIndex++]; + pTexels[rowStart + colStart + 2] = colorData[srcIndex++]; + pTexels[rowStart + colStart + 3] = colorData[srcIndex++]; + } + } + + handle.Free(); + } + + context.UnmapSubresource(this.nativeTexture, subresource); + } + else if (surfaceFormat == SurfaceFormat.Dxt5 || surfaceFormat == SurfaceFormat.Dxt3 || surfaceFormat == SurfaceFormat.Dxt1) + { + unsafe + { + GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned); + byte* colorData = (byte*)handle.AddrOfPinnedObject(); + + int w = (Width + 3) >> 2; + int h = (Height + 3) >> 2; + formatSize = (surfaceFormat == SurfaceFormat.Dxt1) ? 8 : 16; + + int subresource = SharpDX.Direct3D11.Texture2D.CalculateSubResourceIndex(0, 0, 1); + SharpDX.DataBox rectangle = context.MapSubresource(this.nativeTexture, subresource, MapMode.WriteDiscard, MapFlags.None); + SharpDX.DataStream ds = new SharpDX.DataStream(rectangle.DataPointer, Width * Height * 4 * 2, true, true); + int pitch = rectangle.RowPitch; + int col = 0; + int index = 0; // startIndex + int count = data.Length; // elementCount + int actWidth = w * formatSize; + + for (int i = 0; i < h; i++) + { + ds.Position = (i * pitch) + (col * formatSize); + if (count <= 0) + { + break; + } + else if (count < actWidth) + { + for (int idx = index; idx < index + count; idx++) + { + ds.WriteByte(colorData[idx]); + } + break; + } + + for (int idx = index; idx < index + actWidth; idx++) + { + ds.WriteByte(colorData[idx]); + } + + index += actWidth; + count -= actWidth; + } + + handle.Free(); + + context.UnmapSubresource(this.nativeTexture, subresource); + } + } + else + { + throw new Exception(string.Format("creating textures of format {0} not yet implemented...", surfaceFormat.ToString())); + } + } + + public int Width + { + get + { + if (this.nativeTexture != null) + { + return this.nativeTexture.Description.Width; + } + + return 0; + } + } + + public int Height + { + get + { + if (this.nativeTexture != null) + { + return this.nativeTexture.Description.Height; + } + + return 0; + } + } + + public GraphicsDevice GraphicsDevice + { + get + { + return this.graphicsDevice; + } + } + + public void Dispose() + { + if (this.nativeShaderResourceView != null) + { + this.nativeShaderResourceView.Dispose(); + this.nativeShaderResourceView = null; + } + + if (this.nativeTexture != null) + { + this.nativeTexture.Dispose(); + this.nativeTexture = null; + } + } + } +} diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/VertexBuffer_DX11.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/VertexBuffer_DX11.cs index b6d728ea..1249a69a 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX11/VertexBuffer_DX11.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/VertexBuffer_DX11.cs @@ -6,6 +6,7 @@ using System.Text; using ANX.Framework.NonXNA; using SharpDX.Direct3D11; using ANX.Framework.Graphics; +using System.Runtime.InteropServices; #endregion // Using Statements @@ -68,11 +69,11 @@ namespace ANX.RenderSystem.Windows.DX11 this.vertexStride = vertexDeclaration.VertexStride; //TODO: translate and use usage - - GraphicsDeviceWindowsDX11 gd11 = graphics.NativeDevice as GraphicsDeviceWindowsDX11; - SharpDX.Direct3D11.Device device = gd11 != null ? gd11.NativeDevice as SharpDX.Direct3D11.Device : null; - if (device != null) + GraphicsDeviceWindowsDX11 gd11 = graphics.NativeDevice as GraphicsDeviceWindowsDX11; + SharpDX.Direct3D11.DeviceContext context = gd11 != null ? gd11.NativeDevice as SharpDX.Direct3D11.DeviceContext : null; + + if (context != null) { BufferDescription description = new BufferDescription() { @@ -83,7 +84,7 @@ namespace ANX.RenderSystem.Windows.DX11 OptionFlags = ResourceOptionFlags.None }; - this.buffer = new SharpDX.Direct3D11.Buffer(device, description); + this.buffer = new SharpDX.Direct3D11.Buffer(context.Device, description); //this.buffer.Unmap(); } } @@ -95,25 +96,33 @@ namespace ANX.RenderSystem.Windows.DX11 throw new NotImplementedException("currently starIndex and elementCount of SetData are not implemented"); } + GraphicsDeviceWindowsDX11 dx11GraphicsDevice = graphicsDevice.NativeDevice as GraphicsDeviceWindowsDX11; + DeviceContext context = dx11GraphicsDevice.NativeDevice; + //TODO: check offsetInBytes parameter for bounds etc. - throw new NotImplementedException(); + GCHandle pinnedArray = GCHandle.Alloc(data, GCHandleType.Pinned); + IntPtr dataPointer = pinnedArray.AddrOfPinnedObject(); - /* - using (var vData = new SharpDX.DataStream(data, true, false)) + int dataLength = Marshal.SizeOf(typeof(T)) * data.Length; + + unsafe { - if (offsetInBytes > 0) + using (var vData = new SharpDX.DataStream(dataPointer, dataLength, true, false)) { - vData.Seek(offsetInBytes / vertexStride, System.IO.SeekOrigin.Begin); - } + if (offsetInBytes > 0) + { + vData.Seek(offsetInBytes / vertexStride, System.IO.SeekOrigin.Begin); + } - using (var d = buffer.Map(MapMode.WriteDiscard)) - { - vData.CopyTo(d); - buffer.Unmap(); + SharpDX.DataStream stream; + SharpDX.DataBox box = context.MapSubresource(this.buffer, MapMode.WriteDiscard, MapFlags.None, out stream); + vData.CopyTo(stream); + context.UnmapSubresource(this.buffer, 0); } } - */ + + pinnedArray.Free(); } public void SetData(GraphicsDevice graphicsDevice, T[] data) where T : struct diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/WindowsGameHost.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/WindowsGameHost.cs new file mode 100644 index 00000000..feb5fc42 --- /dev/null +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/WindowsGameHost.cs @@ -0,0 +1,137 @@ +#region Using Statements +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using ANX.Framework.Windows.DX10; +using ANX.Framework.Input; +using ANX.Framework; + +#endregion // Using Statements + +#region License + +// +// This file is part of the ANX.Framework created by the "ANX.Framework developer group". +// +// This file is released under the Ms-PL license. +// +// +// +// Microsoft Public License (Ms-PL) +// +// This license governs use of the accompanying software. If you use the software, you accept this license. +// If you do not accept the license, do not use the software. +// +// 1.Definitions +// The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning +// here as under U.S. copyright law. +// A "contribution" is the original software, or any additions or changes to the software. +// A "contributor" is any person that distributes its contribution under this license. +// "Licensed patents" are a contributor's patent claims that read directly on its contribution. +// +// 2.Grant of Rights +// (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations +// in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to +// reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution +// or any derivative works that you create. +// (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in +// section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed +// patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution +// in the software or derivative works of the contribution in the software. +// +// 3.Conditions and Limitations +// (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. +// (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your +// patent license from such contributor to the software ends automatically. +// (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution +// notices that are present in the software. +// (D) If you distribute any portion of the software in source code form, you may do so only under this license by including +// a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or +// object code form, you may only do so under a license that complies with this license. +// (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, +// or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the +// extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a +// particular purpose and non-infringement. + +#endregion // License + +namespace ANX.RenderSystem.Windows.DX11 +{ + public class WindowsGameHost : GameHost + { + private Game game; + private WindowsGameWindow gameWindow; + private bool exitRequested; + + public WindowsGameHost(Game game) + : base(game) + { + this.game = game; + //this.LockThreadToProcessor(); + this.gameWindow = new WindowsGameWindow(); + Mouse.WindowHandle = this.gameWindow.Handle; //TODO: find a way to initialize all InputSystems with one Handle + Keyboard.WindowHandle = this.gameWindow.Handle; + //TouchPanel.WindowHandle = this.gameWindow.Handle; + //this.gameWindow.IsMouseVisible = game.IsMouseVisible; + this.gameWindow.Activated += new EventHandler(this.GameWindowActivated); + this.gameWindow.Deactivated += new EventHandler(this.GameWindowDeactivated); + //this.gameWindow.Suspend += new EventHandler(this.GameWindowSuspend); + //this.gameWindow.Resume += new EventHandler(this.GameWindowResume); + + } + + public override void Run() + { + Application.Idle += new EventHandler(this.ApplicationIdle); + Application.Run(this.gameWindow.Form); + Application.Idle -= this.ApplicationIdle; + } + + public void RunOneFrame() + { + //this.gameWindow.Tick(); + base.OnIdle(); + } + + public override GameWindow Window + { + get + { + return this.gameWindow; + } + } + + public override void Exit() + { + this.exitRequested = true; + } + + private void GameWindowActivated(object sender, EventArgs e) + { + base.OnActivated(); + } + + private void GameWindowDeactivated(object sender, EventArgs e) + { + base.OnDeactivated(); + } + + private void ApplicationIdle(object sender, EventArgs e) + { + NativeMethods.Message message; + while (!NativeMethods.PeekMessage(out message, IntPtr.Zero, 0, 0, 0)) + { + if (this.exitRequested) + { + this.gameWindow.Close(); + } + else + { + this.RunOneFrame(); + } + } + } + } +} diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/WindowsGameWindow.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/WindowsGameWindow.cs new file mode 100644 index 00000000..6266e18e --- /dev/null +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/WindowsGameWindow.cs @@ -0,0 +1,163 @@ +#region Using Statements +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using SharpDX.Windows; +using ANX.Framework; + +#endregion // Using Statements + +#region License + +// +// This file is part of the ANX.Framework created by the "ANX.Framework developer group". +// +// This file is released under the Ms-PL license. +// +// +// +// Microsoft Public License (Ms-PL) +// +// This license governs use of the accompanying software. If you use the software, you accept this license. +// If you do not accept the license, do not use the software. +// +// 1.Definitions +// The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning +// here as under U.S. copyright law. +// A "contribution" is the original software, or any additions or changes to the software. +// A "contributor" is any person that distributes its contribution under this license. +// "Licensed patents" are a contributor's patent claims that read directly on its contribution. +// +// 2.Grant of Rights +// (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations +// in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to +// reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution +// or any derivative works that you create. +// (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in +// section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed +// patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution +// in the software or derivative works of the contribution in the software. +// +// 3.Conditions and Limitations +// (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. +// (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your +// patent license from such contributor to the software ends automatically. +// (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution +// notices that are present in the software. +// (D) If you distribute any portion of the software in source code form, you may do so only under this license by including +// a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or +// object code form, you may only do so under a license that complies with this license. +// (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, +// or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the +// extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a +// particular purpose and non-infringement. + +#endregion // License + +namespace ANX.RenderSystem.Windows.DX11 +{ + internal class WindowsGameWindow : GameWindow + { + #region Private Members + private RenderForm gameWindow; + + #endregion // Private Members + + internal WindowsGameWindow() + { + this.gameWindow = new RenderForm("ANX.Framework"); + + this.gameWindow.Width = 800; + this.gameWindow.Height = 480; + + this.gameWindow.MaximizeBox = false; + this.gameWindow.FormBorderStyle = FormBorderStyle.Fixed3D; + } + + public void Close() + { + if (gameWindow != null) + { + gameWindow.Close(); + } + } + + public Form Form + { + get + { + return gameWindow; + } + } + + public override IntPtr Handle + { + get + { + return gameWindow.Handle; + } + } + + public override bool IsMinimized + { + get + { + return gameWindow.WindowState == FormWindowState.Minimized; + } + } + + public override void BeginScreenDeviceChange(bool willBeFullScreen) + { + throw new NotImplementedException(); + } + + public override void EndScreenDeviceChange(string screenDeviceName, int clientWidth, int clientHeight) + { + throw new NotImplementedException(); + } + + protected override void SetTitle(string title) + { + this.gameWindow.Text = title; + } + + public override bool AllowUserResizing + { + get + { + return gameWindow.FormBorderStyle == FormBorderStyle.Sizable; + } + set + { + if (value) + { + gameWindow.FormBorderStyle = FormBorderStyle.Sizable; + } + else + { + gameWindow.FormBorderStyle = FormBorderStyle.Fixed3D; + } + } + } + + public override Rectangle ClientBounds + { + get + { + return new Rectangle(this.gameWindow.ClientRectangle.Left, this.gameWindow.ClientRectangle.Top, this.gameWindow.ClientRectangle.Width, this.gameWindow.ClientRectangle.Height); + } + } + + public override string ScreenDeviceName + { + get { throw new NotImplementedException(); } + } + + public override DisplayOrientation CurrentOrientation + { + get { throw new NotImplementedException(); } + } + } +} diff --git a/Samples/SimpleSprite/Program.cs b/Samples/SimpleSprite/Program.cs index e7b29cce..9a2b5764 100644 --- a/Samples/SimpleSprite/Program.cs +++ b/Samples/SimpleSprite/Program.cs @@ -11,7 +11,9 @@ namespace WindowsGame1 /// static void Main(string[] args) { - //AddInSystemFactory.Instance.PreferredRenderSystem = "OpenGL3"; + //AddInSystemFactory.Instance.PreferredRenderSystem = "OpenGL3"; + //AddInSystemFactory.Instance.PreferredRenderSystem = "DirectX11"; + using (Game1 game = new Game1()) { game.Run(); diff --git a/Samples/SimpleSprite/SimpleSprite.csproj b/Samples/SimpleSprite/SimpleSprite.csproj index 8072e9e8..ed7f2d85 100644 --- a/Samples/SimpleSprite/SimpleSprite.csproj +++ b/Samples/SimpleSprite/SimpleSprite.csproj @@ -95,6 +95,10 @@ {EB8258E0-6741-4DB9-B756-1EBDF67B1ED6} ANX.Framework.Windows.GL3 + + {B30DE9C2-0926-46B6-8351-9AF276C472D5} + ANX.RenderSystem.Windows.DX11 + {6A582788-C4D2-410C-96CD-177F75712D65} ANX.SoundSystem.Windows.XAudio diff --git a/Tools/StockShaderCodeGenerator/Compiler.cs b/Tools/StockShaderCodeGenerator/Compiler.cs index fc3318e5..3343a01b 100644 --- a/Tools/StockShaderCodeGenerator/Compiler.cs +++ b/Tools/StockShaderCodeGenerator/Compiler.cs @@ -6,6 +6,7 @@ using System.Text; using ANX.Framework.Windows.DX10; using ANX.Framework.Windows.GL3; using System.IO; +using ANX.RenderSystem.Windows.DX11; #endregion // Using Statements @@ -103,6 +104,9 @@ namespace StockShaderCodeGenerator case "ANX.Framework.Windows.DX10": byteCode = Effect_DX10.CompileFXShader(sourceCode); break; + case "ANX.RenderSystem.Windows.DX11": + byteCode = Effect_DX11.CompileFXShader(sourceCode); + break; case "ANX.Framework.Windows.GL3": byteCode = EffectGL3.CompileShader(sourceCode); break; diff --git a/Tools/StockShaderCodeGenerator/Properties/AssemblyInfo.cs b/Tools/StockShaderCodeGenerator/Properties/AssemblyInfo.cs index f2910f9f..cc7ec5cb 100644 --- a/Tools/StockShaderCodeGenerator/Properties/AssemblyInfo.cs +++ b/Tools/StockShaderCodeGenerator/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern // übernehmen, indem Sie "*" eingeben: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.8.0.*")] -[assembly: AssemblyFileVersion("0.8.0.0")] +[assembly: AssemblyVersion("0.8.1.*")] +[assembly: AssemblyFileVersion("0.8.1.0")] diff --git a/Tools/StockShaderCodeGenerator/StockShaderCodeGenerator.csproj b/Tools/StockShaderCodeGenerator/StockShaderCodeGenerator.csproj index 4d4b28af..7703df4a 100644 --- a/Tools/StockShaderCodeGenerator/StockShaderCodeGenerator.csproj +++ b/Tools/StockShaderCodeGenerator/StockShaderCodeGenerator.csproj @@ -63,6 +63,10 @@ {EB8258E0-6741-4DB9-B756-1EBDF67B1ED6} ANX.Framework.Windows.GL3 + + {B30DE9C2-0926-46B6-8351-9AF276C472D5} + ANX.RenderSystem.Windows.DX11 +