When you call Present on the device with no source/dest parameters, the front and back buffer pointers are switched meaning no surface copying is done or anything like that.
Your statement may not be correct. From a further reviewi of the docs, I may have been mistaken when I previously posted that Present [always] flips the pointers. The help docs topic "Flipping Surfaces (Direct3D 9)" state:
"When you use IDirect3DDevice9::Present to request a surface flip operation, the pointers to surface memory for the front buffer and back buffers are swapped. Flipping is performed by switching pointers that the display device uses for referencing memory, not by copying surface memory."
The key words there may be "request a ... flip operation." That is, if the swapchain is created with D3DSWAPPEFFECT_COPY, then Present doesn't request a flip, but a copy, operation.
what happens under the hood when you do supply source and dest rects to the Present method? It can't switch the front and back buffer pointers because that would effectively present everything on the back buffer
Just for clarity, your question is a bit off-topic, perhaps. As L. Spiro mentions above, your problem description indicates syncing is likely the cause.
In any case, unfortunately, I'm not an expert on what happens "under the hood." I just read the Help docs, and experiment a bit.
Your latter (quoted) statement appears to be correct. According to the docs, using non-NULL rects in the Present call requires that the swapchain be created with D3DSWAPEFFECT_COPY. A swapchain created with D3DSWAPEFFECT_COPY must have just a single back buffer, but "will guarantee that [ a Present operation ] will not affect the content of any of the back buffers." I believe all that just means the rects determine what gets copied from the back buffer to the front buffer for display.
My own conclusions-
"Display" appears to be a multi-part process for a swapchain created with D3DSWAPEFFECT_COPY:
The source rectangle in the Present call determines what portion of the back buffer is copied to the front buffer memory.
The front buffer pointer, at any time, points to content which is to be displayed. That front buffer memory is memory mapped by the display adapter driver to some portion of video memory. That memory mapping is affected and can be modified by parameters in the Present call. I.e., given an HWND and destination rectangle in the Present call, the memory map will be from front buffer memory to the portion of video memory representing the destination rectangle in the client area for that HWND.
I haven't a clue whether that helps or hurts your investigation.