private void WriteResourceBinding(IrResourceBinding binding) { if (binding.Kind == IrResourceKind.CBuffer || binding.Kind == IrResourceKind.TBuffer) { WriteLineFormat("//{0} {1}", binding.Kind, binding.Name); return; } var typeName = GetBindingTypeName(binding); WriteFormat("{0}", typeName); if (binding.ReturnType != null) { var dimStr = binding.Dimension > 0 ? $", {binding.Dimension}" : ""; if (binding.ReturnType.VariableClass == ShaderVariableClass.Struct) { WriteFormat("<struct {0}>", binding.ReturnType.BaseTypeName); } else { WriteFormat("<{0}{1}>", GetShaderTypeDeclaration(binding.ReturnType), dimStr); } } WriteFormat(" {0}", binding.Name); if (binding.BindCount > 0) { WriteFormat("[{0}]", binding.BindCount); } if (EmitRegisterDeclarations) { WriteFormat(" : register({0})", binding.GetBindPointDescription()); } WriteLine(";"); }
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); }
string GetBindingTypeName(IrResourceBinding binding) { switch (binding.Class) { case IrResourceClass.CBuffer: return("cbuffer"); case IrResourceClass.Sampler: return("SamplerState"); case IrResourceClass.SRV: switch (binding.Kind) { case IrResourceKind.Texture1D: return("Texture1D"); case IrResourceKind.Texture2D: return("Texture2D"); case IrResourceKind.Texture2DMS: return("Texture2DMS"); case IrResourceKind.Texture3D: return("Texture3D"); case IrResourceKind.TextureCube: return("TextureCube"); case IrResourceKind.Texture1DArray: return("Texture1DArray"); case IrResourceKind.Texture2DArray: return("Texture2DArray"); case IrResourceKind.Texture2DMSArray: return("Texture2DMSArray"); case IrResourceKind.TextureCubeArray: return("TextureCubeArray"); case IrResourceKind.TypedBuffer: return("Buffer"); case IrResourceKind.RawBuffer: return("ByteAddressBuffer"); case IrResourceKind.StructuredBuffer: return("StructuredBuffer"); default: return($"Invalid_{binding.Class}_{binding.Kind}"); } case IrResourceClass.UAV: switch (binding.Kind) { case IrResourceKind.Texture1D: return("RWTexture1D"); case IrResourceKind.Texture2D: return("RWTexture2D"); case IrResourceKind.Texture2DMS: return("RWTexture2DMS"); case IrResourceKind.Texture3D: return("RWTexture3D"); case IrResourceKind.TextureCube: return("RWTextureCube"); case IrResourceKind.Texture1DArray: return("RWTexture1DArray"); case IrResourceKind.Texture2DArray: return("RWTexture2DArray"); case IrResourceKind.Texture2DMSArray: return("RWTexture2DMSArray"); case IrResourceKind.TextureCubeArray: return("RWTextureCubeArray"); case IrResourceKind.TypedBuffer: return("RWBuffer"); case IrResourceKind.RawBuffer: return("RWByteAddressBuffer"); case IrResourceKind.StructuredBuffer: return("RWStructuredBuffer"); default: return($"Invalid_{binding.Class}_{binding.Kind}"); } default: return($"Invalid_{binding.Class}_{binding.Kind}"); } }