For performance reasons, the debug version of the Direct3D Immediate Mode runtime performs more parameter validation than the retail version, which sometimes performs no validation at all. This allows applications to perform robust debugging with the slower debug runtime component before using the faster retail version for performance tuning and final release.
Although several Direct3D Immediate Mode methods impose limits on the values that they can accept, these limits are often only checked and enforced by the debug version of the Direct3D Immediate Mode runtime. Applications must conform to these limits, or unpredictable (and highly undesirable) results can occur when running on the retail version of Direct3D. For example, the IDirect3DDevice3::DrawPrimitive method accepts a parameter (dwVertexCount) that indicates the number of vertices that the method will render. The method can only accept values between 0 and 65,535 (0x0000 and 0xFFFF). In the debug version of Direct3D, if you pass 65,536 (one more than the limit), the method will fail gracefully, printing an error message to the error log, and returning an error value to your application. Conversely, if your application makes the same error when it is running with the retail version of the runtime, behavior is undefined. For performance reasons, the method does not validate the parameters, resulting in unpredictable and completely situational behavior when they are not valid. In some cases the call might work, and in other cases it might cause a memory fault in Direct3D. If an invalid call consistently works with a particular hardware configuration and DirectX version, there is no guarantee that it will continue to function on other hardware or with future releases of DirectX.
If your application encounters unexplained failures when running with the retail Direct3D Immediate Mode runtime, test against the debug version and look closely for cases where your application passes invalid parameters.