It sounds like you need to double-buffer at the application layer, which has nothing to do with Direct3D.
Your Update function will want to mutate the state of the game (a bunch of combinations of position/orientation/velocity/model/effect information in a scene graph, typically).
Your Render function will want to present a scene based on that same scene graph information.
To avoid a read/write hazard, you have to create a copy of your scene graph data, and hand off to the render thread, for each frame, while the Update function goes on mutating the scene graph in place. Alternatively, you can create two scene graphs, and copy from old to new each frame, but it boils down to the same thing.
So, your update will look something like:
update_loop() {
if (!rendering_running) {
copy_data_to_renderer(game_state);
rendering_kickoff();
}
update_one_physics_step();
}
render_loop() {
wait_for_kickoff();
render_state(game_state_copy);
rendering_running = false;
}
rendering_kickoff() {
rendering_running = true;
set_event(render_event);
}
Yes, you'll have to figure out what the proper primitive is for each part of those loops (rendering_running needs to be volatile, you'll need to handle termination requests, etc), but this sketch should show you how it can be made to work at the application level.