The difference between that and the original 217 fps is mostly the submit, but QueryInterruptTime() does hurt a bit, probably because of the loop? Directly accessing user_shared_data->InterruptTime.LowPart (which is the only part we need) is better; I'm not seeing any measurable difference between that and upstream Wine.
To be clear, what I did here is hack the final "return true" in should_periodic_submit() to "return false", to measure the overhead of measuring time without actually performing the submit.