diff --git a/ANX.Framework.Content.Pipeline/Tasks/BuildContentTask.cs b/ANX.Framework.Content.Pipeline/Tasks/BuildContentTask.cs index ca9cbd5b..1b09d0be 100644 --- a/ANX.Framework.Content.Pipeline/Tasks/BuildContentTask.cs +++ b/ANX.Framework.Content.Pipeline/Tasks/BuildContentTask.cs @@ -290,7 +290,6 @@ namespace ANX.Framework.Content.Pipeline.Tasks { if (BuildCache.IsValid(buildItem, outputFilename)) { - BuildLogger.LogMessage("---\"{0}\" still valid, skipping build.", buildItem.SourceFilename); return true; } return false; diff --git a/ANX.Framework/Graphics/AlphaTestEffect.cs b/ANX.Framework/Graphics/AlphaTestEffect.cs index 76420785..55f1c91d 100644 --- a/ANX.Framework/Graphics/AlphaTestEffect.cs +++ b/ANX.Framework/Graphics/AlphaTestEffect.cs @@ -151,8 +151,7 @@ namespace ANX.Framework.Graphics } #endregion - #region PreBindSetParameters - internal override void PreBindSetParameters() + protected internal override void OnApply() { Matrix worldView; Matrix.Multiply(ref world, ref view, out worldView); @@ -173,7 +172,6 @@ namespace ANX.Framework.Graphics else Parameters["FogVector"].SetValue(Vector4.Zero); } - #endregion #region SetAlphaTestValue private void SetAlphaTestValue() diff --git a/ANX.Framework/Graphics/BasicEffect.cs b/ANX.Framework/Graphics/BasicEffect.cs index 314c3345..e53175be 100644 --- a/ANX.Framework/Graphics/BasicEffect.cs +++ b/ANX.Framework/Graphics/BasicEffect.cs @@ -244,8 +244,7 @@ namespace ANX.Framework.Graphics } #endregion - #region PreBindSetParameters - internal override void PreBindSetParameters() + protected internal override void OnApply() { Matrix worldView; Matrix.Multiply(ref world, ref view, out worldView); @@ -270,7 +269,6 @@ namespace ANX.Framework.Graphics SelectTechnique(); } - #endregion #region SelectTechnique private void SelectTechnique() diff --git a/ANX.Framework/Graphics/DualTextureEffect.cs b/ANX.Framework/Graphics/DualTextureEffect.cs index cace809a..303ebdc9 100644 --- a/ANX.Framework/Graphics/DualTextureEffect.cs +++ b/ANX.Framework/Graphics/DualTextureEffect.cs @@ -136,8 +136,7 @@ namespace ANX.Framework.Graphics } #endregion - #region PreBindSetParameters - internal override void PreBindSetParameters() + protected internal override void OnApply() { Matrix worldView; Matrix.Multiply(ref world, ref view, out worldView); @@ -158,7 +157,6 @@ namespace ANX.Framework.Graphics else Parameters["FogVector"].SetValue(Vector4.Zero); } - #endregion #region SelectTechnique private void SelectTechnique() diff --git a/ANX.Framework/Graphics/Effect.cs b/ANX.Framework/Graphics/Effect.cs index 911be9a4..69ea7cf4 100644 --- a/ANX.Framework/Graphics/Effect.cs +++ b/ANX.Framework/Graphics/Effect.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Linq; using System.Runtime.InteropServices; using ANX.Framework.NonXNA; using ANX.Framework.NonXNA.Development; @@ -19,6 +20,7 @@ namespace ANX.Framework.Graphics private INativeEffect nativeEffect; private readonly byte[] byteCode; private EffectSourceLanguage sourceLanguage; + private EffectTechnique currentTechnique; #endregion #region Public @@ -26,29 +28,39 @@ namespace ANX.Framework.Graphics { get { - if (nativeEffect == null) - { - CreateNativeEffect(this.sourceLanguage); - } - return this.nativeEffect; } } - public EffectTechnique CurrentTechnique { get; set; } + public EffectTechnique CurrentTechnique + { + get { return this.currentTechnique; } + set + { + if (value == null) + throw new ArgumentNullException("value"); + + if (!Techniques.Contains(value)) + throw new InvalidOperationException("CurrentTechnique must be a technique of the same effect instance."); + + this.currentTechnique = value; + } + } + public EffectParameterCollection Parameters { get; private set; } public EffectTechniqueCollection Techniques { get; private set; } #endregion - #region Constructor protected Effect(Effect cloneSource) : this(cloneSource.GraphicsDevice, cloneSource.byteCode) { + CreateNativeEffect(cloneSource.sourceLanguage); } public Effect(GraphicsDevice graphicsDevice, byte[] byteCode) : this(graphicsDevice, byteCode, EffectSourceLanguage.HLSL_FX) { + CreateNativeEffect(EffectSourceLanguage.HLSL_FX); } public Effect(GraphicsDevice graphicsDevice, byte[] byteCode, EffectSourceLanguage sourceLanguage) @@ -67,14 +79,6 @@ namespace ANX.Framework.Graphics this.sourceLanguage = sourceLanguage; } - ~Effect() - { - Dispose(); - base.GraphicsDevice.ResourceCreated -= GraphicsDevice_ResourceCreated; - base.GraphicsDevice.ResourceDestroyed -= GraphicsDevice_ResourceDestroyed; - } - #endregion - #region GraphicsDevice_ResourceCreated private void GraphicsDevice_ResourceCreated(object sender, ResourceCreatedEventArgs e) { @@ -106,14 +110,9 @@ namespace ANX.Framework.Graphics } #endregion - #region PreBindSetParameters - /// - /// This is used by the built in effects to set all their parameters only once and not everytime the properties change. - /// - internal virtual void PreBindSetParameters() - { - } - #endregion + protected internal virtual void OnApply() + { + } #region Dispose protected override void Dispose(bool disposeManaged) @@ -125,6 +124,23 @@ namespace ANX.Framework.Graphics nativeEffect.Dispose(); nativeEffect = null; } + + if (Parameters != null) + { + foreach (var parameter in Parameters) + parameter.NativeParameter.Dispose(); + Parameters = null; + } + + if (Techniques != null) + { + foreach (var technique in Techniques) + technique.NativeTechnique.Dispose(); + Techniques = null; + } + + base.GraphicsDevice.ResourceCreated -= GraphicsDevice_ResourceCreated; + base.GraphicsDevice.ResourceDestroyed -= GraphicsDevice_ResourceDestroyed; } base.Dispose(disposeManaged); @@ -139,8 +155,8 @@ namespace ANX.Framework.Graphics if (creator.IsLanguageSupported(sourceLanguage)) { this.nativeEffect = creator.CreateEffect(GraphicsDevice, this, new MemoryStream(this.byteCode, false)); - this.Techniques = new EffectTechniqueCollection(this, this.nativeEffect); - this.Parameters = new EffectParameterCollection(this, this.nativeEffect); + this.Techniques = new EffectTechniqueCollection(this.nativeEffect.Techniques); + this.Parameters = new EffectParameterCollection(this.nativeEffect.Parameters); } else throw new InvalidOperationException("couldn't create " + sourceLanguage + " native effect using RenderSystem " + diff --git a/ANX.Framework/Graphics/EffectAnnotation.cs b/ANX.Framework/Graphics/EffectAnnotation.cs index 4a03f3be..466cdaa8 100644 --- a/ANX.Framework/Graphics/EffectAnnotation.cs +++ b/ANX.Framework/Graphics/EffectAnnotation.cs @@ -13,81 +13,85 @@ namespace ANX.Framework.Graphics [TestState(TestStateAttribute.TestState.Untested)] public sealed class EffectAnnotation { - private readonly INativeEffectAnnotation nativeAnnotation; + internal INativeEffectAnnotation NativeAnnotation + { + get; + private set; + } public int ColumnCount { - get { return nativeAnnotation.ColumnCount; } + get { return NativeAnnotation.ColumnCount; } } public string Name { - get { return nativeAnnotation.Name; } + get { return NativeAnnotation.Name; } } public EffectParameterClass ParameterClass { - get { return nativeAnnotation.ParameterClass; } + get { return NativeAnnotation.ParameterClass; } } public EffectParameterType ParameterType { - get { return nativeAnnotation.ParameterType; } + get { return NativeAnnotation.ParameterType; } } public int RowCount { - get { return nativeAnnotation.RowCount; } + get { return NativeAnnotation.RowCount; } } public string Semantic { - get { return nativeAnnotation.Semantic; } + get { return NativeAnnotation.Semantic; } } internal EffectAnnotation(INativeEffectAnnotation setNativeAnnotation) { - nativeAnnotation = setNativeAnnotation; + NativeAnnotation = setNativeAnnotation; } public bool GetValueBoolean() { - return nativeAnnotation.GetValueBoolean(); + return NativeAnnotation.GetValueBoolean(); } public int GetValueInt32() { - return nativeAnnotation.GetValueInt32(); + return NativeAnnotation.GetValueInt32(); } public Matrix GetValueMatrix() { - return nativeAnnotation.GetValueMatrix(); + return NativeAnnotation.GetValueMatrix(); } public float GetValueSingle() { - return nativeAnnotation.GetValueSingle(); + return NativeAnnotation.GetValueSingle(); } public string GetValueString() { - return nativeAnnotation.GetValueString(); + return NativeAnnotation.GetValueString(); } public Vector2 GetValueVector2() { - return nativeAnnotation.GetValueVector2(); + return NativeAnnotation.GetValueVector2(); } public Vector3 GetValueVector3() { - return nativeAnnotation.GetValueVector3(); + return NativeAnnotation.GetValueVector3(); } public Vector4 GetValueVector4() { - return nativeAnnotation.GetValueVector4(); + return NativeAnnotation.GetValueVector4(); } } } diff --git a/ANX.Framework/Graphics/EffectAnnotationCollection.cs b/ANX.Framework/Graphics/EffectAnnotationCollection.cs index 0a70c6d1..06d4da61 100644 --- a/ANX.Framework/Graphics/EffectAnnotationCollection.cs +++ b/ANX.Framework/Graphics/EffectAnnotationCollection.cs @@ -35,9 +35,9 @@ namespace ANX.Framework.Graphics get { return annotations.FirstOrDefault(annotation => annotation.Name == name); } } - internal EffectAnnotationCollection(List setAnnotations) + internal EffectAnnotationCollection(IEnumerable setAnnotations) { - annotations = setAnnotations ?? new List(); + annotations = new List(setAnnotations); } IEnumerator IEnumerable.GetEnumerator() diff --git a/ANX.Framework/Graphics/EffectParameter.cs b/ANX.Framework/Graphics/EffectParameter.cs index 62e536ec..ab73eb60 100644 --- a/ANX.Framework/Graphics/EffectParameter.cs +++ b/ANX.Framework/Graphics/EffectParameter.cs @@ -14,271 +14,275 @@ namespace ANX.Framework.Graphics [Developer("Glatzemann")] public sealed class EffectParameter { - private readonly INativeEffectParameter nativeParameter; + internal INativeEffectParameter NativeParameter + { + get; + private set; + } #region Public public EffectAnnotationCollection Annotations { - get { return nativeParameter.Annotations; } + get { return NativeParameter.Annotations; } } public EffectParameterCollection Elements { - get { return nativeParameter.Elements; } + get { return NativeParameter.Elements; } } public EffectParameterCollection StructureMembers { - get { return nativeParameter.StructureMembers; } + get { return NativeParameter.StructureMembers; } } public int ColumnCount { - get { return nativeParameter.ColumnCount; } + get { return NativeParameter.ColumnCount; } } public string Name { - get { return nativeParameter.Name; } + get { return NativeParameter.Name; } } public EffectParameterClass ParameterClass { - get { return nativeParameter.ParameterClass; } + get { return NativeParameter.ParameterClass; } } public EffectParameterType ParameterType { - get { return nativeParameter.ParameterType; } + get { return NativeParameter.ParameterType; } } public int RowCount { - get { return nativeParameter.RowCount; } + get { return NativeParameter.RowCount; } } public string Semantic { - get { return nativeParameter.Semantic; } + get { return NativeParameter.Semantic; } } #endregion internal EffectParameter(INativeEffectParameter nativeParameter) { - this.nativeParameter = nativeParameter; + this.NativeParameter = nativeParameter; } #region GetValue public bool GetValueBoolean() { - return nativeParameter.GetValueBoolean(); + return NativeParameter.GetValueBoolean(); } public bool[] GetValueBooleanArray(int count) { - return nativeParameter.GetValueBooleanArray(count); + return NativeParameter.GetValueBooleanArray(count); } public int GetValueInt32() { - return nativeParameter.GetValueInt32(); + return NativeParameter.GetValueInt32(); } public Int32[] GetValueInt32Array(int count) { - return nativeParameter.GetValueInt32Array(count); + return NativeParameter.GetValueInt32Array(count); } public Matrix GetValueMatrix() { - return nativeParameter.GetValueMatrix(); + return NativeParameter.GetValueMatrix(); } public Matrix[] GetValueMatrixArray(int count) { - return nativeParameter.GetValueMatrixArray(count); + return NativeParameter.GetValueMatrixArray(count); } public Matrix GetValueMatrixTranspose() { - return nativeParameter.GetValueMatrixTranspose(); + return NativeParameter.GetValueMatrixTranspose(); } public Matrix[] GetValueMatrixTransposeArray(int count) { - return nativeParameter.GetValueMatrixTransposeArray(count); + return NativeParameter.GetValueMatrixTransposeArray(count); } public Quaternion GetValueQuaternion() { - return nativeParameter.GetValueQuaternion(); + return NativeParameter.GetValueQuaternion(); } public Quaternion[] GetValueQuaternionArray(int count) { - return nativeParameter.GetValueQuaternionArray(count); + return NativeParameter.GetValueQuaternionArray(count); } public float GetValueSingle() { - return nativeParameter.GetValueSingle(); + return NativeParameter.GetValueSingle(); } public float[] GetValueSingleArray(int count) { - return nativeParameter.GetValueSingleArray(count); + return NativeParameter.GetValueSingleArray(count); } public string GetValueString() { - return nativeParameter.GetValueString(); + return NativeParameter.GetValueString(); } public Texture2D GetValueTexture2D() { - return nativeParameter.GetValueTexture2D(); + return NativeParameter.GetValueTexture2D(); } public Texture3D GetValueTexture3D() { - return nativeParameter.GetValueTexture3D(); + return NativeParameter.GetValueTexture3D(); } public TextureCube GetValueTextureCube() { - return nativeParameter.GetValueTextureCube(); + return NativeParameter.GetValueTextureCube(); } public Vector2 GetValueVector2() { - return nativeParameter.GetValueVector2(); + return NativeParameter.GetValueVector2(); } public Vector2[] GetValueVector2Array(int count) { - return nativeParameter.GetValueVector2Array(count); + return NativeParameter.GetValueVector2Array(count); } public Vector3 GetValueVector3() { - return nativeParameter.GetValueVector3(); + return NativeParameter.GetValueVector3(); } public Vector3[] GetValueVector3Array(int count) { - return nativeParameter.GetValueVector3Array(count); + return NativeParameter.GetValueVector3Array(count); } public Vector4 GetValueVector4() { - return nativeParameter.GetValueVector4(); + return NativeParameter.GetValueVector4(); } public Vector4[] GetValueVector4Array(int count) { - return nativeParameter.GetValueVector4Array(count); + return NativeParameter.GetValueVector4Array(count); } #endregion #region SetValue public void SetValue([MarshalAs(UnmanagedType.U1)] bool value) { - nativeParameter.SetValue(value); + NativeParameter.SetValue(value); } public void SetValue(bool[] value) { - nativeParameter.SetValue(value); + NativeParameter.SetValue(value); } public void SetValue(int value) { - nativeParameter.SetValue(value); + NativeParameter.SetValue(value); } public void SetValue(int[] value) { - nativeParameter.SetValue(value); + NativeParameter.SetValue(value); } public void SetValue(Matrix value) { - nativeParameter.SetValue(value, false); + NativeParameter.SetValue(value, false); } public void SetValue(Matrix[] value) { - nativeParameter.SetValue(value, false); + NativeParameter.SetValue(value, false); } public void SetValue(Quaternion value) { - nativeParameter.SetValue(value); + NativeParameter.SetValue(value); } public void SetValue(Quaternion[] value) { - nativeParameter.SetValue(value); + NativeParameter.SetValue(value); } public void SetValue(float value) { - nativeParameter.SetValue(value); + NativeParameter.SetValue(value); } public void SetValue(float[] value) { - nativeParameter.SetValue(value); + NativeParameter.SetValue(value); } public void SetValue(string value) { - nativeParameter.SetValue(value); + NativeParameter.SetValue(value); } public void SetValue(Texture value) { - nativeParameter.SetValue(value); + NativeParameter.SetValue(value); } public void SetValue(Vector2 value) { - nativeParameter.SetValue(value); + NativeParameter.SetValue(value); } public void SetValue(Vector2[] value) { - nativeParameter.SetValue(value); + NativeParameter.SetValue(value); } public void SetValue(Vector3 value) { - nativeParameter.SetValue(value); + NativeParameter.SetValue(value); } public void SetValue(Vector3[] value) { - nativeParameter.SetValue(value); + NativeParameter.SetValue(value); } public void SetValue(Vector4 value) { - nativeParameter.SetValue(value); + NativeParameter.SetValue(value); } public void SetValue(Vector4[] value) { - nativeParameter.SetValue(value); + NativeParameter.SetValue(value); } public void SetValueTranspose(Matrix value) { - nativeParameter.SetValue(value, true); + NativeParameter.SetValue(value, true); } public void SetValueTranspose(Matrix[] value) { - nativeParameter.SetValue(value, true); + NativeParameter.SetValue(value, true); } #endregion } diff --git a/ANX.Framework/Graphics/EffectParameterCollection.cs b/ANX.Framework/Graphics/EffectParameterCollection.cs index a2f5f00e..a27cc2c8 100644 --- a/ANX.Framework/Graphics/EffectParameterCollection.cs +++ b/ANX.Framework/Graphics/EffectParameterCollection.cs @@ -20,8 +20,6 @@ namespace ANX.Framework.Graphics public sealed class EffectParameterCollection : IEnumerable { #region Private Members - private Effect parentEffect; - private INativeEffect nativeEffect; private List parameters; #endregion @@ -40,16 +38,9 @@ namespace ANX.Framework.Graphics get { return parameters.Count; } } - internal EffectParameterCollection(Effect parentEffect, INativeEffect nativeEffect) + internal EffectParameterCollection(IEnumerable parameters) { - this.parentEffect = parentEffect; - this.nativeEffect = nativeEffect; - this.parameters = new List(); - - foreach (EffectParameter p in nativeEffect.Parameters) - { - this.parameters.Add(p); - } + this.parameters = new List(parameters); } public EffectParameter GetParameterBySemantic(string semantic) diff --git a/ANX.Framework/Graphics/EffectPass.cs b/ANX.Framework/Graphics/EffectPass.cs index d6b99619..52834539 100644 --- a/ANX.Framework/Graphics/EffectPass.cs +++ b/ANX.Framework/Graphics/EffectPass.cs @@ -1,5 +1,6 @@ using System; using ANX.Framework.NonXNA.Development; +using ANX.Framework.NonXNA; // This file is part of the ANX.Framework created by the // "ANX.Framework developer group" and released under the Ms-PL license. @@ -14,21 +15,33 @@ namespace ANX.Framework.Graphics { private readonly Effect parentEffect; - public string Name { get; private set; } - public EffectAnnotationCollection Annotations { get; private set; } - - internal EffectPass(Effect parentEffect) + internal INativeEffectPass NativeEffectPass { - if (parentEffect == null) - throw new ArgumentNullException("parentEffect"); + get; + private set; + } - this.parentEffect = parentEffect; + public string Name + { + get { return this.NativeEffectPass.Name; } + } + + public EffectAnnotationCollection Annotations + { + get { return this.NativeEffectPass.Annotations; } + } + + internal EffectPass(INativeEffectPass nativeEffectPass) + { + if (nativeEffectPass == null) + throw new ArgumentNullException("nativeEffectPass"); + + this.NativeEffectPass = nativeEffectPass; } public void Apply() { - parentEffect.PreBindSetParameters(); - parentEffect.NativeEffect.Apply(parentEffect.GraphicsDevice); + this.NativeEffectPass.Apply(); } } } diff --git a/ANX.Framework/Graphics/EffectTechniqueCollection.cs b/ANX.Framework/Graphics/EffectTechniqueCollection.cs index e7a577c1..45009f23 100644 --- a/ANX.Framework/Graphics/EffectTechniqueCollection.cs +++ b/ANX.Framework/Graphics/EffectTechniqueCollection.cs @@ -21,8 +21,6 @@ namespace ANX.Framework.Graphics public sealed class EffectTechniqueCollection : IEnumerable, IEnumerable { #region Private Members - private Effect parentEffect; - private INativeEffect nativeEffect; private List techniques; #endregion // Private Members @@ -42,16 +40,9 @@ namespace ANX.Framework.Graphics get { return techniques.Count; } } - internal EffectTechniqueCollection(Effect parentEffect, INativeEffect nativeEffect) + internal EffectTechniqueCollection(IEnumerable techniques) { - this.parentEffect = parentEffect; - this.nativeEffect = nativeEffect; - this.techniques = new List(); - - foreach (EffectTechnique teq in nativeEffect.Techniques) - { - this.techniques.Add(teq); - } + this.techniques = new List(techniques); } IEnumerator IEnumerable.GetEnumerator() diff --git a/ANX.Framework/Graphics/EnvironmentMapEffect.cs b/ANX.Framework/Graphics/EnvironmentMapEffect.cs index b94f8d1a..ab54277c 100644 --- a/ANX.Framework/Graphics/EnvironmentMapEffect.cs +++ b/ANX.Framework/Graphics/EnvironmentMapEffect.cs @@ -212,8 +212,7 @@ namespace ANX.Framework.Graphics } #endregion - #region PreBindSetParameters - internal override void PreBindSetParameters() + protected internal override void OnApply() { Matrix worldView; Matrix.Multiply(ref world, ref view, out worldView); @@ -242,7 +241,6 @@ namespace ANX.Framework.Graphics SelectTechnique(); } - #endregion #region SelectTechnique private void SelectTechnique() diff --git a/ANX.Framework/Graphics/GraphicsDevice.cs b/ANX.Framework/Graphics/GraphicsDevice.cs index 1484b68f..db0a469f 100644 --- a/ANX.Framework/Graphics/GraphicsDevice.cs +++ b/ANX.Framework/Graphics/GraphicsDevice.cs @@ -16,7 +16,6 @@ namespace ANX.Framework.Graphics public class GraphicsDevice : IDisposable { #region Private Members - private IndexBuffer indexBuffer; private SamplerStateCollection samplerStateCollection; private Viewport viewport; private BlendState blendState; @@ -116,11 +115,9 @@ namespace ANX.Framework.Graphics NativeDevice.Present(); } - public void Present(Nullable sourceRectangle, Nullable destinationRectangle, - WindowHandle overrideWindowHandle) + public void Present(Rectangle? sourceRectangle, Rectangle? destinationRectangle, WindowHandle overrideWindowHandle) { - //TODO: implement - throw new NotImplementedException(); + NativeDevice.Present(sourceRectangle, destinationRectangle, overrideWindowHandle); } #endregion // Present @@ -128,12 +125,7 @@ namespace ANX.Framework.Graphics #region DrawPrimitives & DrawIndexedPrimitives public void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount) { - if (this.indexBuffer == null) - { - throw new InvalidOperationException("you have to set a index buffer before you can draw using DrawIndexedPrimitives"); - } - - NativeDevice.DrawIndexedPrimitives(primitiveType, baseVertex, minVertexIndex, numVertices, startIndex, primitiveCount, this.indexBuffer); + NativeDevice.DrawIndexedPrimitives(primitiveType, baseVertex, minVertexIndex, numVertices, startIndex, primitiveCount); } public void DrawPrimitives(PrimitiveType primitiveType, int startVertex, int primitiveCount) @@ -147,7 +139,7 @@ namespace ANX.Framework.Graphics int startIndex, int primitiveCount, int instanceCount) { NativeDevice.DrawInstancedPrimitives(primitiveType, baseVertex, minVertexIndex, numVertices, startIndex, - primitiveCount, instanceCount, this.indexBuffer); + primitiveCount, instanceCount); } #endregion @@ -403,11 +395,11 @@ namespace ANX.Framework.Graphics { get { - return this.indexBuffer; + return this.NativeDevice.IndexBuffer; } set { - this.indexBuffer = value; + this.NativeDevice.IndexBuffer = value; } } @@ -649,9 +641,6 @@ namespace ANX.Framework.Graphics raise_ResourceCreated(this, new ResourceCreatedEventArgs(NativeDevice)); GraphicsResourceTracker.Instance.UpdateGraphicsDeviceReference(this); - if (this.indexBuffer != null) - NativeDevice.SetIndexBuffer(this.indexBuffer); - if (this.currentVertexBufferBindings != null) NativeDevice.SetVertexBuffers(this.currentVertexBufferBindings); diff --git a/ANX.Framework/Graphics/SkinnedEffect.cs b/ANX.Framework/Graphics/SkinnedEffect.cs index 0a3a8dca..0c4c5933 100644 --- a/ANX.Framework/Graphics/SkinnedEffect.cs +++ b/ANX.Framework/Graphics/SkinnedEffect.cs @@ -274,8 +274,7 @@ namespace ANX.Framework.Graphics } #endregion - #region PreBindSetParameters - internal override void PreBindSetParameters() + protected internal override void OnApply() { Matrix worldView; Matrix.Multiply(ref world, ref view, out worldView); @@ -302,7 +301,6 @@ namespace ANX.Framework.Graphics SelectTechnique(); } - #endregion #region SelectTechnique private void SelectTechnique() diff --git a/ANX.Framework/Graphics/SpriteBatch.cs b/ANX.Framework/Graphics/SpriteBatch.cs index ef31f742..4e50823d 100644 --- a/ANX.Framework/Graphics/SpriteBatch.cs +++ b/ANX.Framework/Graphics/SpriteBatch.cs @@ -470,9 +470,7 @@ namespace ANX.Framework.Graphics this.vertexBuffer.SetData(this.vertices, 0, vertexCount); - SetRenderStates(); - - spriteBatchEffect.Parameters["Texture"].SetValue(this.spriteInfos[offset].texture); + SetRenderStates(offset); GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vertexCount, 0, count * 2); } @@ -568,7 +566,7 @@ namespace ANX.Framework.Graphics #endregion #region SetRenderStates - private void SetRenderStates() + private void SetRenderStates(int offset) { GraphicsDevice.BlendState = blendState != null ? blendState : BlendState.AlphaBlend; GraphicsDevice.DepthStencilState = depthStencilState != null ? depthStencilState : DepthStencilState.None; @@ -598,7 +596,8 @@ namespace ANX.Framework.Graphics Matrix result; Matrix.Multiply(ref transformMatrix, ref cachedTransformMatrix, out result); this.spriteBatchEffect.Parameters["MatrixTransform"].SetValue(result); - spriteBatchEffect.NativeEffect.Apply(GraphicsDevice); + spriteBatchEffect.Parameters["Texture"].SetValue(this.spriteInfos[offset].texture); + spriteBatchEffect.CurrentTechnique.Passes[0].Apply(); GraphicsDevice.Indices = this.indexBuffer; GraphicsDevice.SetVertexBuffer(this.vertexBuffer); diff --git a/ANX.Framework/NonXNA/RenderSystem/INativeEffect.cs b/ANX.Framework/NonXNA/RenderSystem/INativeEffect.cs index 3b72c851..faba30e2 100644 --- a/ANX.Framework/NonXNA/RenderSystem/INativeEffect.cs +++ b/ANX.Framework/NonXNA/RenderSystem/INativeEffect.cs @@ -13,8 +13,6 @@ namespace ANX.Framework.NonXNA { public interface INativeEffect : IDisposable { - void Apply(GraphicsDevice graphicsDevice); - IEnumerable Techniques { get; } IEnumerable Parameters { get; } diff --git a/ANX.Framework/NonXNA/RenderSystem/INativeEffectAnnotation.cs b/ANX.Framework/NonXNA/RenderSystem/INativeEffectAnnotation.cs index 10914d8e..8c66e3ce 100644 --- a/ANX.Framework/NonXNA/RenderSystem/INativeEffectAnnotation.cs +++ b/ANX.Framework/NonXNA/RenderSystem/INativeEffectAnnotation.cs @@ -1,5 +1,6 @@ using ANX.Framework.Graphics; using ANX.Framework.NonXNA.Development; +using System; // This file is part of the ANX.Framework created by the // "ANX.Framework developer group" and released under the Ms-PL license. @@ -10,7 +11,7 @@ namespace ANX.Framework.NonXNA.RenderSystem [PercentageComplete(100)] [Developer("AstrorEnales")] [TestState(TestStateAttribute.TestState.Untested)] - public interface INativeEffectAnnotation + public interface INativeEffectAnnotation : IDisposable { int ColumnCount { get; } string Name { get; } diff --git a/ANX.Framework/NonXNA/RenderSystem/INativeEffectParameter.cs b/ANX.Framework/NonXNA/RenderSystem/INativeEffectParameter.cs index b7155d30..3b013b57 100644 --- a/ANX.Framework/NonXNA/RenderSystem/INativeEffectParameter.cs +++ b/ANX.Framework/NonXNA/RenderSystem/INativeEffectParameter.cs @@ -14,7 +14,7 @@ namespace ANX.Framework.NonXNA [PercentageComplete(100)] [TestState(TestStateAttribute.TestState.Untested)] [Developer("Glatzemann")] - public interface INativeEffectParameter + public interface INativeEffectParameter : IDisposable { string Name { get; } string Semantic { get; } diff --git a/ANX.Framework/NonXNA/RenderSystem/INativeEffectPass.cs b/ANX.Framework/NonXNA/RenderSystem/INativeEffectPass.cs index 60793fc0..3aee2166 100644 --- a/ANX.Framework/NonXNA/RenderSystem/INativeEffectPass.cs +++ b/ANX.Framework/NonXNA/RenderSystem/INativeEffectPass.cs @@ -11,8 +11,12 @@ using ANX.Framework.Graphics; namespace ANX.Framework.NonXNA { - public interface INativeEffectPass + public interface INativeEffectPass : IDisposable { string Name { get; } + + EffectAnnotationCollection Annotations { get; } + + void Apply(); } } diff --git a/ANX.Framework/NonXNA/RenderSystem/INativeEffectTechnique.cs b/ANX.Framework/NonXNA/RenderSystem/INativeEffectTechnique.cs index 5c1df18f..18514eaf 100644 --- a/ANX.Framework/NonXNA/RenderSystem/INativeEffectTechnique.cs +++ b/ANX.Framework/NonXNA/RenderSystem/INativeEffectTechnique.cs @@ -11,7 +11,7 @@ using ANX.Framework.Graphics; namespace ANX.Framework.NonXNA { - public interface INativeEffectTechnique + public interface INativeEffectTechnique : IDisposable { string Name { get; } IEnumerable Passes { get; } diff --git a/ANX.Framework/NonXNA/RenderSystem/INativeGraphicsDevice.cs b/ANX.Framework/NonXNA/RenderSystem/INativeGraphicsDevice.cs index 9bd5ad32..8e102d65 100644 --- a/ANX.Framework/NonXNA/RenderSystem/INativeGraphicsDevice.cs +++ b/ANX.Framework/NonXNA/RenderSystem/INativeGraphicsDevice.cs @@ -13,10 +13,11 @@ namespace ANX.Framework.NonXNA void Present(); - void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, IndexBuffer indexBuffer); + void Present(Rectangle? sourceRectangle, Rectangle? destinationRectangle, WindowHandle overrideWindowHandle); - void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, - int startIndex, int primitiveCount, int instanceCount, IndexBuffer indexBuffer); + void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount); + + void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, int instanceCount); void DrawUserIndexedPrimitives(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int numVertices, Array indexData, int indexOffset, int primitiveCount, VertexDeclaration vertexDeclaration, @@ -33,7 +34,7 @@ namespace ANX.Framework.NonXNA void SetVertexBuffers(VertexBufferBinding[] vertexBuffers); - void SetIndexBuffer(IndexBuffer indexBuffer); + IndexBuffer IndexBuffer { get; set; } void SetViewport(Viewport viewport); diff --git a/RenderSystems/ANX.RenderSystem.DX.SharedSources/DxFormatConverter.cs b/RenderSystems/ANX.RenderSystem.DX.SharedSources/DxFormatConverter.cs index 8528eee0..fdf46224 100644 --- a/RenderSystems/ANX.RenderSystem.DX.SharedSources/DxFormatConverter.cs +++ b/RenderSystems/ANX.RenderSystem.DX.SharedSources/DxFormatConverter.cs @@ -227,55 +227,53 @@ namespace ANX.RenderSystem.Windows.DX11 } #endregion - #region Translate (ShaderVariableType) - public static EffectParameterType Translate(ShaderVariableType type) + public static ANX.Framework.Graphics.EffectParameterClass Translate(this ShaderVariableClass variableClass) { - switch (type) + switch (variableClass) + { + case ShaderVariableClass.Vector: + return Framework.Graphics.EffectParameterClass.Vector; + case ShaderVariableClass.Struct: + return Framework.Graphics.EffectParameterClass.Struct; + case ShaderVariableClass.Scalar: + return Framework.Graphics.EffectParameterClass.Scalar; + case ShaderVariableClass.Object: + return Framework.Graphics.EffectParameterClass.Object; + case ShaderVariableClass.MatrixColumns: + case ShaderVariableClass.MatrixRows: + return Framework.Graphics.EffectParameterClass.Matrix; + default: + return (Framework.Graphics.EffectParameterClass)(-1); + } + } + + public static ANX.Framework.Graphics.EffectParameterType Translate(this ShaderVariableType variableType) + { + switch (variableType) { case ShaderVariableType.Bool: - return EffectParameterType.Bool; - case ShaderVariableType.Texture1D: - return EffectParameterType.Texture1D; - case ShaderVariableType.Texture2D: - return EffectParameterType.Texture2D; - case ShaderVariableType.Texture3D: - return EffectParameterType.Texture3D; - case ShaderVariableType.Texture: - return EffectParameterType.Texture; - case ShaderVariableType.Void: - return EffectParameterType.Void; + return Framework.Graphics.EffectParameterType.Bool; case ShaderVariableType.Int: - return EffectParameterType.Int32; + return Framework.Graphics.EffectParameterType.Int32; case ShaderVariableType.Float: - return EffectParameterType.Single; + return Framework.Graphics.EffectParameterType.Single; case ShaderVariableType.String: - return EffectParameterType.String; + return Framework.Graphics.EffectParameterType.String; + case ShaderVariableType.Texture: + return Framework.Graphics.EffectParameterType.Texture; + case ShaderVariableType.Texture1D: + return Framework.Graphics.EffectParameterType.Texture1D; + case ShaderVariableType.Texture2D: + return Framework.Graphics.EffectParameterType.Texture2D; + case ShaderVariableType.Texture3D: + return Framework.Graphics.EffectParameterType.Texture3D; case ShaderVariableType.TextureCube: - return EffectParameterType.TextureCube; + return Framework.Graphics.EffectParameterType.TextureCube; + case ShaderVariableType.Void: + return Framework.Graphics.EffectParameterType.Void; + default: + return (Framework.Graphics.EffectParameterType)(-1); } - - return EffectParameterType.Void; } - #endregion - - #region Translate (ShaderVariableType) - public static EffectParameterClass Translate(ShaderVariableClass type) - { - switch (type) - { - case ShaderVariableClass.Scalar: - return EffectParameterClass.Scalar; - case ShaderVariableClass.Vector: - return EffectParameterClass.Vector; - case ShaderVariableClass.Struct: - return EffectParameterClass.Struct; - case ShaderVariableClass.MatrixRows: - case ShaderVariableClass.MatrixColumns: - return EffectParameterClass.Matrix; - } - - return EffectParameterClass.Object; - } - #endregion } } diff --git a/RenderSystems/ANX.RenderSystem.DX.SharedSources/InputLayoutManager.cs b/RenderSystems/ANX.RenderSystem.DX.SharedSources/InputLayoutManager.cs new file mode 100644 index 00000000..a7b46b7c --- /dev/null +++ b/RenderSystems/ANX.RenderSystem.DX.SharedSources/InputLayoutManager.cs @@ -0,0 +1,184 @@ +using ANX.Framework.Graphics; +using SharpDX.D3DCompiler; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using Anx = ANX.Framework.Graphics; + +#if DX10 +using SharpDX.Direct3D10; +namespace ANX.RenderSystem.Windows.DX10 +#elif DX11 +using SharpDX.Direct3D11; +namespace ANX.RenderSystem.Windows.DX11 +#endif +{ + class InputLayoutManager : IDisposable + { +#if DEBUG + private static int layoutCount = 0; +#endif + + private Dictionary layouts = new Dictionary(new InputLayoutBindingCompararer()); + + /// + /// 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. + /// + public InputLayout GetInputLayout(Device device, ShaderBytecode passSignature, VertexDeclaration vertexDeclaration) + { + if (device == null) throw new ArgumentNullException("device"); + if (passSignature == null) throw new ArgumentNullException("passSignature"); + if (vertexDeclaration == null) throw new ArgumentNullException("vertexDeclaration"); + + var inputLayoutBinding = new InputLayoutBinding[] { new InputLayoutBinding() { vertexElements = vertexDeclaration.GetVertexElements() } }; + + InputLayout layout; + var vertexElements = vertexDeclaration.GetVertexElements(); + if (!layouts.TryGetValue(inputLayoutBinding, out layout)) + { + InputElement[] inputElements = new InputElement[vertexElements.Length]; + for (int i = 0; i < vertexElements.Length; i++) + { + inputElements[i] = CreateInputElementFromVertexElement(vertexElements[i]); + } + + layout = CreateInputLayout(device, passSignature, inputElements); + + layouts.Add(inputLayoutBinding, layout); + } + + return layout; + } + + public InputLayout GetInputLayout(Device device, ShaderBytecode passSignature, params ANX.Framework.Graphics.VertexBufferBinding[] vertexBufferBindings) + { + if (device == null) throw new ArgumentNullException("device"); + if (passSignature == null) throw new ArgumentNullException("passSignature"); + if (vertexBufferBindings == null) throw new ArgumentNullException("vertexBufferBindings"); + + var inputLayoutBindings = vertexBufferBindings.Select((x) => new InputLayoutBinding() { instanceFrequency = x.InstanceFrequency, vertexElements = x.VertexBuffer.VertexDeclaration.GetVertexElements() }).ToArray(); + + InputLayout layout; + if (!layouts.TryGetValue(inputLayoutBindings, out layout)) + { + List inputElements = new List(); + int slot = 0; + foreach (ANX.Framework.Graphics.VertexBufferBinding binding in vertexBufferBindings) + { + foreach (VertexElement vertexElement in binding.VertexBuffer.VertexDeclaration.GetVertexElements()) + { + inputElements.Add(CreateInputElementFromVertexElement(vertexElement, binding.InstanceFrequency, slot)); + } + slot++; + } + + // Layout from VertexShader input signature + layout = CreateInputLayout(device, passSignature, inputElements.ToArray()); + + layouts.Add(inputLayoutBindings, layout); + } + + return layout; + } + + private InputLayout CreateInputLayout(Device device, ShaderBytecode passSignature, InputElement[] inputElements) + { + var layout = new InputLayout(device, passSignature, inputElements); +#if DEBUG + layout.DebugName = "InputLayout_" + layoutCount++; +#endif + + return layout; + } + + private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement, int instanceFrequency, int slot) + { + string elementName = DxFormatConverter.Translate(ref vertexElement); + SharpDX.DXGI.Format elementFormat = DxFormatConverter.ConvertVertexElementFormat(vertexElement.VertexElementFormat); + return new InputElement(elementName, vertexElement.UsageIndex, elementFormat, vertexElement.Offset, slot, instanceFrequency == 0 ? InputClassification.PerVertexData : InputClassification.PerInstanceData, instanceFrequency); + } + + private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement) + { + string elementName = DxFormatConverter.Translate(ref vertexElement); + SharpDX.DXGI.Format elementFormat = DxFormatConverter.ConvertVertexElementFormat(vertexElement.VertexElementFormat); + return new InputElement(elementName, vertexElement.UsageIndex, elementFormat, vertexElement.Offset, 0); + } + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposeManaged) + { + if (disposeManaged) + { + foreach (var layout in layouts.Values) + { + layout.Dispose(); + } + + layouts.Clear(); + } + } + + class InputLayoutBinding : IEquatable + { + public int instanceFrequency = 0; + public VertexElement[] vertexElements; + + public override int GetHashCode() + { + int hash = this.instanceFrequency; + foreach (var element in this.vertexElements) + hash ^= element.GetHashCode(); + + return hash; + } + + public override bool Equals(object obj) + { + if (obj is InputLayoutBinding) + return this.Equals((InputLayoutBinding)obj); + + return false; + } + + public bool Equals(InputLayoutBinding other) + { + return other.instanceFrequency == this.instanceFrequency && other.vertexElements.SequenceEqual(this.vertexElements); + } + } + + class InputLayoutBindingCompararer : IEqualityComparer + { + public bool Equals(InputLayoutBinding[] x, InputLayoutBinding[] y) + { + if (x.Length == y.Length) + { + for (int i = 0; i < x.Length; i++) + if (!x[i].Equals(y[i])) + return false; + + return true; + } + + return false; + } + + public int GetHashCode(InputLayoutBinding[] obj) + { + int hash = 0; + foreach (var binding in obj) + hash ^= binding.GetHashCode(); + + return hash; + } + } + } +} diff --git a/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedGraphicsDeviceDX.cs b/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedGraphicsDeviceDX.cs index 7eb09196..00fe3dda 100644 --- a/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedGraphicsDeviceDX.cs +++ b/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedGraphicsDeviceDX.cs @@ -13,9 +13,13 @@ using SharpDX.DXGI; // For details see: http://anxframework.codeplex.com/license #if DX10 +using SharpDX.Direct3D10; + namespace ANX.RenderSystem.Windows.DX10 #endif #if DX11 +using SharpDX.Direct3D11; + namespace ANX.RenderSystem.Windows.DX11 #endif { @@ -23,9 +27,11 @@ namespace ANX.RenderSystem.Windows.DX11 { #region Private protected SharpDX.DXGI.SwapChain swapChain; - protected VertexBufferBinding[] currentVertexBuffer; + protected Framework.Graphics.VertexBufferBinding[] currentVertexBuffer = new Framework.Graphics.VertexBufferBinding[0]; protected int currentVertexBufferCount; protected IndexBuffer currentIndexBuffer; + private InputLayoutManager inputLayoutManager = new InputLayoutManager(); + private InputLayout currentInputLayout = null; #endregion #region Public @@ -86,7 +92,80 @@ namespace ANX.RenderSystem.Windows.DX11 } #endregion - #region GetBackBufferData (TODO) + public void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount) + { + if (primitiveCount <= 0) throw new ArgumentOutOfRangeException("primitiveCount is less than or equal to zero. When drawing, at least one primitive must be drawn."); + if (this.currentVertexBufferCount == 0) throw new InvalidOperationException("you have to set a valid vertex buffer before drawing."); + + int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount); + + SetupDraw(primitiveType); + + nativeDevice.DrawIndexed(vertexCount, startIndex, baseVertex); + } + + public void DrawPrimitives(PrimitiveType primitiveType, int vertexOffset, int primitiveCount) + { + int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount); + + SetupDraw(primitiveType); + + nativeDevice.Draw(vertexCount, vertexOffset); + } + + public void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, + int startIndex, int primitiveCount, int instanceCount) + { + int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount); + + SetupDraw(primitiveType); + + nativeDevice.DrawIndexedInstanced(vertexCount, instanceCount, startIndex, baseVertex, 0); + } + + 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 + { + int vertexCount = vertexData.Length; + int indexCount = indexData.Length; + + using (var vertexBuffer = new DynamicVertexBuffer(vertexDeclaration.GraphicsDevice, vertexDeclaration, vertexCount, BufferUsage.WriteOnly)) + using (var indexBuffer = new DynamicIndexBuffer(vertexDeclaration.GraphicsDevice, indexFormat, indexCount, BufferUsage.WriteOnly)) + { + vertexBuffer.SetData(vertexData); + this.SetVertexBuffers(new[] { new Framework.Graphics.VertexBufferBinding(vertexBuffer, vertexOffset) }); + + if (indexData.GetType() == typeof(Int16[])) + { + indexBuffer.SetData((short[])indexData); + } + else + { + indexBuffer.SetData((int[])indexData); + } + this.IndexBuffer = indexBuffer; + + DrawIndexedPrimitives(primitiveType, 0, vertexOffset, numVertices, indexOffset, primitiveCount); + } + } + + public void DrawUserPrimitives(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int primitiveCount, VertexDeclaration vertexDeclaration) where T : struct, IVertexType + { + int vertexCount = vertexData.Length; + //TODO: use a shared vertexBuffer, instead of creating one on every call. + using (var vertexBuffer = new DynamicVertexBuffer(vertexDeclaration.GraphicsDevice, vertexDeclaration, vertexCount, BufferUsage.WriteOnly)) + { + vertexBuffer.SetData(vertexData); + this.SetVertexBuffers(new[] { new Framework.Graphics.VertexBufferBinding(vertexBuffer, vertexOffset) }); + + SetupDraw(primitiveType); + + nativeDevice.Draw(vertexCount, vertexOffset); + } + } + + #region GetBackBufferData public void GetBackBufferData(Rectangle? rect, T[] data, int startIndex, int elementCount) where T : struct { this.backBuffer.GetData(0, rect, data, startIndex, elementCount); @@ -103,6 +182,35 @@ namespace ANX.RenderSystem.Windows.DX11 } #endregion + public IndexBuffer IndexBuffer + { + get + { + return this.currentIndexBuffer; + } + set + { + if (value == null) + throw new ArgumentNullException("indexBuffer"); + + if (this.currentIndexBuffer != value) + { + this.currentIndexBuffer = value; + + DxIndexBuffer nativeIndexBuffer = value.NativeIndexBuffer as DxIndexBuffer; + + if (nativeIndexBuffer != null) + { + nativeDevice.InputAssembler.SetIndexBuffer(nativeIndexBuffer.NativeBuffer, DxFormatConverter.Translate(value.IndexElementSize), 0); + } + else + { + throw new Exception("couldn't fetch native DirectX10 IndexBuffer"); + } + } + } + } + #if XNAEXT #region SetConstantBuffer (TODO) public void SetConstantBuffer(int slot, ConstantBuffer constantBuffer) @@ -114,5 +222,29 @@ namespace ANX.RenderSystem.Windows.DX11 } #endregion #endif + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool diposeManaged) + { + if (swapChain != null) + { + DisposeBackBuffer(); + + swapChain.Dispose(); + swapChain = null; + } + + if (inputLayoutManager != null) + { + inputLayoutManager.Dispose(); + inputLayoutManager = null; + } + //TODO: dispose everything else + } } } diff --git a/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedIndexBuffer.cs b/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedIndexBuffer.cs index bc7c8df4..67232b46 100644 --- a/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedIndexBuffer.cs +++ b/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedIndexBuffer.cs @@ -35,7 +35,7 @@ namespace ANX.RenderSystem.Windows.DX11 public void SetData(int offsetInBytes, S[] data, int startIndex, int elementCount) where S : struct { - if (offsetInBytes + elementCount * Marshal.SizeOf(typeof(S)) > NativeBuffer.Description.SizeInBytes) + if (offsetInBytes + elementCount * Marshal.SizeOf(typeof(S)) > SizeInBytes) throw new ArgumentOutOfRangeException(string.Format("The offset by \"{0}\" plus the byte length described by \"{1}\" is over the bounds of the buffer.", "offsetInBytes", "elementCount")); var buffer = this.NativeBuffer; diff --git a/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedVertexBuffer.cs b/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedVertexBuffer.cs index ee2ba598..b8dba382 100644 --- a/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedVertexBuffer.cs +++ b/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedVertexBuffer.cs @@ -52,11 +52,11 @@ namespace ANX.RenderSystem.Windows.DX11 if (startIndex + elementCount > data.Length) throw new ArgumentOutOfRangeException("startIndex must be smaller than elementCount + data.Length."); - if (offsetInBytes + elementCount * Marshal.SizeOf(typeof(S)) > NativeBuffer.Description.SizeInBytes) + if (offsetInBytes + elementCount * Marshal.SizeOf(typeof(S)) > this.SizeInBytes) throw new ArgumentOutOfRangeException(string.Format("The offset by \"{0}\" plus the byte length described by \"{1}\" is over the bounds of the buffer.", "offsetInBytes", "elementCount")); var buffer = this.NativeBuffer; - if (!this.WriteNeedsStaging) + if (this.WriteNeedsStaging) { buffer = CreateStagingBuffer(ResourceMapping.Write); } @@ -80,7 +80,7 @@ namespace ANX.RenderSystem.Windows.DX11 } finally { - if (!this.WriteNeedsStaging) + if (this.WriteNeedsStaging) { CopySubresource(buffer, this.NativeBuffer); buffer.Dispose(); diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX10/ANX.RenderSystem.Windows.DX10.csproj b/RenderSystems/ANX.RenderSystem.Windows.DX10/ANX.RenderSystem.Windows.DX10.csproj index 53774513..4e12c2c9 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX10/ANX.RenderSystem.Windows.DX10.csproj +++ b/RenderSystems/ANX.RenderSystem.Windows.DX10/ANX.RenderSystem.Windows.DX10.csproj @@ -60,6 +60,9 @@ BufferHelper.cs + + InputLayoutManager.cs + ResourceMapping.cs @@ -67,6 +70,7 @@ + diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX10/Buffer.cs b/RenderSystems/ANX.RenderSystem.Windows.DX10/Buffer.cs index 7bf95f15..8d94e087 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX10/Buffer.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.DX10/Buffer.cs @@ -10,11 +10,32 @@ namespace ANX.RenderSystem.Windows.DX10 { public abstract class Buffer : IDisposable { - public Dx.Buffer NativeBuffer { get; protected set; } + public Dx.Buffer NativeBuffer + { + get { return nativeBuffer; } + protected set + { + if (value != null) + SizeInBytes = value.Description.SizeInBytes; + else + SizeInBytes = 0; + + nativeBuffer = value; + } + } + + private Dx.Buffer nativeBuffer; + private Dx.Device device; private BufferUsage usage; private bool isDynamic; + public int SizeInBytes + { + get; + private set; + } + protected Buffer(Dx.Device device, BufferUsage usage, bool isDynamic) { this.device = device; @@ -26,6 +47,9 @@ namespace ANX.RenderSystem.Windows.DX10 { CheckUsage(mapping); + if (isDynamic && mapping == ResourceMapping.Write) + return buffer.Map(Dx.MapMode.WriteDiscard); + return buffer.Map(mapping.ToMapMode()); } @@ -59,7 +83,7 @@ namespace ANX.RenderSystem.Windows.DX10 var description = new Dx.BufferDescription() { Usage = Dx.ResourceUsage.Staging, - SizeInBytes = NativeBuffer.Description.SizeInBytes, + SizeInBytes = this.SizeInBytes, CpuAccessFlags = mapping.ToCpuAccessFlags(), OptionFlags = Dx.ResourceOptionFlags.None }; diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX10/DxEffectAnnotation.cs b/RenderSystems/ANX.RenderSystem.Windows.DX10/DxEffectAnnotation.cs new file mode 100644 index 00000000..8a1ffde8 --- /dev/null +++ b/RenderSystems/ANX.RenderSystem.Windows.DX10/DxEffectAnnotation.cs @@ -0,0 +1,153 @@ +using ANX.Framework.NonXNA.RenderSystem; +using SharpDX.Direct3D10; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ANX.RenderSystem.Windows.DX10 +{ + public class DxEffectAnnotation : INativeEffectAnnotation + { + private readonly EffectVariable nativeEffectVariable; + + public DxEffectAnnotation(SharpDX.Direct3D10.EffectVariable nativeEffectVariable) + { + this.nativeEffectVariable = nativeEffectVariable; + + var description = nativeEffectVariable.Description; + var typeDescription = nativeEffectVariable.TypeInfo.Description; + + this.Name = description.Name; + this.ColumnCount = typeDescription.Columns; + this.ParameterClass = typeDescription.Class.ToParameterClass(); + this.ParameterType = typeDescription.Type.ToParameterType(); + this.RowCount = typeDescription.Rows; + this.Semantic = description.Semantic; + + this.Matrix = nativeEffectVariable.AsMatrix(); + this.Scalar = nativeEffectVariable.AsScalar(); + this.String = nativeEffectVariable.AsString(); + this.Vector = nativeEffectVariable.AsVector(); + } + + public int ColumnCount + { + get; + private set; + } + + public string Name + { + get; + private set; + } + + public Framework.Graphics.EffectParameterClass ParameterClass + { + get; + private set; + } + + public Framework.Graphics.EffectParameterType ParameterType + { + get; + private set; + } + + public int RowCount + { + get; + private set; + } + + public string Semantic + { + get; + private set; + } + + protected EffectScalarVariable Scalar + { + get; + private set; + } + + protected EffectMatrixVariable Matrix + { + get; + private set; + } + + protected EffectStringVariable String + { + get; + private set; + } + + protected EffectVectorVariable Vector + { + get; + private set; + } + + public bool GetValueBoolean() + { + return this.Scalar.GetBool(); + } + + public int GetValueInt32() + { + return this.Scalar.GetInt(); + } + + public Framework.Matrix GetValueMatrix() + { + return this.Matrix.GetMatrix(); + } + + public float GetValueSingle() + { + return this.Scalar.GetFloat(); + } + + public string GetValueString() + { + return this.String.GetString(); + } + + public Framework.Vector2 GetValueVector2() + { + return this.Vector.GetVector(); + } + + public Framework.Vector3 GetValueVector3() + { + return this.Vector.GetVector(); + } + + public Framework.Vector4 GetValueVector4() + { + return this.Vector.GetVector(); + } + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposeManaged) + { + if (disposeManaged) + { + this.Matrix.Dispose(); + this.Scalar.Dispose(); + this.String.Dispose(); + this.Vector.Dispose(); + + this.nativeEffectVariable.Dispose(); + } + } + } +} diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectDX.cs b/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectDX.cs index fa8cf654..b9b41a76 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectDX.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectDX.cs @@ -26,32 +26,17 @@ namespace ANX.RenderSystem.Windows.DX10 #region Public internal Dx10.Effect NativeEffect { get; private set; } - public IEnumerable Techniques - { - get - { - for (int i = 0; i < NativeEffect.Description.TechniqueCount; i++) - { - var teqDx10 = new EffectTechnique_DX10(managedEffect, NativeEffect.GetTechniqueByIndex(i)); - yield return new EffectTechnique(this.managedEffect, teqDx10); - } - } - } + public IEnumerable Techniques + { + get; + private set; + } - public IEnumerable Parameters - { - get - { - for (int i = 0; i < NativeEffect.Description.GlobalVariableCount; i++) - { - var parDx10 = new EffectParameter_DX10 - { - NativeParameter = NativeEffect.GetVariableByIndex(i) - }; - yield return new EffectParameter(parDx10); - } - } - } + public IEnumerable Parameters + { + get; + private set; + } #endregion #region Constructor @@ -61,6 +46,8 @@ namespace ANX.RenderSystem.Windows.DX10 var device = ((GraphicsDeviceDX)graphicsDevice.NativeDevice).NativeDevice; vertexShader = new Dx10.VertexShader(device, GetByteCode(vertexShaderStream)); pixelShader = new Dx10.PixelShader(device, GetByteCode(pixelShaderStream)); + + this.BufferNativeData(); } public EffectDX(GraphicsDevice graphicsDevice, Effect managedEffect, Stream effectStream) @@ -76,9 +63,30 @@ namespace ANX.RenderSystem.Windows.DX10 { System.Diagnostics.Debugger.Break(); } + + this.BufferNativeData(); } #endregion + private void BufferNativeData() + { + var description = NativeEffect.Description; + + var techniques = new EffectTechnique[description.TechniqueCount]; + for (int i = 0; i < techniques.Length; i++) + { + techniques[i] = new EffectTechnique(this.managedEffect, new EffectTechnique_DX10(managedEffect, NativeEffect.GetTechniqueByIndex(i))); + } + this.Techniques = techniques; + + var parameters = new EffectParameter[description.GlobalVariableCount]; + for (int i = 0; i < parameters.Length; i++) + { + parameters[i] = new EffectParameter(new EffectParameter_DX10(NativeEffect.GetVariableByIndex(i))); + } + this.Parameters = parameters; + } + #region GetCurrentTechnique public EffectTechnique_DX10 GetCurrentTechnique() { @@ -86,13 +94,6 @@ namespace ANX.RenderSystem.Windows.DX10 } #endregion - #region Apply - public void Apply(GraphicsDevice graphicsDevice) - { - ((GraphicsDeviceDX)graphicsDevice.NativeDevice).currentEffect = this; - } - #endregion - #region CompileFXShader public static byte[] CompileFXShader(string effectCode, string directory = "") { @@ -103,16 +104,31 @@ namespace ANX.RenderSystem.Windows.DX10 #region Dispose public void Dispose() { - SafeDispose(pixelShader); - pixelShader = null; - - SafeDispose(vertexShader); - vertexShader = null; - - SafeDispose(NativeEffect); - NativeEffect = null; + this.Dispose(true); + GC.SuppressFinalize(this); } + protected virtual void Dispose(bool disposeManaged) + { + if (disposeManaged) + { + SafeDispose(pixelShader); + pixelShader = null; + + SafeDispose(vertexShader); + vertexShader = null; + + SafeDispose(NativeEffect); + NativeEffect = null; + + foreach (var technique in this.Techniques) + technique.NativeTechnique.Dispose(); + + foreach (var parameter in this.Parameters) + parameter.NativeParameter.Dispose(); + } + } + private void SafeDispose(IDisposable disposable) { if (disposable != null) diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectParameter_DX10.cs b/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectParameter_DX10.cs index cbba830f..0416b692 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectParameter_DX10.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectParameter_DX10.cs @@ -4,6 +4,7 @@ using ANX.Framework.Graphics; using ANX.Framework.NonXNA; using Dx10 = SharpDX.Direct3D10; using ANX.Framework.NonXNA.Development; +using SharpDX.Direct3D10; // This file is part of the ANX.Framework created by the // "ANX.Framework developer group" and released under the Ms-PL license. @@ -11,269 +12,214 @@ using ANX.Framework.NonXNA.Development; namespace ANX.RenderSystem.Windows.DX10 { - [PercentageComplete(50)] + [PercentageComplete(80)] [TestState(TestStateAttribute.TestState.Untested)] - [Developer("Glatzemann")] - public class EffectParameter_DX10 : INativeEffectParameter + [Developer("Glatzemann, KorsarNek")] + public class EffectParameter_DX10 : DxEffectAnnotation, INativeEffectParameter { #region Public - public Dx10.EffectVariable NativeParameter { get; internal set; } + public Dx10.EffectVariable NativeParameter { get; private set; } - public string Name + public EffectParameter_DX10(Dx10.EffectVariable nativeParameter) + : base(nativeParameter) { - get { return NativeParameter.Description.Name; } - } + this.NativeParameter = nativeParameter; - public string Semantic - { - get { return NativeParameter.Description.Semantic; } - } + var description = nativeParameter.Description; + var typeDescription = nativeParameter.TypeInfo.Description; - public int ColumnCount - { - get { return NativeParameter.TypeInfo.Description.Columns; } - } + var annotations = new EffectAnnotation[description.AnnotationCount]; + for (int i = 0; i < annotations.Length; i++) + annotations[i] = new EffectAnnotation(new DxEffectAnnotation(nativeParameter.GetAnnotationByIndex(i))); + this.Annotations = new EffectAnnotationCollection(annotations); - public int RowCount - { - get { return NativeParameter.TypeInfo.Description.Rows; } - } + var elements = new EffectParameter[typeDescription.Elements]; + for (int i = 0; i < elements.Length; i++) + elements[i] = new EffectParameter(new EffectParameter_DX10(nativeParameter.GetElement(i))); + this.Elements = new EffectParameterCollection(elements); - public EffectParameterClass ParameterClass - { - get { return DxFormatConverter.Translate(NativeParameter.TypeInfo.Description.Class); } - } + var members = new EffectParameter[typeDescription.Members]; + for (int i = 0; i < members.Length; i++) + members[i] = new EffectParameter(new EffectParameter_DX10(nativeParameter.GetMemberByIndex(i))); + this.StructureMembers = new EffectParameterCollection(members); - public EffectParameterType ParameterType - { - get { return DxFormatConverter.Translate(NativeParameter.TypeInfo.Description.Type); } + this.ShaderResource = nativeParameter.AsShaderResource(); } public EffectAnnotationCollection Annotations { - get { throw new NotImplementedException(); } + get; + private set; } public EffectParameterCollection Elements { - get { throw new NotImplementedException(); } + get; + private set; } public EffectParameterCollection StructureMembers { - get { throw new NotImplementedException(); } + get; + private set; } #endregion - #region SetValue (bool) + protected EffectShaderResourceVariable ShaderResource + { + get; + private set; + } + + #region SetValue (TODO) public void SetValue(bool value) { - NativeParameter.AsScalar().Set(value); + Scalar.Set(value); } - #endregion - #region SetValue (bool[]) public void SetValue(bool[] value) { - NativeParameter.AsScalar().Set(value); + Scalar.Set(value); } - #endregion - #region SetValue (int) public void SetValue(int value) { - NativeParameter.AsScalar().Set(value); + Scalar.Set(value); } - #endregion - #region SetValue (int[]) public void SetValue(int[] value) { - NativeParameter.AsScalar().Set(value); + Scalar.Set(value); } - #endregion - #region SetValue (Matrix, transpose) (TODO) public void SetValue(Matrix value, bool transpose) { - Matrix val = value; if (transpose) - { - Matrix.Transpose(ref val, out val); - } - - NativeParameter.AsMatrix().SetMatrix(val); + Matrix.SetMatrixTranspose(value); + else + Matrix.SetMatrix(value); } - #endregion - #region SetValue (Matrix[], transpose) (TODO) public void SetValue(Matrix[] value, bool transpose) { - // TODO: handle transpose! - NativeParameter.AsMatrix().SetMatrix(value); + if (transpose) + Matrix.SetMatrixTranspose(value); + else + Matrix.SetMatrix(value); } - #endregion - #region SetValue (Quaternion) public void SetValue(Quaternion value) { - NativeParameter.AsVector().Set(value); + Vector.Set(value); } - #endregion - #region SetValue (Quaternion[]) public void SetValue(Quaternion[] value) { - NativeParameter.AsVector().Set(value); + Vector.Set(value); } - #endregion - #region SetValue (float) public void SetValue(float value) { - NativeParameter.AsScalar().Set(value); + Vector.Set(value); } - #endregion - #region SetValue (float[]) public void SetValue(float[] value) { - NativeParameter.AsScalar().Set(value); + Scalar.Set(value); } - #endregion - #region SetValue (Vector2) public void SetValue(Vector2 value) { - NativeParameter.AsVector().Set(value); + Vector.Set(value); } - #endregion - #region SetValue (Vector2[]) public void SetValue(Vector2[] value) { - NativeParameter.AsVector().Set(value); + Vector.Set(value); } - #endregion - #region SetValue (Vector3) public void SetValue(Vector3 value) { - NativeParameter.AsVector().Set(value); + Vector.Set(value); } - #endregion - #region SetValue (Vector3[]) public void SetValue(Vector3[] value) { - NativeParameter.AsVector().Set(value); + Vector.Set(value); } - #endregion - #region SetValue (Vector4) public void SetValue(Vector4 value) { - NativeParameter.AsVector().Set(value); + Vector.Set(value); } - #endregion - #region SetValue (Vector4[]) public void SetValue(Vector4[] value) { - NativeParameter.AsVector().Set(value); + Vector.Set(value); } - #endregion - #region SetValue (Texture) public void SetValue(Texture value) { if (value == null) throw new ArgumentNullException("value"); - var tex = value.NativeTexture as DxTexture2D; - NativeParameter.AsShaderResource().SetResource(tex.NativeShaderResourceView); + ShaderResource.SetResource(((DxTexture2D)value.NativeTexture).NativeShaderResourceView); } - #endregion - #region SetValue (string) (TODO) public void SetValue(string value) { - throw new NotImplementedException(); + throw new NotImplementedException(); } #endregion #region Get (TODO) - public bool GetValueBoolean() - { - throw new NotImplementedException(); - } public bool[] GetValueBooleanArray(int count) { - throw new NotImplementedException(); - } - - public int GetValueInt32() - { - throw new NotImplementedException(); + return Scalar.GetBoolArray(0, count); } public int[] GetValueInt32Array(int count) { - throw new NotImplementedException(); - } - - public Matrix GetValueMatrix() - { - throw new NotImplementedException(); + return Scalar.GetIntArray(count); } public Matrix[] GetValueMatrixArray(int count) { - throw new NotImplementedException(); + return Matrix.GetMatrixArray(count); } - public Matrix GetValueMatrixTranspose() - { - throw new NotImplementedException(); - } + public Matrix GetValueMatrixTranspose() + { + return Matrix.GetMatrixTranspose(); + } public Matrix[] GetValueMatrixTransposeArray(int count) { - throw new NotImplementedException(); + return Matrix.GetMatrixTransposeArray(count); } public Quaternion GetValueQuaternion() { - throw new NotImplementedException(); + return Vector.GetVector(); } public Quaternion[] GetValueQuaternionArray(int count) { - throw new NotImplementedException(); - } - - public float GetValueSingle() - { - throw new NotImplementedException(); + return Vector.GetVectorArray(count); } public float[] GetValueSingleArray(int count) { - throw new NotImplementedException(); + return Scalar.GetFloatArray(count); } - public string GetValueString() + public ANX.Framework.Graphics.Texture2D GetValueTexture2D() { throw new NotImplementedException(); } - public Texture2D GetValueTexture2D() - { - throw new NotImplementedException(); - } - - public Texture3D GetValueTexture3D() + public ANX.Framework.Graphics.Texture3D GetValueTexture3D() { throw new NotImplementedException(); } @@ -283,35 +229,39 @@ namespace ANX.RenderSystem.Windows.DX10 throw new NotImplementedException(); } - public Vector2 GetValueVector2() - { - throw new NotImplementedException(); - } - public Vector2[] GetValueVector2Array(int count) { - throw new NotImplementedException(); - } - - public Vector3 GetValueVector3() - { - throw new NotImplementedException(); + return Vector.GetVectorArray(count); } public Vector3[] GetValueVector3Array(int count) { - throw new NotImplementedException(); - } - - public Vector4 GetValueVector4() - { - throw new NotImplementedException(); + return Vector.GetVectorArray(count); } public Vector4[] GetValueVector4Array(int count) { - throw new NotImplementedException(); + return Vector.GetVectorArray(count); } #endregion - } + + protected override void Dispose(bool disposeManaged) + { + if (disposeManaged) + { + ShaderResource.Dispose(); + + foreach (var annotation in this.Annotations) + annotation.NativeAnnotation.Dispose(); + + foreach (var element in this.Elements) + element.NativeParameter.Dispose(); + + foreach (var member in this.StructureMembers) + member.NativeParameter.Dispose(); + } + + base.Dispose(disposeManaged); + } + } } diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectPass_DX10.cs b/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectPass_DX10.cs index 0127490d..47c1dd07 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectPass_DX10.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectPass_DX10.cs @@ -1,5 +1,6 @@ using ANX.Framework.NonXNA; using SharpDX.Direct3D10; +using System; // This file is part of the ANX.Framework created by the // "ANX.Framework developer group" and released under the Ms-PL license. @@ -9,19 +10,72 @@ namespace ANX.RenderSystem.Windows.DX10 { public class EffectPass_DX10 : INativeEffectPass { - private EffectPass nativePass; + private Framework.Graphics.Effect parentEffect; public string Name { - get - { - return nativePass.Description.Name; - } + get; + private set; } - internal EffectPass_DX10(EffectPass setNativePass) + private EffectPass NativeEffectPass + { + get; + set; + } + + public SharpDX.D3DCompiler.ShaderBytecode Signature + { + get; + private set; + } + + internal EffectPass_DX10(Framework.Graphics.Effect parentEffect, EffectPass nativePass) { - nativePass = setNativePass; + this.NativeEffectPass = nativePass; + this.parentEffect = parentEffect; + + var description = nativePass.Description; + + this.Name = description.Name; + this.Signature = description.Signature; + + var annotations = new Framework.Graphics.EffectAnnotation[description.AnnotationCount]; + for (int i = 0; i < annotations.Length; i++) + annotations[i] = new Framework.Graphics.EffectAnnotation(new DxEffectAnnotation(nativePass.GetAnnotationByIndex(i))); + + this.Annotations = new Framework.Graphics.EffectAnnotationCollection(annotations); } + + public Framework.Graphics.EffectAnnotationCollection Annotations + { + get; + private set; + } + + public void Apply() + { + //TODO: Don't set every state every time, use NativeEffectPass.ComputeStateBlockMask to prevent unnecessary state changes. + NativeEffectPass.Apply(); + ((GraphicsDeviceDX)this.parentEffect.GraphicsDevice.NativeDevice).currentPass = this; + parentEffect.OnApply(); + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposeManaged) + { + if (disposeManaged) + { + this.NativeEffectPass.Dispose(); + + foreach (var annotation in this.Annotations) + annotation.NativeAnnotation.Dispose(); + } + } } } diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectTechnique_DX10.cs b/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectTechnique_DX10.cs index 6144ec63..686d9b8b 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectTechnique_DX10.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectTechnique_DX10.cs @@ -17,6 +17,7 @@ namespace ANX.RenderSystem.Windows.DX10 public class EffectTechnique_DX10 : INativeEffectTechnique { private readonly Effect parentEffect; + private readonly EffectPass[] effectPasses; public EffectTechnique_DX10(Effect parentEffect, Dx10.EffectTechnique nativeTechnique) { @@ -27,34 +28,71 @@ namespace ANX.RenderSystem.Windows.DX10 this.parentEffect = parentEffect; NativeTechnique = nativeTechnique; + + var description = NativeTechnique.Description; + + this.Name = description.Name; + + var passCounts = description.PassCount; + this.effectPasses = new EffectPass[passCounts]; + + for (int i = 0; i < passCounts; i++) + { + this.effectPasses[i] = new EffectPass(new EffectPass_DX10(this.parentEffect, NativeTechnique.GetPassByIndex(i))); + } + + var annotationCount = description.AnnotationCount; + var annotations = new EffectAnnotation[annotationCount]; + for (int i = 0; i < annotationCount; i++) + annotations[i] = new EffectAnnotation(new DxEffectAnnotation(nativeTechnique.GetAnnotationByIndex(i))); + + this.Annotations = new EffectAnnotationCollection(annotations); } - public Dx10.EffectTechnique NativeTechnique { get; protected set; } - + public Dx10.EffectTechnique NativeTechnique { get; private set; } + public string Name - { - get - { - return NativeTechnique.Description.Name; - } - } + { + get; + private set; + } public IEnumerable Passes { get { - for (int i = 0; i < NativeTechnique.Description.PassCount; i++) - { - var passDx10 = new EffectPass_DX10(NativeTechnique.GetPassByIndex(i)); - // TODO: wire up native pass and managed pass? - yield return new EffectPass(this.parentEffect); - } + return this.effectPasses; } } public EffectAnnotationCollection Annotations { - get { throw new NotImplementedException(); } + get; + private set; } - } + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposeManaged) + { + if (disposeManaged) + { + if (NativeTechnique != null) + { + NativeTechnique.Dispose(); + NativeTechnique = null; + } + + foreach (var pass in this.effectPasses) + pass.NativeEffectPass.Dispose(); + + foreach (var annotation in this.Annotations) + annotation.NativeAnnotation.Dispose(); + } + } + } } diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX10/Extensions.cs b/RenderSystems/ANX.RenderSystem.Windows.DX10/Extensions.cs index 3df7ccda..7895d9da 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX10/Extensions.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.DX10/Extensions.cs @@ -1,4 +1,5 @@ using SharpDX; +using SharpDX.D3DCompiler; using SharpDX.Direct3D10; using System; using System.Collections.Generic; @@ -38,5 +39,15 @@ namespace ANX.RenderSystem.Windows.DX10 Top = rect.Top, }; } + + public static ANX.Framework.Graphics.EffectParameterClass ToParameterClass(this ShaderVariableClass variableClass) + { + return DxFormatConverter.Translate(variableClass); + } + + public static ANX.Framework.Graphics.EffectParameterType ToParameterType(this ShaderVariableType variableType) + { + return DxFormatConverter.Translate(variableType); + } } } diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX10/GraphicsDeviceDX.cs b/RenderSystems/ANX.RenderSystem.Windows.DX10/GraphicsDeviceDX.cs index fe59ac2f..5c4e9ae4 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX10/GraphicsDeviceDX.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.DX10/GraphicsDeviceDX.cs @@ -1,5 +1,6 @@ #region Using Statements using System; +using System.Linq; using System.Collections.Generic; using ANX.Framework; using ANX.Framework.Graphics; @@ -32,7 +33,7 @@ namespace ANX.RenderSystem.Windows.DX10 private Dx10.RenderTargetView[] renderTargetView = new RenderTargetView[MAX_RENDER_TARGETS]; private Dx10.DepthStencilView[] depthStencilView = new DepthStencilView[MAX_RENDER_TARGETS]; private RenderTarget2D_DX10 backBuffer; - internal EffectDX currentEffect; + internal EffectPass_DX10 currentPass; #endregion #region CreateDevice @@ -123,187 +124,34 @@ namespace ANX.RenderSystem.Windows.DX10 { swapChain.Present(VSync ? 1 : 0, PresentFlags.None); } - #endregion - #region DrawIndexedPrimitives - public void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, IndexBuffer indexBuffer) - { - if (primitiveCount <= 0) throw new ArgumentOutOfRangeException("primitiveCount is less than or equal to zero. When drawing, at least one primitive must be drawn."); - if (this.currentVertexBuffer == null || this.currentVertexBufferCount <= 0) throw new InvalidOperationException("you have to set a valid vertex buffer before drawing."); - - Dx10.EffectTechnique technique = SetupEffectForDraw(); - int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount); - - nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType); - - if (indexBuffer != null) - { - SetIndexBuffer(indexBuffer); - } - - for (int i = 0; i < technique.Description.PassCount; ++i) - { - technique.GetPassByIndex(i).Apply(); - nativeDevice.DrawIndexed(vertexCount, startIndex, baseVertex); - } - - nativeDevice.InputAssembler.InputLayout.Dispose(); - nativeDevice.InputAssembler.InputLayout = null; - } - #endregion - - #region DrawPrimitives - public void DrawPrimitives(PrimitiveType primitiveType, int vertexOffset, int primitiveCount) - { - Dx10.EffectTechnique technique = SetupEffectForDraw(); - int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount); - - nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType); - - for (int i = 0; i < technique.Description.PassCount; ++i) - { - technique.GetPassByIndex(i).Apply(); - nativeDevice.Draw(vertexCount, vertexOffset); - } - - nativeDevice.InputAssembler.InputLayout.Dispose(); - nativeDevice.InputAssembler.InputLayout = null; + public void Present(Rectangle? sourceRectangle, Rectangle? destinationRectangle, WindowHandle overrideWindowHandle) + { + throw new NotImplementedException(); } #endregion - public void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, - int startIndex, int primitiveCount, int instanceCount, IndexBuffer indexBuffer) + private void SetupDraw(PrimitiveType primitiveType) { - Dx10.EffectTechnique technique = SetupEffectForDraw(); - int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount); + var inputLayout = this.inputLayoutManager.GetInputLayout(NativeDevice, currentPass.Signature, this.currentVertexBuffer); nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType); - - if (indexBuffer != null) + if (currentInputLayout != inputLayout) { - SetIndexBuffer(indexBuffer); - } - - for (int i = 0; i < technique.Description.PassCount; ++i) - { - technique.GetPassByIndex(i).Apply(); - nativeDevice.DrawIndexedInstanced(vertexCount, instanceCount, startIndex, baseVertex, 0); - } - - nativeDevice.InputAssembler.InputLayout.Dispose(); - nativeDevice.InputAssembler.InputLayout = null; - } - - 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 - { - int vertexCount = vertexData.Length; - int indexCount = indexData.Length; - - using (var vertexBuffer = new DynamicVertexBuffer(vertexDeclaration.GraphicsDevice, vertexDeclaration, vertexCount, BufferUsage.WriteOnly)) - using (var indexBuffer = new DynamicIndexBuffer(vertexDeclaration.GraphicsDevice, indexFormat, indexCount, BufferUsage.WriteOnly)) - { - vertexBuffer.SetData(vertexData); - this.SetVertexBuffers(new[] { new Framework.Graphics.VertexBufferBinding(vertexBuffer, vertexOffset) }); - - if (indexData.GetType() == typeof(Int16[])) - { - indexBuffer.SetData((short[])indexData); - } - else - { - indexBuffer.SetData((int[])indexData); - } - - DrawIndexedPrimitives(primitiveType, 0, vertexOffset, numVertices, indexOffset, primitiveCount, indexBuffer); + nativeDevice.InputAssembler.InputLayout = this.inputLayoutManager.GetInputLayout(NativeDevice, currentPass.Signature, this.currentVertexBuffer); + currentInputLayout = inputLayout; } } - public void DrawUserPrimitives(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int primitiveCount, VertexDeclaration vertexDeclaration) where T : struct, IVertexType - { - int vertexCount = vertexData.Length; - //TODO: use a shared vertexBuffer, instead of creating one on every call. - using (DxVertexBuffer vb10 = new DxVertexBuffer(nativeDevice, vertexDeclaration, vertexCount, BufferUsage.WriteOnly, dynamic: true)) - { - vb10.SetData(vertexData); - - Dx10.VertexBufferBinding nativeVertexBufferBindings = new Dx10.VertexBufferBinding(vb10.NativeBuffer, vertexDeclaration.VertexStride, 0); - - nativeDevice.InputAssembler.SetVertexBuffers(0, nativeVertexBufferBindings); - - //TODO: check for currentEffect null and throw exception - // TODO: check for null's and throw exceptions - // TODO: get the correct pass index! - var technique = currentEffect.GetCurrentTechnique().NativeTechnique; - var pass = technique.GetPassByIndex(0); - var layout = CreateInputLayout(nativeDevice, pass.Description.Signature, vertexDeclaration); - - nativeDevice.InputAssembler.InputLayout = layout; - // Prepare All the stages - nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType); - - for (int i = 0; i < technique.Description.PassCount; ++i) - { - technique.GetPassByIndex(i).Apply(); - nativeDevice.Draw(vertexCount, vertexOffset); - } - - nativeDevice.InputAssembler.InputLayout.Dispose(); - nativeDevice.InputAssembler.InputLayout = null; - } - } - - private Dx10.EffectTechnique SetupEffectForDraw() - { - //TODO: check for currentEffect null and throw exception - // TODO: check for null's and throw exceptions - // TODO: get the correct pass index! - var technique = currentEffect.GetCurrentTechnique().NativeTechnique; - var pass = technique.GetPassByIndex(0); - SetupInputLayout(pass.Description.Signature); - - return technique; - } - - #region SetupInputLayout - private InputLayout SetupInputLayout(ShaderBytecode passSignature) - { - // get the VertexDeclaration from current VertexBuffer to create input layout for the input assembler - var layout = CreateInputLayout(nativeDevice, passSignature, currentVertexBuffer); - - nativeDevice.InputAssembler.InputLayout = layout; - return layout; - } - #endregion - - #region SetIndexBuffer - public void SetIndexBuffer(IndexBuffer indexBuffer) - { - if (indexBuffer == null) - throw new ArgumentNullException("indexBuffer"); - - this.currentIndexBuffer = indexBuffer; - - DxIndexBuffer nativeIndexBuffer = indexBuffer.NativeIndexBuffer as DxIndexBuffer; - - if (nativeIndexBuffer != null) - { - nativeDevice.InputAssembler.SetIndexBuffer(nativeIndexBuffer.NativeBuffer, DxFormatConverter.Translate(indexBuffer.IndexElementSize), 0); - } - else - { - throw new Exception("couldn't fetch native DirectX10 IndexBuffer"); - } - } - #endregion - #region SetVertexBuffers public void SetVertexBuffers(ANX.Framework.Graphics.VertexBufferBinding[] vertexBuffers) { if (vertexBuffers == null) throw new ArgumentNullException("vertexBuffers"); + if (this.currentVertexBuffer.SequenceEqual(vertexBuffers)) + return; + this.currentVertexBufferCount = vertexBuffers.Length; if (this.currentVertexBuffer == null || this.currentVertexBuffer.Length < currentVertexBufferCount) @@ -347,67 +195,6 @@ namespace ANX.RenderSystem.Windows.DX10 { nativeDevice.Rasterizer.SetViewports(viewports); } - #endregion - - #region CreateInputLayout - /// - /// 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. - /// - private Dx10.InputLayout CreateInputLayout(Dx10.Device device, ShaderBytecode passSignature, params VertexDeclaration[] vertexDeclaration) - { - if (device == null) throw new ArgumentNullException("device"); - if (passSignature == null) throw new ArgumentNullException("passSignature"); - if (vertexDeclaration == null) throw new ArgumentNullException("vertexDeclaration"); - - //TODO: try to get rid of the list - List inputElements = new List(); - foreach (VertexDeclaration decl in vertexDeclaration) - { - foreach (VertexElement vertexElement in decl.GetVertexElements()) - { - inputElements.Add(CreateInputElementFromVertexElement(vertexElement, 0)); - } - } - - return new Dx10.InputLayout(device, passSignature, inputElements.ToArray()); - } - - private Dx10.InputLayout CreateInputLayout(Dx10.Device device, ShaderBytecode passSignature, params ANX.Framework.Graphics.VertexBufferBinding[] vertexBufferBindings) - { - if (device == null) throw new ArgumentNullException("device"); - if (passSignature == null) throw new ArgumentNullException("passSignature"); - if (vertexBufferBindings == null) throw new ArgumentNullException("vertexBufferBindings"); - - //TODO: try to get rid of the list - List inputElements = new List(); - int slot = 0; - foreach (ANX.Framework.Graphics.VertexBufferBinding binding in vertexBufferBindings) - { - foreach (VertexElement vertexElement in binding.VertexBuffer.VertexDeclaration.GetVertexElements()) - { - inputElements.Add(CreateInputElementFromVertexElement(vertexElement, binding.InstanceFrequency, slot)); - } - slot++; - } - - // Layout from VertexShader input signature - return new InputLayout(device, passSignature, inputElements.ToArray()); - } - #endregion - - #region CreateInputElementFromVertexElement - private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement, int slot) - { - return CreateInputElementFromVertexElement(vertexElement, 0, slot); - } - - private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement, int instanceFrequency, int slot) - { - string elementName = DxFormatConverter.Translate(ref vertexElement); - Format elementFormat = DxFormatConverter.ConvertVertexElementFormat(vertexElement.VertexElementFormat); - return new InputElement(elementName, vertexElement.UsageIndex, elementFormat, vertexElement.Offset, slot, instanceFrequency == 0 ? InputClassification.PerVertexData : InputClassification.PerInstanceData, instanceFrequency); - } #endregion #region SetRenderTargets @@ -484,21 +271,6 @@ namespace ANX.RenderSystem.Windows.DX10 } } - #region Dispose - public void Dispose() - { - if (swapChain != null) - { - DisposeBackBuffer(); - - swapChain.Dispose(); - swapChain = null; - } - - //TODO: dispose everything else - } - #endregion - internal Dx10.Device NativeDevice { get 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 9f76be20..2e81fc19 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX11/ANX.RenderSystem.Windows.DX11.csproj +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/ANX.RenderSystem.Windows.DX11.csproj @@ -73,6 +73,9 @@ BufferHelper.cs + + InputLayoutManager.cs + ResourceMapping.cs diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/Buffer.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/Buffer.cs index 95c3ddb1..86e6ede2 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX11/Buffer.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/Buffer.cs @@ -10,11 +10,32 @@ namespace ANX.RenderSystem.Windows.DX11 { public abstract class Buffer : IDisposable { - public Dx.Buffer NativeBuffer { get; protected set; } + public Dx.Buffer NativeBuffer + { + get { return nativeBuffer; } + protected set + { + if (value != null) + SizeInBytes = value.Description.SizeInBytes; + else + SizeInBytes = 0; + + nativeBuffer = value; + } + } + + private Dx.Buffer nativeBuffer; + private Dx.Device device; private BufferUsage usage; private bool isDynamic; + public int SizeInBytes + { + get; + private set; + } + protected Buffer(Dx.Device device, BufferUsage usage, bool isDynamic) { this.device = device; @@ -26,8 +47,14 @@ namespace ANX.RenderSystem.Windows.DX11 { CheckUsage(mapping); + Dx.MapMode mapMode; + if (isDynamic && mapping == ResourceMapping.Write) + mapMode = Dx.MapMode.WriteDiscard; + else + mapMode = mapping.ToMapMode(); + DataStream dataStream; - device.ImmediateContext.MapSubresource(buffer, mapping.ToMapMode(), Dx.MapFlags.None, out dataStream); + device.ImmediateContext.MapSubresource(buffer, mapMode, Dx.MapFlags.None, out dataStream); return dataStream; } diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectDX.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectDX.cs index 53b13569..a45608dd 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectDX.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectDX.cs @@ -86,13 +86,6 @@ namespace ANX.RenderSystem.Windows.DX11 } #endregion - #region Apply - public void Apply(GraphicsDevice graphicsDevice) - { - ((GraphicsDeviceDX)graphicsDevice.NativeDevice).currentEffect = this; - } - #endregion - #region CompileFXShader public static byte[] CompileFXShader(string effectCode, string directory = "") { diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectParameter_DX11.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectParameter_DX11.cs index a6cd6aa0..d4eaecfa 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectParameter_DX11.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectParameter_DX11.cs @@ -308,5 +308,23 @@ namespace ANX.RenderSystem.Windows.DX11 throw new NotImplementedException(); } #endregion + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposeManaged) + { + if (disposeManaged) + { + if (NativeParameter != null) + { + NativeParameter.Dispose(); + NativeParameter = null; + } + } + } } } diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectPass_DX11.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectPass_DX11.cs index b118236c..b8019cdd 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectPass_DX11.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectPass_DX11.cs @@ -1,5 +1,6 @@ using ANX.Framework.NonXNA; using SharpDX.Direct3D11; +using System; // This file is part of the ANX.Framework created by the // "ANX.Framework developer group" and released under the Ms-PL license. @@ -10,6 +11,7 @@ namespace ANX.RenderSystem.Windows.DX11 public class EffectPass_DX11 : INativeEffectPass { private EffectPass nativePass; + private Framework.Graphics.Effect parentEffect; public string Name { @@ -19,9 +21,50 @@ namespace ANX.RenderSystem.Windows.DX11 } } - internal EffectPass_DX11(EffectPass setNativePass) + public SharpDX.D3DCompiler.ShaderBytecode Signature + { + get; + private set; + } + + internal EffectPass_DX11(Framework.Graphics.Effect parentEffect, EffectPass setNativePass) { nativePass = setNativePass; + this.parentEffect = parentEffect; + + this.Signature = nativePass.Description.Signature; } + + public Framework.Graphics.EffectAnnotationCollection Annotations + { + get { throw new System.NotImplementedException(); } + } + + public void Apply() + { + var deviceContext = ((GraphicsDeviceDX)parentEffect.GraphicsDevice.NativeDevice).NativeDevice; + + nativePass.Apply(deviceContext); + ((GraphicsDeviceDX)this.parentEffect.GraphicsDevice.NativeDevice).currentPass = this; + parentEffect.OnApply(); + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposeManaged) + { + if (disposeManaged) + { + if (nativePass != null) + { + nativePass.Dispose(); + nativePass = null; + } + } + } } } diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectTechnique_DX11.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectTechnique_DX11.cs index beb0f66a..1c6c77e9 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectTechnique_DX11.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectTechnique_DX11.cs @@ -45,9 +45,7 @@ namespace ANX.RenderSystem.Windows.DX11 { for (int i = 0; i < NativeTechnique.Description.PassCount; i++) { - var passDx11 = new EffectPass_DX11(NativeTechnique.GetPassByIndex(i)); - // TODO: wire up native pass and managed pass? - yield return new EffectPass(this.parentEffect); + yield return new EffectPass(new EffectPass_DX11(this.parentEffect, NativeTechnique.GetPassByIndex(i))); } } } @@ -56,5 +54,23 @@ namespace ANX.RenderSystem.Windows.DX11 { get { throw new NotImplementedException(); } } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposeManaged) + { + if (disposeManaged) + { + if (NativeTechnique != null) + { + NativeTechnique.Dispose(); + NativeTechnique = null; + } + } + } } } diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/Extensions.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/Extensions.cs index 4a302fee..08a6b447 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX11/Extensions.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/Extensions.cs @@ -1,4 +1,5 @@ using SharpDX; +using SharpDX.D3DCompiler; using SharpDX.Direct3D11; using System; using System.Collections.Generic; @@ -30,5 +31,15 @@ namespace ANX.RenderSystem.Windows.DX11 { return new ResourceRegion(rect.Left, rect.Top, 0, rect.Right, rect.Bottom, 1); } + + public static ANX.Framework.Graphics.EffectParameterClass ToParameterClass(this ShaderVariableClass variableClass) + { + return DxFormatConverter.Translate(variableClass); + } + + public static ANX.Framework.Graphics.EffectParameterType ToParameterType(this ShaderVariableType variableType) + { + return DxFormatConverter.Translate(variableType); + } } } diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/GraphicsDeviceDX.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/GraphicsDeviceDX.cs index 4e293159..d7929ce9 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX11/GraphicsDeviceDX.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/GraphicsDeviceDX.cs @@ -27,14 +27,12 @@ namespace ANX.RenderSystem.Windows.DX11 static int graphicsDeviceCount = 0; static int swapChainCount = 0; #endif - //Restricted to 8 from DirectX side. - const int MAX_RENDER_TARGETS = 8; private Dx11.DeviceContext nativeDevice; - private Dx11.RenderTargetView[] renderTargetView = new RenderTargetView[MAX_RENDER_TARGETS]; - private Dx11.DepthStencilView[] depthStencilView = new DepthStencilView[MAX_RENDER_TARGETS]; + private Dx11.RenderTargetView[] renderTargetView = new RenderTargetView[1]; + private Dx11.DepthStencilView[] depthStencilView = new DepthStencilView[1]; private RenderTarget2D_DX11 backBuffer; - internal EffectDX currentEffect; + internal EffectPass_DX11 currentPass; #endregion #region CreateDevice @@ -50,7 +48,7 @@ namespace ANX.RenderSystem.Windows.DX11 OutputHandle = presentationParameters.DeviceWindowHandle, SampleDescription = new SampleDescription(1, 0), SwapEffect = SwapEffect.Discard, - Usage = Usage.RenderTargetOutput + Usage = Usage.RenderTargetOutput | Usage.ShaderInput }; // Create Device and SwapChain @@ -63,12 +61,12 @@ namespace ANX.RenderSystem.Windows.DX11 #endif // http://msdn.microsoft.com/en-us/library/windows/desktop/bb205068(v=vs.85).aspx Device.CreateWithSwapChain(DriverType.Hardware, flags, desc, out dxDevice, out swapChain); + + nativeDevice = dxDevice.ImmediateContext; #if DEBUG nativeDevice.DebugName = "GraphicsDevice_" + graphicsDeviceCount++; swapChain.DebugName = "SwapChain_" + swapChainCount++; #endif - - nativeDevice = dxDevice.ImmediateContext; } #endregion @@ -88,12 +86,9 @@ namespace ANX.RenderSystem.Windows.DX11 // Clear a RenderTarget (or BackBuffer) var clearColor = new SharpDX.Color4(color.X, color.Y, color.Z, color.W); - for (int i = 0; i < MAX_RENDER_TARGETS; i++) + foreach (var renderTargetView in this.renderTargetView) { - if (this.renderTargetView[i] == null) - break; - - nativeDevice.ClearRenderTargetView(this.renderTargetView[i], clearColor); + nativeDevice.ClearRenderTargetView(renderTargetView, clearColor); } } @@ -111,12 +106,9 @@ namespace ANX.RenderSystem.Windows.DX11 clearFlags = Dx11.DepthStencilClearFlags.Depth; } - for (int i = 0; i < MAX_RENDER_TARGETS; i++) + foreach (var depthStencilView in this.depthStencilView) { - if (this.depthStencilView[i] == null) - break; - - nativeDevice.ClearDepthStencilView(this.depthStencilView[i], clearFlags, depth, (byte)stencil); + nativeDevice.ClearDepthStencilView(depthStencilView, clearFlags, depth, (byte)stencil); } } @@ -127,212 +119,25 @@ namespace ANX.RenderSystem.Windows.DX11 { swapChain.Present(VSync ? 1 : 0, PresentFlags.None); } + + public void Present(Rectangle? sourceRectangle, Rectangle? destinationRectangle, WindowHandle overrideWindowHandle) + { + throw new NotImplementedException(); + } #endregion - #region DrawIndexedPrimitives - public void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, IndexBuffer indexBuffer) - { - if (primitiveCount <= 0) throw new ArgumentOutOfRangeException("primitiveCount is less than or equal to zero. When drawing, at least one primitive must be drawn."); - if (this.currentVertexBuffer == null || this.currentVertexBufferCount <= 0) throw new InvalidOperationException("you have to set a valid vertex buffer before drawing."); - - Dx11.EffectTechnique technique = SetupEffectForDraw(); - int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount); + private void SetupDraw(PrimitiveType primitiveType) + { + var inputLayout = this.inputLayoutManager.GetInputLayout(NativeDevice.Device, currentPass.Signature, this.currentVertexBuffer); nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType); - //nativeDevice.Rasterizer.SetViewports(currentViewport); - //nativeDevice.OutputMerger.SetTargets(this.depthStencilView, this.renderView); - - if (indexBuffer != null) + if (currentInputLayout != inputLayout) { - SetIndexBuffer(indexBuffer); - } - - for (int i = 0; i < technique.Description.PassCount; ++i) - { - technique.GetPassByIndex(i).Apply(nativeDevice); - nativeDevice.DrawIndexed(vertexCount, startIndex, baseVertex); - } - - nativeDevice.InputAssembler.InputLayout.Dispose(); - nativeDevice.InputAssembler.InputLayout = null; - } - #endregion - - #region DrawPrimitives - public void DrawPrimitives(PrimitiveType primitiveType, int vertexOffset, int primitiveCount) - { - Dx11.EffectPass pass; Dx11.EffectTechnique technique; ShaderBytecode passSignature; - SetupEffectForDraw(out pass, out technique, out passSignature); - - var layout = SetupInputLayout(passSignature); - - // Prepare All the stages - nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType); - //nativeDevice.Rasterizer.SetViewports(currentViewport); - //nativeDevice.OutputMerger.SetTargets(this.depthStencilView, this.renderView); - - for (int i = 0; i < technique.Description.PassCount; ++i) - { - pass.Apply(nativeDevice); - nativeDevice.Draw(primitiveCount, vertexOffset); - } - - layout.Dispose(); - layout = null; - } - #endregion - - #region DrawInstancedPrimitives - public void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, int instanceCount, IndexBuffer indexBuffer) - { - Dx11.EffectTechnique technique = SetupEffectForDraw(); - int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount); - - nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType); - //nativeDevice.Rasterizer.SetViewports(currentViewport); - //nativeDevice.OutputMerger.SetTargets(this.depthStencilView, this.renderView); - - if (indexBuffer != null) - { - SetIndexBuffer(indexBuffer); - } - - for (int i = 0; i < technique.Description.PassCount; ++i) - { - technique.GetPassByIndex(i).Apply(nativeDevice); - nativeDevice.DrawIndexedInstanced(vertexCount, instanceCount, startIndex, baseVertex, 0); - } - - nativeDevice.InputAssembler.InputLayout.Dispose(); - nativeDevice.InputAssembler.InputLayout = null; - } - - #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 - { - int vertexCount = vertexData.Length; - int indexCount = indexData.Length; - - using (VertexBuffer vertexBuffer = new VertexBuffer(vertexDeclaration.GraphicsDevice, vertexDeclaration, vertexCount, BufferUsage.WriteOnly)) - using (IndexBuffer indexBuffer = new IndexBuffer(vertexDeclaration.GraphicsDevice, indexFormat, indexCount, BufferUsage.WriteOnly)) - { - vertexBuffer.SetData(vertexData); - this.SetVertexBuffers(new[] { new Framework.Graphics.VertexBufferBinding(vertexBuffer, vertexOffset) }); - - if (indexData.GetType() == typeof(Int16[])) - { - indexBuffer.SetData((short[])indexData); - } - else - { - indexBuffer.SetData((int[])indexData); - } - - DrawIndexedPrimitives(primitiveType, 0, vertexOffset, numVertices, indexOffset, primitiveCount, indexBuffer); + nativeDevice.InputAssembler.InputLayout = this.inputLayoutManager.GetInputLayout(NativeDevice.Device, currentPass.Signature, this.currentVertexBuffer); + currentInputLayout = inputLayout; } } - #endregion // DrawUserIndexedPrimitives - - #region DrawUserPrimitives - public void DrawUserPrimitives(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int primitiveCount, VertexDeclaration vertexDeclaration) where T : struct, IVertexType - { - int vertexCount = vertexData.Length; - using (DxVertexBuffer vb11 = new DxVertexBuffer(this, vertexDeclaration, vertexCount, BufferUsage.WriteOnly, dynamic: true)) - { - vb11.SetData(vertexData); - - Dx11.VertexBufferBinding nativeVertexBufferBindings = new Dx11.VertexBufferBinding(vb11.NativeBuffer, vertexDeclaration.VertexStride, 0); - - nativeDevice.InputAssembler.SetVertexBuffers(0, nativeVertexBufferBindings); - - Dx11.EffectPass pass; Dx11.EffectTechnique technique; ShaderBytecode passSignature; - SetupEffectForDraw(out pass, out technique, out passSignature); - - var layout = CreateInputLayout(nativeDevice.Device, passSignature, vertexDeclaration); - - nativeDevice.InputAssembler.InputLayout = layout; - // Prepare All the stages - nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType); - //nativeDevice.Rasterizer.SetViewports(currentViewport); - //device.OutputMerger.SetTargets(this.depthStencilView, this.renderView); - - for (int i = 0; i < technique.Description.PassCount; ++i) - { - pass.Apply(nativeDevice); - nativeDevice.Draw(primitiveCount, vertexOffset); - } - - layout.Dispose(); - layout = null; - } - } - - #endregion // DrawUserPrimitives - - #region SetupEffectForDraw - private void SetupEffectForDraw(out Dx11.EffectPass pass, out Dx11.EffectTechnique technique, - out ShaderBytecode passSignature) - { - // get the current effect - //TODO: check for null and throw exception - EffectDX effect = this.currentEffect; - - // get the input semantic of the current effect / technique that is used - //TODO: check for null's and throw exceptions - // TODO: get the correct pass index! - technique = effect.GetCurrentTechnique().NativeTechnique; - pass = technique.GetPassByIndex(0); - passSignature = pass.Description.Signature; - } - - private Dx11.EffectTechnique SetupEffectForDraw() - { - //TODO: check for currentEffect null and throw exception - // TODO: check for null's and throw exceptions - // TODO: get the correct pass index! - var technique = currentEffect.GetCurrentTechnique().NativeTechnique; - var pass = technique.GetPassByIndex(0); - SetupInputLayout(pass.Description.Signature); - - return technique; - } - #endregion - - #region SetupInputLayout - private InputLayout SetupInputLayout(ShaderBytecode passSignature) - { - // get the VertexDeclaration from current VertexBuffer to create input layout for the input assembler - var layout = CreateInputLayout(nativeDevice.Device, passSignature, currentVertexBuffer); - - nativeDevice.InputAssembler.InputLayout = layout; - return layout; - } - #endregion - - #region SetIndexBuffer - public void SetIndexBuffer(IndexBuffer indexBuffer) - { - if (indexBuffer == null) - throw new ArgumentNullException("indexBuffer"); - - this.currentIndexBuffer = indexBuffer; - DxIndexBuffer nativeIndexBuffer = indexBuffer.NativeIndexBuffer as DxIndexBuffer; - - if (nativeIndexBuffer != null) - { - nativeDevice.InputAssembler.SetIndexBuffer(nativeIndexBuffer.NativeBuffer, - DxFormatConverter.Translate(indexBuffer.IndexElementSize), 0); - } - else - throw new Exception("couldn't fetch native DirectX10 IndexBuffer"); - } - #endregion - #region SetVertexBuffers public void SetVertexBuffers(ANX.Framework.Graphics.VertexBufferBinding[] vertexBuffers) { @@ -384,49 +189,6 @@ namespace ANX.RenderSystem.Windows.DX11 } #endregion - #region CreateInputLayout - private InputLayout CreateInputLayout(Device device, ShaderBytecode passSignature, params VertexDeclaration[] vertexDeclaration) - { - if (device == null) throw new ArgumentNullException("device"); - if (passSignature == null) throw new ArgumentNullException("passSignature"); - if (vertexDeclaration == null) throw new ArgumentNullException("vertexDeclaration"); - - //TODO: try to get rid of the list - List inputElements = new List(); - foreach (VertexDeclaration decl in vertexDeclaration) - { - foreach (VertexElement vertexElement in decl.GetVertexElements()) - { - inputElements.Add(CreateInputElementFromVertexElement(vertexElement, 0)); - } - } - - return new InputLayout(device, passSignature, inputElements.ToArray()); - } - - private InputLayout CreateInputLayout(Device device, ShaderBytecode passSignature, params ANX.Framework.Graphics.VertexBufferBinding[] vertexBufferBindings) - { - if (device == null) throw new ArgumentNullException("device"); - if (passSignature == null) throw new ArgumentNullException("passSignature"); - if (vertexBufferBindings == null) throw new ArgumentNullException("vertexBufferBindings"); - - //TODO: try to get rid of the list - List inputElements = new List(); - int slot = 0; - foreach (ANX.Framework.Graphics.VertexBufferBinding binding in vertexBufferBindings) - { - foreach (VertexElement vertexElement in binding.VertexBuffer.VertexDeclaration.GetVertexElements()) - { - inputElements.Add(CreateInputElementFromVertexElement(vertexElement, binding.InstanceFrequency, slot)); - } - slot++; - } - - // Layout from VertexShader input signature - return new InputLayout(device, passSignature, inputElements.ToArray()); - } - #endregion - #region CreateInputElementFromVertexElement private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement, int slot) { @@ -446,27 +208,21 @@ namespace ANX.RenderSystem.Windows.DX11 { if (renderTargets == null || renderTargets.Length == 0) { - this.renderTargetView[0] = this.backBuffer.RenderTargetView; - this.depthStencilView[0] = this.backBuffer.DepthStencilView; - - for (int i = 1; i < MAX_RENDER_TARGETS; i++) - { - this.renderTargetView[i] = null; - this.depthStencilView[i] = null; - } + this.renderTargetView = new RenderTargetView[] { this.backBuffer.RenderTargetView }; + this.depthStencilView = new DepthStencilView[] { this.backBuffer.DepthStencilView }; + nativeDevice.OutputMerger.ResetTargets(); //To correctly unset renderTargets, the amount of given rendertargetViews must be max(#previousRenderTargets, #newRenderTargets), //otherwise the old ones at the slots stay bound. For us it means, we try to unbind every possible previous slot. - nativeDevice.OutputMerger.SetRenderTargets(this.backBuffer.DepthStencilView, this.renderTargetView); + nativeDevice.OutputMerger.SetRenderTargets(this.backBuffer.DepthStencilView, this.backBuffer.RenderTargetView); nativeDevice.Rasterizer.SetViewport(new SharpDX.ViewportF(0, 0, this.backBuffer.Width, this.backBuffer.Height)); } else { int renderTargetCount = renderTargets.Length; - if (renderTargetCount > MAX_RENDER_TARGETS) - throw new NotSupportedException(string.Format("{0} render targets are not supported. The maximum is {1}.", renderTargetCount, MAX_RENDER_TARGETS)); - var rtViewports = new SharpDX.ViewportF[renderTargetCount]; + this.renderTargetView = new RenderTargetView[renderTargetCount]; + this.depthStencilView = new DepthStencilView[renderTargetCount]; var firstRenderTarget = renderTargets[0].RenderTarget as RenderTarget2D; for (int i = 1; i < renderTargetCount; i++) @@ -481,16 +237,12 @@ namespace ANX.RenderSystem.Windows.DX11 RenderTarget2D renderTarget = renderTargets[i].RenderTarget as RenderTarget2D; var nativeRenderTarget = renderTarget.NativeRenderTarget as RenderTarget2D_DX11; - renderTargetView[i] = nativeRenderTarget.RenderTargetView; - depthStencilView[i] = nativeRenderTarget.DepthStencilView; + this.renderTargetView[i] = nativeRenderTarget.RenderTargetView; + this.depthStencilView[i] = nativeRenderTarget.DepthStencilView; rtViewports[i] = new SharpDX.ViewportF(0, 0, renderTarget.Width, renderTarget.Height); } - for (int i = renderTargetCount; i < MAX_RENDER_TARGETS; i++) - { - this.renderTargetView[i] = null; - this.depthStencilView[i] = null; - } + nativeDevice.OutputMerger.ResetTargets(); nativeDevice.OutputMerger.SetRenderTargets(this.depthStencilView[0], renderTargetView); nativeDevice.Rasterizer.SetViewports(rtViewports); @@ -502,34 +254,13 @@ namespace ANX.RenderSystem.Windows.DX11 { if (backBuffer != null) { - for (int i = 0; i < MAX_RENDER_TARGETS; i++) - { - this.renderTargetView[i] = null; - this.depthStencilView[i] = null; - } - - nativeDevice.OutputMerger.SetRenderTargets(null, this.renderTargetView); + nativeDevice.OutputMerger.ResetTargets(); backBuffer.Dispose(); backBuffer = null; } } - #region Dispose - public void Dispose() - { - if (swapChain != null) - { - DisposeBackBuffer(); - - swapChain.Dispose(); - swapChain = null; - } - - //TODO: dispose everything else - } - #endregion - internal DeviceContext NativeDevice { get diff --git a/Samples/SampleContent/SampleContent.cproj b/Samples/SampleContent/SampleContent.cproj index e200e983..5fe7c43f 100644 --- a/Samples/SampleContent/SampleContent.cproj +++ b/Samples/SampleContent/SampleContent.cproj @@ -104,7 +104,6 @@ ..\..\bin\Debug\ANX.InputSystem.Standard.dll ..\..\bin\Debug\ANX.PlatformSystem.Windows.dll ..\..\bin\Debug\ANX.RenderSystem.Windows.DX10.dll - ..\..\bin\Debug\ANX.RenderSystem.Windows.DX11.dll ..\..\bin\Debug\AssimpNet.dll diff --git a/Samples/StencilBuffer.sln b/Samples/StencilBuffer.sln index fab78b4d..3ad84395 100644 --- a/Samples/StencilBuffer.sln +++ b/Samples/StencilBuffer.sln @@ -1,58 +1,199 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleContent", "SampleContent\SampleContent.contentproj", "{FA6E229D-4504-47B1-8A23-2D3FCC13F778}" -EndProject +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StencilBuffer", "StencilBuffer\StencilBuffer.csproj", "{41E6C2CF-51EA-4D8E-96AE-739CA3951766}" + ProjectSection(ProjectDependencies) = postProject + {75EFAE60-726E-430F-8661-4CF9ABD1306C} = {75EFAE60-726E-430F-8661-4CF9ABD1306C} + EndProjectSection +EndProject +Project("{75EFAE60-726E-430F-8661-4CF9ABD1306C}") = "SampleContent", "SampleContent\SampleContent.cproj", "{75EFAE60-726E-430F-8661-4CF9ABD1306C}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU + Debug|Android = Debug|Android + Debug|iOS = Debug|iOS + Debug|Linux = Debug|Linux + Debug|Mac OS = Debug|Mac OS Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|PS Vita = Debug|PS Vita + Debug|Windows = Debug|Windows + Debug|Windows Metro = Debug|Windows Metro + Debug|Windows Phone = Debug|Windows Phone Debug|x86 = Debug|x86 - DebugWin8|Any CPU = DebugWin8|Any CPU + Debug|XBox 360 = Debug|XBox 360 + DebugWin8|Android = DebugWin8|Android + DebugWin8|iOS = DebugWin8|iOS + DebugWin8|Linux = DebugWin8|Linux + DebugWin8|Mac OS = DebugWin8|Mac OS DebugWin8|Mixed Platforms = DebugWin8|Mixed Platforms + DebugWin8|PS Vita = DebugWin8|PS Vita + DebugWin8|Windows = DebugWin8|Windows + DebugWin8|Windows Metro = DebugWin8|Windows Metro + DebugWin8|Windows Phone = DebugWin8|Windows Phone DebugWin8|x86 = DebugWin8|x86 - Release|Any CPU = Release|Any CPU + DebugWin8|XBox 360 = DebugWin8|XBox 360 + Release|Android = Release|Android + Release|iOS = Release|iOS + Release|Linux = Release|Linux + Release|Mac OS = Release|Mac OS Release|Mixed Platforms = Release|Mixed Platforms + Release|PS Vita = Release|PS Vita + Release|Windows = Release|Windows + Release|Windows Metro = Release|Windows Metro + Release|Windows Phone = Release|Windows Phone Release|x86 = Release|x86 - ReleaseWin8|Any CPU = ReleaseWin8|Any CPU + Release|XBox 360 = Release|XBox 360 + ReleaseWin8|Android = ReleaseWin8|Android + ReleaseWin8|iOS = ReleaseWin8|iOS + ReleaseWin8|Linux = ReleaseWin8|Linux + ReleaseWin8|Mac OS = ReleaseWin8|Mac OS ReleaseWin8|Mixed Platforms = ReleaseWin8|Mixed Platforms + ReleaseWin8|PS Vita = ReleaseWin8|PS Vita + ReleaseWin8|Windows = ReleaseWin8|Windows + ReleaseWin8|Windows Metro = ReleaseWin8|Windows Metro + ReleaseWin8|Windows Phone = ReleaseWin8|Windows Phone ReleaseWin8|x86 = ReleaseWin8|x86 + ReleaseWin8|XBox 360 = ReleaseWin8|XBox 360 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.Debug|x86.ActiveCfg = Debug|Any CPU - {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.DebugWin8|Any CPU.ActiveCfg = Debug|Any CPU - {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.DebugWin8|Mixed Platforms.ActiveCfg = Debug|Any CPU - {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.DebugWin8|x86.ActiveCfg = Debug|Any CPU - {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.Release|Any CPU.ActiveCfg = Debug|Any CPU - {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.Release|Mixed Platforms.ActiveCfg = Debug|Any CPU - {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.Release|x86.ActiveCfg = Debug|Any CPU - {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.ReleaseWin8|Any CPU.ActiveCfg = Debug|Any CPU - {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.ReleaseWin8|Mixed Platforms.ActiveCfg = Debug|Any CPU - {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.ReleaseWin8|x86.ActiveCfg = Debug|Any CPU - {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|Any CPU.ActiveCfg = Debug|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|Android.ActiveCfg = Debug|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|iOS.ActiveCfg = Debug|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|Linux.ActiveCfg = Debug|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|Mac OS.ActiveCfg = Debug|x86 {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|PS Vita.ActiveCfg = Debug|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|Windows.ActiveCfg = Debug|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|Windows Metro.ActiveCfg = Debug|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|Windows Phone.ActiveCfg = Debug|x86 {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|x86.ActiveCfg = Debug|x86 {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|x86.Build.0 = Debug|x86 - {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|Any CPU.ActiveCfg = DebugWin8|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|XBox 360.ActiveCfg = Debug|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|Android.ActiveCfg = DebugWin8|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|iOS.ActiveCfg = DebugWin8|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|Linux.ActiveCfg = DebugWin8|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|Mac OS.ActiveCfg = DebugWin8|x86 {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|Mixed Platforms.ActiveCfg = DebugWin8|x86 {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|Mixed Platforms.Build.0 = DebugWin8|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|PS Vita.ActiveCfg = DebugWin8|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|Windows.ActiveCfg = DebugWin8|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|Windows Metro.ActiveCfg = DebugWin8|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|Windows Phone.ActiveCfg = DebugWin8|x86 {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|x86.ActiveCfg = DebugWin8|x86 {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|x86.Build.0 = DebugWin8|x86 - {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|Any CPU.ActiveCfg = Release|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|XBox 360.ActiveCfg = DebugWin8|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|Android.ActiveCfg = Release|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|iOS.ActiveCfg = Release|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|Linux.ActiveCfg = Release|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|Mac OS.ActiveCfg = Release|x86 {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|Mixed Platforms.ActiveCfg = Release|x86 {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|Mixed Platforms.Build.0 = Release|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|PS Vita.ActiveCfg = Release|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|Windows.ActiveCfg = Release|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|Windows Metro.ActiveCfg = Release|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|Windows Phone.ActiveCfg = Release|x86 {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|x86.ActiveCfg = Release|x86 {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|x86.Build.0 = Release|x86 - {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|Any CPU.ActiveCfg = ReleaseWin8|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|XBox 360.ActiveCfg = Release|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|Android.ActiveCfg = ReleaseWin8|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|iOS.ActiveCfg = ReleaseWin8|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|Linux.ActiveCfg = ReleaseWin8|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|Mac OS.ActiveCfg = ReleaseWin8|x86 {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|Mixed Platforms.ActiveCfg = ReleaseWin8|x86 {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|Mixed Platforms.Build.0 = ReleaseWin8|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|PS Vita.ActiveCfg = ReleaseWin8|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|Windows.ActiveCfg = ReleaseWin8|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|Windows Metro.ActiveCfg = ReleaseWin8|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|Windows Phone.ActiveCfg = ReleaseWin8|x86 {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|x86.ActiveCfg = ReleaseWin8|x86 {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|x86.Build.0 = ReleaseWin8|x86 + {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|XBox 360.ActiveCfg = ReleaseWin8|x86 + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Android.ActiveCfg = Debug|Android + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Android.Build.0 = Debug|Android + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|iOS.ActiveCfg = Debug|iOS + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|iOS.Build.0 = Debug|iOS + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Linux.ActiveCfg = Debug|Linux + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Linux.Build.0 = Debug|Linux + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Mac OS.ActiveCfg = Debug|Mac OS + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Mac OS.Build.0 = Debug|Mac OS + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Mixed Platforms.ActiveCfg = Debug|XBox 360 + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Mixed Platforms.Build.0 = Debug|XBox 360 + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|PS Vita.ActiveCfg = Debug|PS Vita + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|PS Vita.Build.0 = Debug|PS Vita + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Windows.ActiveCfg = Debug|Windows + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Windows.Build.0 = Debug|Windows + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Windows Metro.ActiveCfg = Debug|Windows Metro + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Windows Metro.Build.0 = Debug|Windows Metro + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Windows Phone.ActiveCfg = Debug|Windows Phone + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Windows Phone.Build.0 = Debug|Windows Phone + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|x86.ActiveCfg = Debug|XBox 360 + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|XBox 360.ActiveCfg = Debug|XBox 360 + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|XBox 360.Build.0 = Debug|XBox 360 + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Android.ActiveCfg = Debug|Android + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Android.Build.0 = Debug|Android + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|iOS.ActiveCfg = Debug|iOS + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|iOS.Build.0 = Debug|iOS + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Linux.ActiveCfg = Debug|Linux + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Linux.Build.0 = Debug|Linux + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Mac OS.ActiveCfg = Debug|Mac OS + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Mac OS.Build.0 = Debug|Mac OS + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Mixed Platforms.ActiveCfg = Debug|XBox 360 + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Mixed Platforms.Build.0 = Debug|XBox 360 + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|PS Vita.ActiveCfg = Debug|PS Vita + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|PS Vita.Build.0 = Debug|PS Vita + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Windows.ActiveCfg = Debug|Windows + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Windows.Build.0 = Debug|Windows + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Windows Metro.ActiveCfg = Debug|Windows Metro + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Windows Metro.Build.0 = Debug|Windows Metro + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Windows Phone.ActiveCfg = Debug|Windows Phone + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Windows Phone.Build.0 = Debug|Windows Phone + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|x86.ActiveCfg = Debug|XBox 360 + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|XBox 360.ActiveCfg = Debug|XBox 360 + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|XBox 360.Build.0 = Debug|XBox 360 + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Android.ActiveCfg = Release|Android + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Android.Build.0 = Release|Android + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|iOS.ActiveCfg = Release|iOS + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|iOS.Build.0 = Release|iOS + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Linux.ActiveCfg = Release|Linux + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Linux.Build.0 = Release|Linux + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Mac OS.ActiveCfg = Release|Mac OS + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Mac OS.Build.0 = Release|Mac OS + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Mixed Platforms.ActiveCfg = Release|XBox 360 + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Mixed Platforms.Build.0 = Release|XBox 360 + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|PS Vita.ActiveCfg = Release|PS Vita + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|PS Vita.Build.0 = Release|PS Vita + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Windows.ActiveCfg = Release|Windows + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Windows.Build.0 = Release|Windows + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Windows Metro.ActiveCfg = Release|Windows Metro + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Windows Metro.Build.0 = Release|Windows Metro + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Windows Phone.ActiveCfg = Release|Windows Phone + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Windows Phone.Build.0 = Release|Windows Phone + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|x86.ActiveCfg = Release|XBox 360 + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|XBox 360.ActiveCfg = Release|XBox 360 + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|XBox 360.Build.0 = Release|XBox 360 + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Android.ActiveCfg = Release|Android + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Android.Build.0 = Release|Android + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|iOS.ActiveCfg = Release|iOS + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|iOS.Build.0 = Release|iOS + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Linux.ActiveCfg = Release|Linux + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Linux.Build.0 = Release|Linux + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Mac OS.ActiveCfg = Release|Mac OS + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Mac OS.Build.0 = Release|Mac OS + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Mixed Platforms.ActiveCfg = Release|XBox 360 + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Mixed Platforms.Build.0 = Release|XBox 360 + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|PS Vita.ActiveCfg = Release|PS Vita + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|PS Vita.Build.0 = Release|PS Vita + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Windows.ActiveCfg = Release|Windows + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Windows.Build.0 = Release|Windows + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Windows Metro.ActiveCfg = Release|Windows Metro + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Windows Metro.Build.0 = Release|Windows Metro + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Windows Phone.ActiveCfg = Release|Windows Phone + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Windows Phone.Build.0 = Release|Windows Phone + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|x86.ActiveCfg = Release|XBox 360 + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|XBox 360.ActiveCfg = Release|XBox 360 + {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|XBox 360.Build.0 = Release|XBox 360 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Samples/StencilBuffer/StencilBuffer.csproj b/Samples/StencilBuffer/StencilBuffer.csproj index 7fd02e52..5a075190 100644 --- a/Samples/StencilBuffer/StencilBuffer.csproj +++ b/Samples/StencilBuffer/StencilBuffer.csproj @@ -1,8 +1,8 @@  + {41E6C2CF-51EA-4D8E-96AE-739CA3951766} - {6D335F3A-9D43-41b4-9D22-F6F17C4BE596};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} Debug x86 WinExe @@ -11,28 +11,10 @@ StencilBuffer v4.0 Client - v4.0 - Windows - HiDef - 8d206378-4698-42f2-a96f-90f1ce3daa81 - Game anx.ico - GameThumbnail.png - publish\ - true - Disk - false - Foreground - 7 - Days - false - false true 0 1.0.0.%2a - false - false - true true @@ -45,7 +27,6 @@ true false x86 - false pdbonly @@ -57,7 +38,6 @@ true false x86 - true bin\x86\DebugWin8\ @@ -79,7 +59,13 @@ ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules true + + Always + + + ..\..\bin\Debug\ANX.RenderSystem.Windows.DX11.dll + False @@ -105,6 +91,14 @@ + + sharpdx_direct3d11_effects_x64.dll + PreserveNewest + + + sharpdx_direct3d11_effects_x86.dll + PreserveNewest + @@ -124,50 +118,28 @@ .NET Framework 3.5 SP1 false - - False - Windows Installer 3.1 - true - - - False - Microsoft XNA Framework Redistributable 4.0 - true - - - {6899F0C9-70B9-4EB0-9DD3-E598D4BE3E35} - ANX.Framework - - - {60D08399-244F-46A3-91F1-4CFD26D961A3} - ANX.InputDevices.Windows.XInput - - - {49066074-3B7B-4A55-B122-6BD33AB73558} - ANX.InputSystem.Standard - - - {068EB2E9-963C-4E1B-8831-E25011F11FFE} - ANX.PlatformSystem.Windows - - - {5BE49183-2F6F-4527-AC90-D816911FCF90} - ANX.RenderSystem.Windows.DX10 - - - {6A582788-C4D2-410C-96CD-177F75712D65} - ANX.SoundSystem.Windows.XAudio - - - {FA6E229D-4504-47B1-8A23-2D3FCC13F778} - SampleContent - Content - + + ..\..\bin\Debug\ANX.Framework.dll + + + ..\..\bin\Debug\ANX.InputDevices.Windows.XInput.dll + + + ..\..\bin\Debug\ANX.InputSystem.Standard.dll + + + ..\..\bin\Debug\ANX.PlatformSystem.Windows.dll + + + ..\..\bin\Debug\ANX.SoundSystem.Windows.XAudio.dll + - + + xcopy $(ProjectDir)..\SampleContent\bin\$(ConfigurationName) $(TargetDir)SampleContent\ /D /E /Y +