Open ianromanick opened 3 years ago
It's also worth noting that the spec is a little unclear as to whether or not GL_PRIMITIVE_RESTART_NV
state affects glPrimitiveRestartNV
. It strongly implies that it is not affected. GL_PRIMITIVE_RESTART_NV
is client state, but GLX protocol is (partially) defined for glPrimitiveRestartNV
. The idea is that when the GLX client library decomposes glDrawElements
into immediate mode drawing commands, it will emit glPrimitiveRestartNV
(instead of glVertex
, etc.) when the restart index is encountered.
If this issue results in an update to the GL_NV_primitive_restart spec, it would be nice to add something like the following to section 2.6.X Primitive Restarts:
The operation of
PrimitiveRestartNV
is not affected by the setting ofPRIMITIVE_RESTART_NV
.
The NVIDIA implementation of GL_NV_primitive_restart is totally equivalent to the core functionality:
So.... do both glPushAttrib
and glPushClientAttrib
save primitive restart index and enable? And both glPopAttrib
and glPopClientAttrib
restore? From independent stacks?
Is there any chance of getting the extension spec update to document these (quite surprising) interactions?
Only gl{Push,Pop}ClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT) saves/restores it.
In GL_NV_primitive_restart, the enable and the restart index are client state. In unextended OpenGL 3.1 or OpenGL 3.2+ Core Profile, there is, effectively, no client vertex state. As a result, the enable and the restart index are server state. In unextended OpenGL 3.1 or OpenGL 3.2+ Core Profile, it is not possible to expose the extension, so there is no problem.
In extended OpenGL 3.1 or OpenGL 3.2+ Compatibility Profile, it is possible to expose GL_NV_primitve_restart in addition to the core feature. However, the extension spec was never updated with any interactions. What happens in the following code?
In draw 1, what is the primitive restart index? In draws 2 and 3, is primitive restart enabled or not?
Thinking about how this could work with GLX protocol, my guess would be that when both
GL_PRIMITVE_RESTART
andGL_PRIMITVE_RESTART_NV
are enabled, the state forGL_PRIMITVE_RESTART_NV
is used. If only ofGL_PRIMITVE_RESTART
orGL_PRIMITVE_RESTART_NV
is enabled, the enabled state is used.