My ability to put 'latex manuscript.tex' and 'dvi2pdf manuscript.dvi' into a makefile is not magic, it is basic automation
It's also redundant and likely not to do the right thing (ironic, given previous comments about libraries). Look for latexmk, which is part of the standard LeXLive distribution. Oh, and since this is not 1970 anymore, let's skip the DVI step and go straight to PDF with pdflatex (latexmk -pdf manuscript.tex is probably what you actually want).
The biggest is that you have to think about what parts of the project you might want to check out individually before you start. For new (small) projects, it's sometimes easy, but typically projects grow organically and parts get factored out. There's no good way of turning a subtree in a git repo into a new repo preserving history (and no way at all that allows you to merge into both).
The second big one is that you lose atomic commits (the thing we all switched to svn from cvs for in the first place). If you only have one layer of submodules, it's quite nice because committing something to the submodule and updating the version of the submodule are independent. That means that you can make changes to a component, unit test them, commit, and then later update their consumers. Unfortunately, there's no way of atomically updating two independent subtrees simultaneously.
The third annoyance is the most embarrassing for a DVCS: the remote repository for upstream is identified by an absolute URL. You can do relative URLs, but they don't work very well, which means that if you want people to use a local version then it's quite convoluted. There's no simple 'clone this repo and all of the submodules in such a way that someone else can clone my copy and it all work sensibly'.
In general, the dire UI of git has been an unexpected advantage. No one can stand working with it, so people have been motivated to write nice GUIs that make it tolerable.
Direct3D 10 is very different from DirectX 9. The latter was designed with modern GPUs in mind and so is based around an entirely programmable pipeline. DirectX 9 is predominantly a fixed-function API with various places where you can insert shader programs into the pipeline. This means that DirectX 10 is easier to support because there's less provided by the API.
Supporting D3D 9 is akin to supporting OpenGL 2. You need to expose most of the programmable interfaces but also have a load of fixed-function stuff work, typically (on modern hardware) by providing shader programs that do the same thing. Supporting D3D10 is more similar to supporting OpenGL 3, where most of the complexity is in moving data to and from the GPU and compiling shader programs.
With Gallium, there are two aspects to supporting these APIs. The first is the compiler turning programs from a source language (HLSL, GLSL) into TGIR. The second is the state tracker, which handles API-specific state. The former part is about as complex for D3D 9 and 10, as they have similar shader language support. The latter is a lot simpler for 10, as it is a much less stateful API.