I've been digging a bit into what actually happens at a hardware level on the GPU, and found NVidia's Life of a triangle which explains the pipeline pretty well, at least for green boxes. One thing I wasn't clear on is what happens with indexed meshes, when the same vertex is used for a bunch of different triangles. Since data is generally not persisted for any longer than necessary in a stream processor, I'm guessing the vertex is simply destroyed after being rasterized, then fetched and run through the vertex shader again whenever it appears in a new triangle. Can anyone confirm this? Also, what happens in line-strip or triangle-strip modes? Does the GPU persist the transformed vertex data somewhere until the 2 or 3 relevant primitives have been rasterized in these cases?
The key expression you may be looking for is "Post Transform Cache".
This is usually effective because of the natural vertex reuse, but reordering your mesh, e.g. with Hoppe's method (note: the page also lists some more recent work) or Forsyth's can improve things further.
That depends on how far apart the vertexes are reused.
For example the square
0, 1, 2, 2, 1, 3 will have a short enough interval that the
2 vertices will be reused. But if there are a hundred vertices between reuses then it's more likely that there will be no reuse.
But when they are much further apart then the vertex will fall out of the cache and have to be reprocessed by the vertex shader.
This is why some 3D software have a way to improve vertex locality for indexed meshes by reordering the vertices.