PDA

View Full Version : AMD Catalyst driver errors -- tessellation



david_f_knight
12-08-2010, 02: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;

david_f_knight
12-08-2010, 02:44 PM
Something I meant to mention but left out of my last post in the thread in the advanced forum is that I haven't had any problem with my tessellation shaders for quads previously, but I have always defined each gl_TessLevelOuter[] element using an index variable, such as edge_ndx, like this:


int edge_ndx;

for (edge_ndx = 0; edge_ndx < 4; edge_ndx++) {
//do determine curvature and length of each patch edge...
gl_TessLevelOuter[edge_ndx] = ????;
}

seague
12-11-2010, 04:27 AM
could you send your test cases to me? I'm employer of AMD, and I can't reproduce these issue with your describe. My email is seague.sheng@amd.com

dave_xyzw
12-11-2010, 03:10 PM
I've sent you a test case for quad tessellation.

david_f_knight
12-12-2010, 02:26 PM
I've sent you a test case demonstrating that the vertex spacing qualifier of tessellation evaluation shaders is ignored when the primitive mode qualifier of tessellation evaluation shaders is isolines.