static IrResourceBinding ParseBinding(ResourceBinding binding) { var irBinding = new IrResourceBinding() { Name = binding.Name, Class = GetResourceClass(binding), Kind = GetResourceKind(binding), Dimension = binding.NumSamples == uint.MaxValue ? 0 : binding.NumSamples, BindPoint = binding.BindPoint, BindCount = binding.BindCount, Debug = binding.ToString() }; if ((irBinding.Class == IrResourceClass.SRV || irBinding.Class == IrResourceClass.UAV) && irBinding.Kind != IrResourceKind.TBuffer) { irBinding.ReturnType = ParseShaderReturnType(binding); } return(irBinding); }
void WriteResourceBinding(ResourceBinding resourceBinding) { Output.AppendLine(resourceBinding.ToString()); if (resourceBinding.Type == ShaderInputType.CBuffer || resourceBinding.Type == ShaderInputType.TBuffer) { return; } if (resourceBinding.Type.IsUav()) { var dcl = Container.Shader.DeclarationTokens .OfType <UnorderedAccessViewDeclarationTokenBase>() .Single(t => t.Operand.Indices[0].Value == resourceBinding.ID); if (dcl.Coherency == UnorderedAccessViewCoherency.GloballyCoherent) { Output.Append("globallycoherent "); } } var type = GetBindingName(resourceBinding); Output.Append(type); if (resourceBinding.Type == ShaderInputType.Texture || resourceBinding.Type == ShaderInputType.UavRwTyped) { if (!(resourceBinding.ReturnType == ResourceReturnType.Float && resourceBinding.Flags.HasFlag(ShaderInputFlags.TextureComponents) && !resourceBinding.Dimension.IsMultiSampled()) || resourceBinding.Type == ShaderInputType.UavRwTyped) { string returnType = GetReturnTypeDescription(resourceBinding.ReturnType); if (resourceBinding.Flags.HasFlag(ShaderInputFlags.TextureComponent0) && !resourceBinding.Flags.HasFlag(ShaderInputFlags.TextureComponent1)) { returnType += "2"; } if (!resourceBinding.Flags.HasFlag(ShaderInputFlags.TextureComponent0) && resourceBinding.Flags.HasFlag(ShaderInputFlags.TextureComponent1)) { returnType += "3"; } if (resourceBinding.Flags.HasFlag(ShaderInputFlags.TextureComponent0) && resourceBinding.Flags.HasFlag(ShaderInputFlags.TextureComponent1)) { returnType += "4"; } if (resourceBinding.Dimension.IsMultiSampled() && resourceBinding.NumSamples > 0) { Output.AppendFormat("<{0}, {1}>", returnType, resourceBinding.NumSamples); } else { Output.AppendFormat("<{0}>", returnType); } } } if (resourceBinding.Type.IsStructured()) { var typeName = GetStructuredTypeName(resourceBinding); Output.AppendFormat("<{0}>", typeName); } Output.Append($" {resourceBinding.Name}"); if (EmitRegisterDeclarations) { Output.Append($" : register({resourceBinding.GetBindPointDescription()})"); } Output.AppendLine($";"); }