protected Barrier GenerateSubtreeBarrier(int startOffset = 0, BarrierFlags flags = BarrierFlags.None) { var result = new SlotDictionary(); var resultFlags = flags; for (var i = NodeIndex + startOffset; i < NextNodeIndex; i++) { Barrier barrier; if (!Result.TryGet(i, out barrier)) { continue; } foreach (var slot in barrier.Slots) { result[slot.Name] |= slot.Flags; } resultFlags |= barrier.Flags; } return(Barrier.New( NodeIndex, resultFlags, result )); }
protected void CreateBarrier(SlotDictionary slots, BarrierFlags flags = BarrierFlags.None) { Barrier existing; if (Result.TryGet(NodeIndex, out existing)) { Result.Remove(existing); foreach (var slot in existing.Slots) { slots[slot.Name] |= slot.Flags; } Result.Add(Barrier.New( NodeIndex, flags | existing.Flags, slots )); } else { Result.Add(Barrier.New( NodeIndex, flags, slots )); } }
public void VisitNode(JSStatement s) { VisitChildren(s); BarrierFlags flags = GetStatementFlags(); var rb = GenerateSubtreeBarrier(0, flags); if ((rb.Flags != BarrierFlags.None) || (rb.Slots.Length > 0)) { Result.Add(rb); } }
public static Barrier New(int node, BarrierFlags flags, SlotDictionary slots) { return(new Barrier(node, flags, slots.ToArray())); }
private BarrierFlags GetStatementFlags(BarrierFlags defaultValue = BarrierFlags.None) { return(IsVarying() ? BarrierFlags.VaryingExecution | defaultValue : defaultValue); }
private Barrier(int node, BarrierFlags flags, BarrierSlot[] slots) { NodeIndex = node; Flags = flags; Slots = slots; }