Each patch is fixed 16x16 squares and contains its own small heightmap. The main heightmap’s size is irrelevant, since I always get the same triangle throughput, the only thing that changes is the number of patches. And in a larger terrain, less patches are visible because of frustum culling. I also got two global arrays that are shared among all patches, one for indices and one for texture coords.
If I use the same set of texturecoordinates for each patch, I can use a tiled texture that streches over the entire patch, and with a 256x256 texture, I get OK detail level, and with a 512x512 texture, I get pretty good detail level.
Indices are also shared, since each patch is drawn in the same way: a row from east to west, and each row from north to south. I use GL_TRIANGLES with glDrawArrays() to draw the whole patch in one single command.
The shared indices-story works for LOD aswell. You can build, say six sets of shared indices. One for high level of detail, and one for low level of detail. Then four sets for the patches between two detal levels. One for when LOD goes from high->low from north->south, one for south->north, and same for east/west. This way, you don’t have to recalculate indices when LOD changes, since they are precalculated.