I think that it is up to the toolkit you use. For example with Wayland you could work with a single buffer and commit it, or work with two buffers and swap them. Moreover you can do things on the client side, say:
drawing-buffer (single) [user copies to] -> commit-buffer ---------------------------------- [system copies to] -> screen
alternatively
drawing-buffer (double) [user swaps to] -> commit-buffer ---------------------------------- [system copies to] -> screen
etc.