AMD and nVidia have released some fresh drivers which has significantly raise the OpenGL support.
On nVidia side, the OpenGL 4.1 implementation has reach the stable drivers as it fixes a lot of issues and seems to work pretty well.
On AMD side, the Catalyst 10.10c provides an OpenGL 4.1 drivers for the first time but I believe it happens as accident: First Catalyst 10.10a were released with the OpenGL 4.1 drivers but without any information then the Catalyst 10.10c has been release with OpenGL 4.1 beta support in the release note. Unfortunately, nothing seems to work yet... It probably only means that AMD has just started working on the OpenGL 4.1 drivers.
nVidia drivers still doesn't support varying structures but worse the drivers report an error that claims through an error message that varying structures are not supported in OpenGL... but they should support varying structure according to the spec. That's why I called these warnings "offensive" and following some proofs:
Fragment inputs can only be signed and unsigned integers and integer vectors, floating point scalars, floating-point vectors, matrices, or arrays or structures of these
Vertex, tessellation evaluation, and geometry output variables output per-vertex data and are declared using the out, centroid out, or sample out storage qualifiers, or the deprecated varying storage qualifier. It is an error to use patch out in a vertex, tessellation evaluation, or geometry shader. Output variables can only be floating-point scalars, floating-point vectors, matrices, signed or unsigned integers or integer vectors, or arrays or structures of any these.
Tessellation control shader output variables are may be used to output per-vertex and per-patch data. Pervertex output variables are arrayed (see arrayed under 4.3.4 Inputs) and declared using out or centroid out storage qualifiers. Per-patch output variables are declared using the patch out storage qualifier. Pervertex and per-patch output variables can only be floating-point scalars, floating-point vectors, matrices, signed or unsigned integers or integer vectors, or arrays or structures of any these.
Varying structures have only limitations on input of the vertex shader and output of the fragment shader.
Vertex shader inputs can also form arrays of these types, but not structures.
Fragment outputs output per-fragment data and are declared using the out storage qualifier. It is an error to use centroid out, sample out, or patch out in a fragment shader. Fragment outputs can only be float, floating-point vectors, signed or unsigned integers or integer vectors, or arrays of any these. Matrices and structures cannot be output.
Varying structure is a great GLSL feature that should be supported as it provides a way to define and garanty how to communicate between stages!
This drivers status has been made under Seven 64 with a GeForce GTX 470 and a Radeon HD 5850 using the OpenGL Samples Pack 4.1.3.1.
Drivers: | nVidia Forceware 259.31 (beta) | nVidia Forceware 260.99 (stable) | nVidia Forceware 260.93 (beta) |
---|---|---|---|
410-program-separate | |||
410-program-binary | Crash | ||
410-program-64 | |||
410-primitive-tessellation | Doesn't support varying struct and offensive error message | Doesn't support varying struct and offensive error message | Doesn't support varying struct and offensive error message |
410-primitive-instanced | Exception during compilation | Unexpected warning | Unexpected warning |
410-fbo-layered | gl_ViewportIndex unsupported | gl_ViewportIndex unsupported | |
410-debug-output | |||
400-sampler-array-gtc | A warning would be wellcome as it's a great but non standard behaviours | A warning would be wellcome as it's a great but non standard behaviours | A warning would be wellcome as it's a great but non standard behaviours |
400-buffer-uniform-shared-gtc | A warning would be wellcome as it's a great but non standard behaviours | A warning would be wellcome as it's a great but non standard behaviours | A warning would be wellcome as it's a great but non standard behaviours |
400-transform-feedback-object | |||
400-texture-compression-arb | |||
400-texture-buffer-rgb | |||
400-sampler-gather | |||
400-sampler-fetch | |||
400-sampler-array | |||
400-program-varying-structs | Doesn't support varying struct and offensive error message | Doesn't support varying struct and offensive error message | Doesn't support varying struct and offensive error message |
400-program-varying-blocks | Build error with misleading messages | Unexpected warning / gl_in.length() not fully supported | Unexpected warning / gl_in.length() not fully supported |
400-program-subroutine | |||
400-program-64 | |||
400-primitive-tessellation | Unexpected warning | Unexpected warning | Unexpected warning |
400-primitive-smooth-shading | Unexpected warning | Unexpected warning | Unexpected warning |
400-primitive-instanced | Unexpected warning | Unexpected warning | Unexpected warning |
400-fbo-rtt-texture-array | |||
400-fbo-rtt | Not tested | Not tested | |
400-fbo-multisample | |||
400-fbo-layered | |||
400-draw-indirect | |||
400-buffer-uniform | Unsupported block array | ||
400-blend-rtt | |||
330-texture-array | Not tested | Not tested |
Despite its number Forceware 260.99 seems older than Forceware 260.93 as Forceware 260.93 brings even more fixes. I stringly recommand Forceware 260.93 for OpenGL developers who wants to work on OpenGL 4.X software.
UPDATE ON 28/10/2010: Thanks to some feedbacks from nVidia, I fixed the sample 400-fbo-rtt where I made a mistake. Also the varying structure bug should be fixed for next stable release of nVidia drivers.
Drivers: | AMD Catalyst 10.9 (stable) | AMD Catalyst 10.10 (stable) | AMD Catalyst 10.10c (beta) |
---|---|---|---|
410-debug-output-arb | AMD_debug_output support only | AMD_debug_output support only | AMD_debug_output support only |
410-program-separate | Doesn't support explicit varying locations with unified program | ||
410-program-binary | Doesn't support explicit varying locations with unified program | ||
410-program-64 | glVertexAttribLPointer is null | ||
410-primitive-tessellation | Doesn't support explicit varying locations with unified program | ||
410-primitive-instanced | Doesn't support explicit varying locations with unified program | ||
410-fbo-layered | Parsing error on flat qualifier and gl_ViewportIndex remains 0 | ||
400-buffer-uniform-shared-gtc | Not supported as OpenGL specify | Not supported as OpenGL specify | Not supported as OpenGL specify |
400-sampler-array-gtc | Not supported as OpenGL specify | Not supported as OpenGL specify | Not supported as OpenGL specify |
400-transform-feedback-object | |||
400-texture-compression-arb | |||
400-texture-buffer-rgb | RGB32 TBO fetch not correct | RGB32 TBO fetch not correct | |
400-sampler-gather | |||
400-sampler-fetch | ARB GLSL function instead of core GLSL function | ||
400-sampler-array | |||
400-program-varying-structs | |||
400-program-varying-blocks | |||
400-program-subroutine | |||
400-program-64 | Draw calls ignored, double not supported | ||
400-primitive-tessellation | |||
400-primitive-smooth-shading | |||
400-primitive-instanced | |||
400-fbo-rtt-texture-array | |||
400-fbo-rtt | Not tested | Not tested | |
400-fbo-multisample | Min/mag tex param and glMinSampleShadingARB required | ||
400-fbo-layered | |||
400-draw-indirect | |||
400-buffer-uniform | Unsupported block array/freeze the program | Unsupported block array/freeze the program | Unsupported block array |
400-blend-rtt | |||
330-texture-array | Not tested | Not tested | Required glTexParameteri to setup filtering |
AMD has released it's first OpenGL 4.1 drivers but unfortunately the implementation is quite limited as no OpenGL sample run correctly... However, Catalyst 10.10c remains a great improvement on the regard of the OpenGL 4.0 implementation which fixes a lot of issues since Catalyst 10.9.
UPDATE ON 29/10/2010: I have updated the result on AMD to be more accurate on my report and the problems I have encountered. According to AMD, it's debattable to know if explicit varying locations in unified program is part of OpenGL 4.1... I would say that according to the specification it must be supported but you can make your own opinion by reading section 2.11.4 which specifies the shader interface matching. Using exact match does fix several samples.
The inputs and outputs on an interface between programs need not match exactly when input and output location qualifiers (sections 4.3.8.1 and 4.3.8.2 of the OpenGL Shading Language Specification) are used.
Also I would like to make clear that 400-buffer-uniform-shared-gtc and 400-sampler-array-gtc are not suposed to be suported and they are OpenGL 4.2 feature requests which is why they have the post-fix 'gtc'.