Why should it live on the unix side?
That's where most of the logic already lives, including some of the logic that you are duplicating here, and it's not going away. Why would we split the logic when we don't need to? Instead of having a single module with the full picture, we'd end up with two modules and a non-obvious protocol between them. Having client IDs in the unixlib protocol simply seems much cleaner to me. I do not see why the PE side would need to know anything about IDs internal to Unix. There are cases where some split makes sense, for example for context handling. But in this case, I do not see any value added, thus my question.
This is not the same thing as wow64 buffer tracking: it is not limited to WOW64 and it is not meant to create object wrappers. We only need integral name mapping, and we want it to be as lightweight as possible.
We do not need all of them to be full wrappers. Whatever you do on the PE side can be done on the Unix side as well.
GLsync handle allocation, which is on the PE side already will also be moved to the display lists for correctness.
Maybe they should be on the Unix side too. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10870#note_141048