Main GPU Jobs is unkwnown at the moment. It has been drawn 16 ms ago, so when Present() will end, what will it present? It will present the current backbuffer which should be "dirty" because during this BeginScene() / EndScene() I didn't write anything on it, while I'd like to keep the current frontbuffer untouched (ie: still show the result from the previous BeginScene() / EndScene() / Present())
Why can't you do your RTT in the same begin/end/present bundle?
i.e BeginScene -> RTT -> Main GPU Jobs -> EndScene -> Present
Also, the fact that you've mentioned using a D3D9 device from two different threads is a dangerous sign -- why do you need two different threads to be able to control the device?
I've simplified a bit the whole thing, but I'm not accessing D3D from multiple threads. Only main thread directly access D3D.
Other threads sends commands to a queue and then the main thread will execute them.
You should figure it this way: there is a PC somewhere in the world that can render things using DX9.
There's another PC in the world that communicate with the first one and ask for jobs to be done and then read back the results.
Don't think about threads, this is not the point.