There seems to be a bug in the matrix constructors in GLSL in the 280 and 290 drivers on a GTX 580:
float f = …
mat3 m = mat3(f); // f on the diagonal
mat4 m2 = mat4(m); // m filled with an identity
That’s working so far and does what the spec suggests, however:
mat4 m2 = mat4(mat3(f)); // bug
returns a different matrix.
I filed a bug report over at NVidia some time ago, but maybe this helps other people while the bug isn’t fixed (or it is correct and i don’t understand the matrix constructors, but it’s how the AMD drivers work as well…). It’s also postet at the NVidia forums, but I got no response from there, but maybe the NVidia devs are reading this forum more often
I still could be wrong with this observation, so correct my if the behavior is fine with specs.