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); }
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; } }
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; } }