131 lines
4.7 KiB
C#
131 lines
4.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace TwoMGFX
|
|
{
|
|
internal partial class ConstantBufferData
|
|
{
|
|
public ConstantBufferData(SharpDX.D3DCompiler.ConstantBuffer cb)
|
|
{
|
|
Name = string.Empty;
|
|
Size = cb.Description.Size;
|
|
|
|
ParameterIndex = new List<int>();
|
|
|
|
var parameters = new List<EffectObject.d3dx_parameter>();
|
|
|
|
// Gather all the parameters.
|
|
for (var i = 0; i < cb.Description.VariableCount; i++)
|
|
{
|
|
var vdesc = cb.GetVariable(i);
|
|
|
|
var param = GetParameterFromType(vdesc.GetVariableType());
|
|
|
|
param.name = vdesc.Description.Name;
|
|
param.semantic = string.Empty;
|
|
param.bufferOffset = vdesc.Description.StartOffset;
|
|
|
|
var size = param.columns * param.rows * 4;
|
|
var data = new byte[size];
|
|
|
|
if (vdesc.Description.DefaultValue != IntPtr.Zero)
|
|
Marshal.Copy(vdesc.Description.DefaultValue, data, 0, (int)size);
|
|
|
|
param.data = data;
|
|
|
|
parameters.Add(param);
|
|
}
|
|
|
|
// Sort them by the offset for some consistent results.
|
|
Parameters = parameters.OrderBy(e => e.bufferOffset).ToList();
|
|
|
|
// Store the parameter offsets.
|
|
ParameterOffset = new List<int>();
|
|
foreach (var param in Parameters)
|
|
ParameterOffset.Add(param.bufferOffset);
|
|
}
|
|
|
|
private static EffectObject.d3dx_parameter GetParameterFromType(SharpDX.D3DCompiler.ShaderReflectionType type)
|
|
{
|
|
var param = new EffectObject.d3dx_parameter();
|
|
param.rows = (uint)type.Description.RowCount;
|
|
param.columns = (uint)type.Description.ColumnCount;
|
|
param.name = type.Description.Name ?? string.Empty;
|
|
param.semantic = string.Empty;
|
|
param.bufferOffset = type.Description.Offset;
|
|
|
|
switch (type.Description.Class)
|
|
{
|
|
case SharpDX.D3DCompiler.ShaderVariableClass.Scalar:
|
|
param.class_ = EffectObject.D3DXPARAMETER_CLASS.SCALAR;
|
|
break;
|
|
|
|
case SharpDX.D3DCompiler.ShaderVariableClass.Vector:
|
|
param.class_ = EffectObject.D3DXPARAMETER_CLASS.VECTOR;
|
|
break;
|
|
|
|
case SharpDX.D3DCompiler.ShaderVariableClass.MatrixColumns:
|
|
param.class_ = EffectObject.D3DXPARAMETER_CLASS.MATRIX_COLUMNS;
|
|
break;
|
|
|
|
default:
|
|
throw new Exception("Unsupported parameter class!");
|
|
}
|
|
|
|
switch (type.Description.Type)
|
|
{
|
|
case SharpDX.D3DCompiler.ShaderVariableType.Bool:
|
|
param.type = EffectObject.D3DXPARAMETER_TYPE.BOOL;
|
|
break;
|
|
|
|
case SharpDX.D3DCompiler.ShaderVariableType.Float:
|
|
param.type = EffectObject.D3DXPARAMETER_TYPE.FLOAT;
|
|
break;
|
|
|
|
case SharpDX.D3DCompiler.ShaderVariableType.Int:
|
|
param.type = EffectObject.D3DXPARAMETER_TYPE.INT;
|
|
break;
|
|
|
|
default:
|
|
throw new Exception("Unsupported parameter type!");
|
|
}
|
|
|
|
param.member_count = (uint)type.Description.MemberCount;
|
|
param.element_count = (uint)type.Description.ElementCount;
|
|
|
|
if (param.member_count > 0)
|
|
{
|
|
param.member_handles = new EffectObject.d3dx_parameter[param.member_count];
|
|
for (var i = 0; i < param.member_count; i++)
|
|
{
|
|
var mparam = GetParameterFromType(type.GetMemberType(i));
|
|
mparam.name = type.GetMemberTypeName(i) ?? string.Empty;
|
|
param.member_handles[i] = mparam;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
param.member_handles = new EffectObject.d3dx_parameter[param.element_count];
|
|
for (var i = 0; i < param.element_count; i++)
|
|
{
|
|
var mparam = new EffectObject.d3dx_parameter();
|
|
|
|
mparam.name = string.Empty;
|
|
mparam.semantic = string.Empty;
|
|
mparam.type = param.type;
|
|
mparam.class_ = param.class_;
|
|
mparam.rows = param.rows;
|
|
mparam.columns = param.columns;
|
|
mparam.data = new byte[param.columns * param.rows * 4];
|
|
|
|
param.member_handles[i] = mparam;
|
|
}
|
|
}
|
|
|
|
return param;
|
|
}
|
|
|
|
}
|
|
} |