pseudo code:

map<ActiveScrolledRoot*, WrClipID> asrMap;

static 
GetWrScrollNodeForASR(ActiveScrolledRoot* aASR)
{
    if (asrMap.has(aASR)) {
        return asrMap.get(aASR);
    }
    
    WrClipID parentASRWrID = GetWrScrollNodeForASR(aASR->mParent);
    
    
    WrClipID clipID = WrMakeClipIDForASR(parentASRWrID, ??);
    asrMap.add(aASR, clipID);
    return clipID;
}

map<DisplayItemClipChain*, WrClipID> clipChainMap;

static WrClipID
GetWrClipNodeForClipChain(DisplayItemClipChain* aClipChain)
{
    if (clipChainMap.has(aClipChain)) {
        return clipChainMap.get(aClipChain);
    }
    
    WrClipID parentClipID = GetWrClipNodeForClipChain(aClipChain->mParent);
    WrClipID asrClipID = GetWrScrollNodeForASR(aClipChain->mASR);
    // need to find one node for these two nodes somehow
    
    
    WrClipID clipID = WrMakeClipIDForClip(parentClipID, asrClipID, aClipChain.mClip.GetRect(), aClipChain.mClip.GetRoundedRects());
    clipChainMap.add(aClipChain, clipID);
    return clipID;
}

for (each display item) {
  DisplayItemClipChain* clipChain = item->GetClipChain();
  WrClipID wrClipNode = GetWrClipNodeForClipChain(clipChain);
  ActiveScrolledRoot* asr = item->GetActiveScrollRoot();
  WrClipID wrScrollNode = GetWrScrollNodeForASR(asr);
  WrPushItem(item, wrClipNode, wrScrollNode);
}