Gen7/Ivy Bridge: Primitive ID (GLSL 1.50+) is incorrect when using software primitive restart.

Ivy Bridge hardware doesn't support primitive restart under the following circumstances:

  • When the primitive type is GL_LINE_LOOP, GL_TRIANGLE_FAN, GL_QUADS, GL_QUAD_STRIP, or GL_POLYGON.

  • When the primitive restart is not equal to -1 (0xff, 0xffff, or 0xffffffff, depending whether the type passed to glDrawElements() is GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, or GL_UNSIGNED_INT).

In these circumstances, the driver emulates primitive restart using a software mechanism. When this software mechanism is used, and GLSL 1.50 is in use:

  • If a geometry shader is present, the values received by the geometry shader's gl_PrimitiveIDIn input will be incorrect.

  • If a geometry shader is not present, the values received by the fragment shader's gl_PrimitiveID input will be incorrect.

Gen7/Haswell is not affected.

Experimental code which partially fixes this problem can be found in branch "prim-id-in-with-sw-prim-restart" of https://github.com/stereotype441/mesa.git.

Gen7/Ivy Bridge: Triangle strips have incorrect vertex order when geometry shaders in use.

When primitives are drawn using GL_TRIANGLE_STRIP or GL_TRIANGLE_STRIP_ADJACENCY, alternate triangles are delivered to the geometry shader with their vertices in the wrong order.

For example, if a triangle strip is drawn using 6 vertices, then according to the GL spec, the triangles received by the geometry shader should consist of:

  • Vertices 1, 2, and 3
  • Vertices 3, 2, and 4
  • Vertices 3, 4, and 5
  • Vertices 5, 4, and 6

Ivy Bridge hardware delivers the correct triangles to the geometry shader, but not in the right order. The order used is:

  • Vertices 1, 2, and 3
  • Vertices 2, 4, and 3
  • Vertices 3, 4, and 5
  • Vertices 4, 6, and 5

Note that triangle orientation is still correct.

Gen7/Haswell is not affected.

Experimental code which partially fixes this problem can be found in branch "gs-reorder-triangle-vertices" of https://github.com/stereotype441/mesa.git.

All platforms: Trigonometric instructions (sin, cos) do not handle large inputs.

See https://lists.freedesktop.org/archives/mesa-dev/2014-December/072429.html for more information.

Issues known to be a result: