Basically, I have an idea for a splat-map format that would be considerably faster than SM3, and would also be editable in realtime. I know, cue laughter. But meh... look at the idea first, I swear I'm onto something here.
What I'd propose is this:
Step 1, Determine position and frustrum angles of the POV.
Step 2. Read the raw heightmap.
Now we have a mesh in space. No textures yet, no optimization done yet:

Step 3. To determine which small textures we want to perform projections with, we're going to need to get an interception of planes projected from the frustrum up to the fog distance (i.e., if past that, don't even bother because we'll never see it).
First, we get the points that we can intercept:

These points are all associated with a bitmap, a scale and a point x,z.
Now we have everything that's within the frustrum. We can drop those points and everything behind the frustrum or not within a wedge that's maybe 25% larger. Our next check is expensive.
And doing it this way allows for, among other things, the possibility of doing a depth-test and dropping points if they're hidden. But that probably needs to wait for the last step:

For anything in the wedge, we want to do a check against a "column". This would give us accurate detection of points outside the frustrum, and a more accurate depth-test check for stuff that's hidden. After all, some texture points may be on geometry we're going to cull, etc., and we want to make sure that the texture's projected properly onto the triangles that aren't.
Step 4. Now we know which points are going to be used, and where they are, x,z. Build a diffuse map, normalmap, etc.
Step 5. Reduce mesh polycount of the heightmap.
Step 6. Send the mesh and texture to the GPU, to be rendered by a shader to handle rendering the maps to the mesh.
I'm really pretty sure that this is the way to go. I've been thinking about this off and on for quite awhile now, and I think that this is the way to have big maps with layered textures that will be fast (and scaleable, too, because users can specify the size of the map that's generated, or even specify that only the base texture would get used, etc.). And it opens up the possibility of doing realtime changes, too, because we're no longer dealing with huge static maps or tilesets. Just points in space.