AFAIK, the preprocessor mode is simple: you give a preprocessed source to ccache, it hashes the source and command-line args, then stores all corresponding info, like stderr, object file, etc.
But what is a direct mode and why is it much faster? What is a concept behind it?