david_f_knight
12-08-2010, 01:22 PM
A thread in the Advanced OpenGL forum discusses two different errors in the AMD Catalyst driver version 10.11:
http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=287368
Further discussion of this issue belongs here in this forum.
To summarize:
I have discovered an AMD Catalyst driver bug (which I've reported to AMD each version beginning with version 10.7):
The vertex spacing qualifier of tessellation evaluation shaders is ignored when the primitive mode qualifier of tessellation evaluation shaders is isolines. The tessellation primitive generator incorrectly always uses equal_spacing when the primitive mode qualifier is isolines, whether the vertex spacing qualifier was specified as fractional_even_spacing, fractional_odd_spacing, or equal_spacing....
...(the Specification states that equal spacing is to be used for the spacing between the isolines (i.e., the v dimension), but that the vertex spacing qualifier must be used for the tessellation of each isoline (i.e., the u dimension)).
I also ran some tests with quad tessellation. I found some very strange behavior. With ATI Catalyst 10.11, it appears that the indexes are ignored. For example,
gl_TessLevelOuter[0] = 16.0;
gl_TessLevelOuter[1] = 4.0;
gl_TessLevelOuter[2] = 4.0;
gl_TessLevelOuter[3] = 4.0;
A run with the above settings produced the same tessellation as a run with the following sequence of statements:
gl_TessLevelOuter[1] = 16.0;
gl_TessLevelOuter[0] = 4.0;
gl_TessLevelOuter[2] = 4.0;
gl_TessLevelOuter[3] = 4.0;
It seems like the first assignment determines the value of index zero regardless of the index used. This is quite strange.
Could you confirm this?
I just ran a test as you suggested (with Catalyst 10.11 drivers) and I confirm that the driver bug exists as you found it.
I then conducted a few other similar tests. This one worked properly:
int edge_ndx;
edge_ndx = 3;
gl_TessLevelOuter[edge_ndx] = 4.0;
gl_TessLevelOuter[1] = 16.0;
gl_TessLevelOuter[0] = 4.0;
gl_TessLevelOuter[2] = 4.0;
gl_TessLevelOuter[3] = 4.0;
But, this one did not work properly:
int edge_ndx;
edge_ndx = 3;
gl_TessLevelOuter[1] = 16.0;
gl_TessLevelOuter[0] = 4.0;
gl_TessLevelOuter[2] = 4.0;
gl_TessLevelOuter[3] = 4.0;
gl_TessLevelOuter[edge_ndx] = 4.0;
http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=287368
Further discussion of this issue belongs here in this forum.
To summarize:
I have discovered an AMD Catalyst driver bug (which I've reported to AMD each version beginning with version 10.7):
The vertex spacing qualifier of tessellation evaluation shaders is ignored when the primitive mode qualifier of tessellation evaluation shaders is isolines. The tessellation primitive generator incorrectly always uses equal_spacing when the primitive mode qualifier is isolines, whether the vertex spacing qualifier was specified as fractional_even_spacing, fractional_odd_spacing, or equal_spacing....
...(the Specification states that equal spacing is to be used for the spacing between the isolines (i.e., the v dimension), but that the vertex spacing qualifier must be used for the tessellation of each isoline (i.e., the u dimension)).
I also ran some tests with quad tessellation. I found some very strange behavior. With ATI Catalyst 10.11, it appears that the indexes are ignored. For example,
gl_TessLevelOuter[0] = 16.0;
gl_TessLevelOuter[1] = 4.0;
gl_TessLevelOuter[2] = 4.0;
gl_TessLevelOuter[3] = 4.0;
A run with the above settings produced the same tessellation as a run with the following sequence of statements:
gl_TessLevelOuter[1] = 16.0;
gl_TessLevelOuter[0] = 4.0;
gl_TessLevelOuter[2] = 4.0;
gl_TessLevelOuter[3] = 4.0;
It seems like the first assignment determines the value of index zero regardless of the index used. This is quite strange.
Could you confirm this?
I just ran a test as you suggested (with Catalyst 10.11 drivers) and I confirm that the driver bug exists as you found it.
I then conducted a few other similar tests. This one worked properly:
int edge_ndx;
edge_ndx = 3;
gl_TessLevelOuter[edge_ndx] = 4.0;
gl_TessLevelOuter[1] = 16.0;
gl_TessLevelOuter[0] = 4.0;
gl_TessLevelOuter[2] = 4.0;
gl_TessLevelOuter[3] = 4.0;
But, this one did not work properly:
int edge_ndx;
edge_ndx = 3;
gl_TessLevelOuter[1] = 16.0;
gl_TessLevelOuter[0] = 4.0;
gl_TessLevelOuter[2] = 4.0;
gl_TessLevelOuter[3] = 4.0;
gl_TessLevelOuter[edge_ndx] = 4.0;