Esempio n. 1
0
        public static ShaderOp GenerateInterfaceStructAndOp(FrontEndTranslator translator, List <ShaderInterfaceField> interfaceFields, TypeName structName, string instanceName, StorageClass storageClass)
        {
            var interfaceStruct = translator.FindType(new TypeKey(structName));

            // Generate the interface struct if it doesn't already exist (uniform buffers already exist)
            if (interfaceStruct == null)
            {
                interfaceStruct = translator.CreateType(new TypeKey(structName), structName, OpType.Struct, null);
                foreach (var interfaceField in interfaceFields)
                {
                    interfaceStruct.mFields.Add(interfaceField.ShaderField);
                }
            }

            var opPointerType = translator.FindOrCreatePointerType(new TypeKey(structName), structName, storageClass);
            var op            = translator.CreateOp(OpInstructionType.OpVariable, opPointerType, null);

            ShaderInterfaceField.InstanceAccessDelegate fieldInstanceGetFunction = (FrontEndTranslator translator, ShaderInterfaceField interfaceField, FrontEndContext context) =>
            {
                return(translator.GenerateAccessChain(op, interfaceField.ShaderField.mMeta.mName, context));
            };

            foreach (var interfaceField in interfaceFields)
            {
                interfaceField.GetInstance = fieldInstanceGetFunction;
            }

            op.DebugInfo.Name = instanceName;
            return(op);
        }
Esempio n. 2
0
 public static void GenerateInterfaceGlobalFields(FrontEndTranslator translator, List <ShaderInterfaceField> interfaceFields, string structName, string instanceName, StorageClass storageClass)
 {
     foreach (var interfaceField in interfaceFields)
     {
         var fieldPointerType = translator.FindOrCreatePointerType(interfaceField.ShaderField.mType, storageClass);
         var fieldOp          = translator.CreateOp(OpInstructionType.OpVariable, fieldPointerType, null);
         ShaderInterfaceField.InstanceAccessDelegate fieldInstanceGetFunction = (FrontEndTranslator translator, ShaderInterfaceField interfaceField, FrontEndContext context) =>
         {
             return(fieldOp);
         };
         fieldOp.DebugInfo.Name     = interfaceField.ShaderField.DebugInfo.Name;
         interfaceField.GetInstance = fieldInstanceGetFunction;
     }
 }
Esempio n. 3
0
        public static void GenerateHardwareBuiltIns(FrontEndTranslator translator, ShaderInterfaceSet interfaceSet, StorageClass storageClass, ShaderBlock declarationBlock, ShaderBlock decorationsBlock)
        {
            foreach (var builtInInterfaceField in interfaceSet)
            {
                var pointerType     = translator.FindOrCreatePointerType(builtInInterfaceField.ShaderField.mType, storageClass);
                var fieldInstanceOp = translator.CreateOp(OpInstructionType.OpVariable, pointerType, null);
                declarationBlock.mLocalVariables.Add(fieldInstanceOp);

                Decorations.AddDecorationBuiltIn(translator, fieldInstanceOp, builtInInterfaceField.BuiltInType, decorationsBlock);

                ShaderInterfaceField.InstanceAccessDelegate fieldInstanceGetFunction = (FrontEndTranslator translator, ShaderInterfaceField interfaceField, FrontEndContext context) =>
                {
                    return(fieldInstanceOp);
                };
                builtInInterfaceField.GetInstance = fieldInstanceGetFunction;
            }
        }