public void WriteResourceDefinition(IrResourceDefinition resourceDefinition) { HashSet <string> seen = new HashSet <string>(); WriteLine("// ConstantBuffers"); WriteLine(resourceDefinition.ConstantBuffersDebug); foreach (var constantBuffer in resourceDefinition.ConstantBuffers) { WriteConstantBuffer(resourceDefinition, constantBuffer, ref seen); } WriteLine("// ResourceBindings"); WriteLine(resourceDefinition.ResourceBindingsDebug); foreach (var resourceBinding in resourceDefinition.ResourceBindings) { WriteResourceBinding(resourceBinding); } WriteLine(); }
public static void Parse(IrShader shader, ResourceDefinitionChunk chunk) { var rdef = new IrResourceDefinition(chunk); shader.ResourceDefinition = rdef; rdef.ResourceBindingsDebug = DisassembleBindings(chunk.ResourceBindings, chunk.Target.IsSM51); rdef.ResourceBindings = new List <IrResourceBinding>(); foreach (var binding in chunk.ResourceBindings) { rdef.ResourceBindings.Add(ParseBinding(binding)); } rdef.ConstantBuffersDebug = DisassembleBuffers(chunk.ConstantBuffers); rdef.ConstantBuffers = new List <IrConstantBuffer>(); foreach (var cbuffer in chunk.ConstantBuffers) { rdef.ConstantBuffers.Add(ParseBuffer(cbuffer)); } }
void WriteConstantBuffer(IrResourceDefinition rdef, IrConstantBuffer constantBuffer, ref HashSet <string> seen) { if (!string.IsNullOrEmpty(constantBuffer.Debug)) { WriteLineFormat("// {0}", constantBuffer.Debug); } if (constantBuffer.BufferType == ConstantBufferType.ConstantBuffer || constantBuffer.BufferType == ConstantBufferType.TextureBuffer) { if (constantBuffer.Name == "$Globals") { WriteLine("// Globals"); foreach (var variable in constantBuffer.Variables) { WriteVariable(variable, 0, packOffset: false); } WriteLine(); } else if (constantBuffer.Name == "$Params") { } else { var resourceBinding = rdef.ResourceBindings.FirstOrDefault(rb => (rb.Kind == IrResourceKind.CBuffer || rb.Kind == IrResourceKind.TBuffer) && rb.Name == constantBuffer.Name); var bufferName = resourceBinding.Kind == IrResourceKind.CBuffer ? "cbuffer" : "tbuffer"; Write($"{bufferName} {constantBuffer.Name}"); if (EmitRegisterDeclarations) { var registerName = resourceBinding.Kind == IrResourceKind.CBuffer ? "b" : "t"; Write($" : register({registerName}{resourceBinding.BindPoint})"); } WriteLine(); WriteLine("{"); foreach (var variable in constantBuffer.Variables) { WriteVariable(variable); } WriteLine("}"); WriteLine(""); } } else if (constantBuffer.BufferType == ConstantBufferType.ResourceBindInformation) { WriteLineFormat("// Resource bind info for {0}", constantBuffer.Name); var element = constantBuffer.Variables.Single(); var baseType = element.ShaderType; if (baseType.VariableClass != ShaderVariableClass.Struct) { Write("// "); WriteVariable(element); return; } var typeName = element.ShaderType.BaseTypeName; if (string.IsNullOrEmpty(typeName)) { var index = rdef.ConstantBuffers .Where(cb => cb.BufferType == ConstantBufferType.ResourceBindInformation) .ToList() .IndexOf(constantBuffer); typeName = $"struct{index}"; } if (seen.Contains(typeName)) { WriteLine($"// {baseType} {typeName}"); } else { seen.Add(typeName); WriteLine(GetShaderTypeDeclaration(baseType, overrideName: typeName)); } } }