How is the bufferSwitch() timed/synced

I want to make my own virtual ASIO device. For this I would like to understand how clocking/syncing for ASIO works.

Is it correct that each ASIO device generates its own bufferSwitch() timing according to the connected hardware?
If so, how are two different ASIO devices synced?
If I connect two cards with ASIO output for instance, they will generate each their own bufferSwitch() calls. Right?
But the applications that wants to output to both these devices, how does it handle that? The buffer filling will shift slowly in time and at some point a buffer will need to be skipped or repeated.