The particular output vertex from the GS that defines the gl_Layer/gl_ViewportIndex for that primitive. However, the particular convention is actually implementation-defined. That's fair, though really annoying.

If a geometry shader wants to use the current convention to allow it to define different layer/viewport indices for different triangles/lines within a strip (ie: without EndPrimitive and its overhead), then the GS needs to know which convention is being used. That generally requires playing with adding #defines and such to the GS, then #ifdef'ing code around the layer/viewport index writing code.

To make this easier, there should be some compile-time constant value in the GS, say, `gl_ProvokingConvention` that will define which convention is in use. 0 would be PROVOKING_VERTEX (ie: whatever the user picks), 1 would be FIRST_VERTEX, 2 would be LAST_VERTEX, and 3 would be UNDEFINED.