Esempio n. 1
0
        public static void GenerateOutputFields(FrontEndTranslator translator, ShaderType shaderType, ShaderInterfaceSet interfaceSet, ShaderBlock declarationBlock, ShaderBlock decorationsBlock)
        {
            if (interfaceSet.Fields.Count == 0)
            {
                return;
            }

            var outputsName = shaderType.mMeta.mName + "_Outputs";

            EntryPointGenerationShared.GenerateInterfaceGlobalFields(translator, interfaceSet.Fields, outputsName, "Out", StorageClass.Output);
            foreach (var inputField in interfaceSet)
            {
                var fieldOp = interfaceSet.GetFieldInstance(translator, inputField, null);
                declarationBlock.mLocalVariables.Add(fieldOp);
            }
            Decorations.LocationCallback locationCallback = (ShaderField field, out int location, out int component) =>
            {
                location = component = -1;
                var attribute = field.mMeta.mAttributes.FindFirstAttribute(typeof(Shader.StageOutput));
                if (attribute == null)
                {
                    return(false);
                }
                var parsedAttribute = AttributeExtensions.ParseStageOutput(attribute);
                location  = parsedAttribute.Location;
                component = parsedAttribute.Component;
                return(false);
            };
            Decorations.AddDecorationLocations(translator, shaderType, interfaceSet, locationCallback, decorationsBlock);
        }