Direct3D 11 is further hampered by the fact it handles all command buffer operations by itself. Commands submitted in Direct3D 11 are simplified in the sense that they allow the user to pretend as though the commands will run immediately after calling a render command. This is not actually the case; Instead, multiple commands are queued up and sent to the GPU in the background.
While the runtime does a decent job balancing performance with accuracy, a better job can be done by a programmer who knows what assumptions can be made about the resources. For instance, when just having bound a resource as a render target and unbinding the resource, the runtime might not know what the next usage of the resource is going to be later down the line. Rendertargets may have a different format from textures, and swapping between these formats might take a while. This can result in the scenario the runtime will either swap the layout too soon, causing redundant layout swaps, or too late, causing the layout to be swapped at the point that we can no longer do so asynchronously.
In addition, there is a heavy system for managing object lifetime and dependencies in the background. This limits possibilities for multithreading on top of making swapping resources very costly.