Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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($";");
        }