4 using System.Runtime.CompilerServices;
5 using System.Runtime.InteropServices;
6 using SiliconStudio.Paradox.Effects;
7 using SiliconStudio.Core.Mathematics;
8 using SiliconStudio.Paradox.Shaders;
10 namespace SiliconStudio.
Paradox.Graphics.Internals
12 internal class ConstantBufferData
14 public IntPtr Data {
get;
private set; }
17 private BoundConstantBufferParam[] constantBufferParams;
22 Data = Marshal.AllocHGlobal(Desc.Size);
23 constantBufferParams =
new BoundConstantBufferParam[Desc.Members.Length];
26 public bool Update(ShaderParameterUpdater parameterUpdater)
28 bool dataChanged =
false;
32 for (
int i = 0; i < this.constantBufferParams.Length; ++i)
34 dataChanged |= UpdateValue(parameterUpdater, ref Desc.Members[i], i);
40 private unsafe
bool UpdateValue(ShaderParameterUpdater parameterUpdater, ref
EffectParameterValueData shaderVariable,
int i)
42 if (shaderVariable.Param.KeyIndex == -1)
44 throw new InvalidOperationException();
47 BoundConstantBufferParam paramReference = constantBufferParams[i];
49 var internalValue = parameterUpdater.GetInternalValue(shaderVariable.Param.KeyIndex);
52 if (internalValue.Counter == paramReference.DirtyCount
53 && internalValue == paramReference.DataPointer)
56 constantBufferParams[i] =
new BoundConstantBufferParam
59 DirtyCount = internalValue.Counter
62 var destination = (byte*)(Data + shaderVariable.Offset);
66 float* variableData = (
float*)destination;
70 switch (shaderVariable.Param.Class)
72 case EffectParameterClass.Struct:
73 internalValue.ReadFrom((IntPtr)variableData, sourceOffset, shaderVariable.Size);
75 case EffectParameterClass.Scalar:
76 for (
int elt = 0; elt < shaderVariable.Count; ++elt)
78 internalValue.ReadFrom((IntPtr)variableData, sourceOffset,
sizeof(
float));
84 case EffectParameterClass.Vector:
85 case EffectParameterClass.Color:
86 for (
int elt = 0; elt < shaderVariable.Count; ++elt)
89 internalValue.ReadFrom((IntPtr)variableData, sourceOffset, (
int)(shaderVariable.ColumnCount *
sizeof(float)));
90 sourceOffset += (int)shaderVariable.ColumnCount * 4;
94 case EffectParameterClass.MatrixColumns:
95 for (
int elt = 0; elt < shaderVariable.Count; ++elt)
99 internalValue.ReadFrom((IntPtr)(byte*)&tempMatrix, sourceOffset, (int)(shaderVariable.ColumnCount * shaderVariable.RowCount *
sizeof(
float)));
100 ((
Matrix*)variableData)->CopyMatrixFrom((
float*)&tempMatrix, unchecked((
int)shaderVariable.ColumnCount), unchecked((
int)shaderVariable.RowCount));
101 sourceOffset += (int)(shaderVariable.ColumnCount * shaderVariable.RowCount) * 4;
102 variableData += 4 * shaderVariable.RowCount;
106 case EffectParameterClass.MatrixRows:
107 for (
int elt = 0; elt < shaderVariable.Count; ++elt)
111 internalValue.ReadFrom((IntPtr)(byte*)&tempMatrix, sourceOffset, (int)(shaderVariable.ColumnCount * shaderVariable.RowCount *
sizeof(
float)));
112 ((
Matrix*)variableData)->TransposeMatrixFrom((
float*)&tempMatrix, unchecked((
int)shaderVariable.ColumnCount), unchecked((
int)shaderVariable.RowCount));
114 sourceOffset += (int)(shaderVariable.ColumnCount * shaderVariable.RowCount) * 4;
115 variableData += 4 * shaderVariable.RowCount;
124 private struct BoundConstantBufferParam
126 public int DirtyCount;
Describes a shader parameter for a valuetype (usually stored in constant buffers).
Description of a constant buffer.
Holds a value inside ParameterCollection.
Represents a 4x4 mathematical matrix.