From 2ffe3004cdbda93cbe900509f19edcc5caf15dd3 Mon Sep 17 00:00:00 2001 From: "SND\\AstrorEnales_cp" Date: Sun, 19 Aug 2012 17:34:27 +0000 Subject: [PATCH] Implemented caching of the shader parameter size --- .../Shader/ExtendedShader.cs | 4 + .../Shader/ExtendedShaderParameter.cs | 79 +++++++++++++++++-- .../Shader/ExtendedShaderPass.cs | 4 + .../Shader/ParameterBuffer.cs | 28 +------ 4 files changed, 82 insertions(+), 33 deletions(-) diff --git a/RenderSystems/ANX.RenderSystem.Windows.Metro/Shader/ExtendedShader.cs b/RenderSystems/ANX.RenderSystem.Windows.Metro/Shader/ExtendedShader.cs index 31b631ec..1bc26d51 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.Metro/Shader/ExtendedShader.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.Metro/Shader/ExtendedShader.cs @@ -2,6 +2,10 @@ using System.Collections.Generic; using System.IO; +// This file is part of the ANX.Framework created by the +// "ANX.Framework developer group" and released under the Ms-PL license. +// For details see: http://anxframework.codeplex.com/license + namespace ANX.RenderSystem.Windows.Metro.Shader { public class ExtendedShader diff --git a/RenderSystems/ANX.RenderSystem.Windows.Metro/Shader/ExtendedShaderParameter.cs b/RenderSystems/ANX.RenderSystem.Windows.Metro/Shader/ExtendedShaderParameter.cs index d8d738d5..bee6809c 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.Metro/Shader/ExtendedShaderParameter.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.Metro/Shader/ExtendedShaderParameter.cs @@ -1,27 +1,92 @@ using System; using System.IO; +// This file is part of the ANX.Framework created by the +// "ANX.Framework developer group" and released under the Ms-PL license. +// For details see: http://anxframework.codeplex.com/license + namespace ANX.RenderSystem.Windows.Metro.Shader { public class ExtendedShaderParameter - { - public string Type; - public string Name; - public int ArraySize; - public int[] TypeDimensions; + { + #region Public + public string Type + { + get; + private set; + } - public ExtendedShaderParameter(BinaryReader reader) + public string Name + { + get; + private set; + } + + public int ArraySize + { + get; + private set; + } + + public int[] TypeDimensions + { + get; + private set; + } + + public int SizeInBytes + { + get; + private set; + } + + public bool IsTexture + { + get; + private set; + } + #endregion + + #region Constructor + public ExtendedShaderParameter(BinaryReader reader) { Type = reader.ReadString(); Name = reader.ReadString(); ArraySize = reader.ReadInt32(); + IsTexture = Type.ToLower().Contains("texture"); + SizeInBytes = GetParameterTypeSize() * ArraySize; + int numberOfDimensions = reader.ReadByte(); TypeDimensions = new int[numberOfDimensions]; for (int dimIndex = 0; dimIndex < numberOfDimensions; dimIndex++) { TypeDimensions[dimIndex] = (int)reader.ReadByte(); + SizeInBytes *= TypeDimensions[dimIndex]; } } - } + #endregion + + #region GetParameterTypeSize + private int GetParameterTypeSize() + { + if (IsTexture) + return 0; + + if (Type == "float" || + Type == "int" || + Type == "uint" || + Type == "dword") + return 4; + if (Type == "double") + return 8; + if (Type == "bool") + return 1; + if (Type == "half") + return 2; + + throw new NotImplementedException("Parameter type " + Type + " has no size value!"); + } + #endregion + } } diff --git a/RenderSystems/ANX.RenderSystem.Windows.Metro/Shader/ExtendedShaderPass.cs b/RenderSystems/ANX.RenderSystem.Windows.Metro/Shader/ExtendedShaderPass.cs index 3adcce9b..5f6b6203 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.Metro/Shader/ExtendedShaderPass.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.Metro/Shader/ExtendedShaderPass.cs @@ -1,6 +1,10 @@ using System; using System.IO; +// This file is part of the ANX.Framework created by the +// "ANX.Framework developer group" and released under the Ms-PL license. +// For details see: http://anxframework.codeplex.com/license + namespace ANX.RenderSystem.Windows.Metro.Shader { public class ExtendedShaderPass diff --git a/RenderSystems/ANX.RenderSystem.Windows.Metro/Shader/ParameterBuffer.cs b/RenderSystems/ANX.RenderSystem.Windows.Metro/Shader/ParameterBuffer.cs index 5a1d7ae9..4a750655 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.Metro/Shader/ParameterBuffer.cs +++ b/RenderSystems/ANX.RenderSystem.Windows.Metro/Shader/ParameterBuffer.cs @@ -191,17 +191,10 @@ namespace ANX.RenderSystem.Windows.Metro.Shader else { var parameter = parentEffect.shader.Parameters[index]; - if (parameter.Type.ToLower().Contains("texture")) + if (parameter.IsTexture) continue; - int size = GetParameterTypeSize(parameter.Type); - foreach (int dimension in parameter.TypeDimensions) - { - size *= dimension; - } - - size *= parameter.ArraySize; - writer.Write(new byte[size]); + writer.Write(new byte[parameter.SizeInBytes]); } } @@ -224,23 +217,6 @@ namespace ANX.RenderSystem.Windows.Metro.Shader } #endregion - private int GetParameterTypeSize(string type) - { - if (type == "float" || - type == "int" || - type == "uint" || - type == "dword") - return 4; - if (type == "double") - return 8; - if (type == "bool") - return 1; - if (type == "half") - return 2; - - throw new NotImplementedException("Parameter type " + type + " has no size value!"); - } - #region Dispose public void Dispose() {