[Piglit] [PATCH] gl-3.2/adj-prims: fix expected vertex order for triangle strips with adjacency

Nicolai Hähnle nhaehnle at gmail.com
Mon Oct 31 22:24:25 UTC 2016


On 31.10.2016 22:52, Nicolai Hähnle wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> The first two vertices are swapped for triangle strips with adjacency; see
> Table 10.1 of the OpenGL 4.5 (Compatibility Profile) spec.

FWIW, people report that the test passes as-is on NVidia hardware (both 
nouveau and blob) but fails on various Intel hardware.

I ran across this because radeonsi used to pass the test as-is, but now 
that I've added a fix for how our hardware rotates the odd triangles we 
started failing it (in the same way as Intel):

$ bin/gl-3.2-adj-prims pv-first -auto -fbo
Failure for GL_TRIANGLE_STRIP_ADJACENCY, prim 1 wrong color at (641,108)
Expected 0.2, 0.2, 1, 1
Found 0.2, 1, 1, 1
PIGLIT: {"result": "fail" }

My reading of the spec is that the GS invocation for the second triangle 
should have vs_gs_color[0] sourced from colors[4] instead of colors[2] 
as the test expects, and then this becomes the color of the first vertex 
and hence the color of the provoking vertex in this particular subtest.

(And I guess this explanation should go into the commit message if 
people agree that this change is correct.)

Cheers,
Nicolai

> ---
>  tests/spec/gl-3.2/adj-prims.c | 18 +++++++++++++-----
>  1 file changed, 13 insertions(+), 5 deletions(-)
>
> diff --git a/tests/spec/gl-3.2/adj-prims.c b/tests/spec/gl-3.2/adj-prims.c
> index 9d2f121..30c5f4b 100644
> --- a/tests/spec/gl-3.2/adj-prims.c
> +++ b/tests/spec/gl-3.2/adj-prims.c
> @@ -166,23 +166,26 @@ provoking_vertex_index(GLenum prim_mode, GLenum pv_mode, unsigned prim_index)
>  		if (pv_mode == GL_FIRST_VERTEX_CONVENTION)
>  			return prim_index + 1;
>  		else
>  			return prim_index + 2;
>  	case GL_TRIANGLES_ADJACENCY:
>  		if (pv_mode == GL_FIRST_VERTEX_CONVENTION)
>  			return prim_index * 6 + 0;
>  		else
>  			return prim_index * 6 + 4;
>  	case GL_TRIANGLE_STRIP_ADJACENCY:
> -		if (pv_mode == GL_FIRST_VERTEX_CONVENTION)
> -			return prim_index * 2;
> -		else
> +		if (pv_mode == GL_FIRST_VERTEX_CONVENTION) {
> +			if (prim_index & 1)
> +				return prim_index * 2 + 2;
> +			else
> +				return prim_index * 2;
> +		} else
>  			return prim_index * 2 + 4;
>  	default:
>  		assert(!"Unexpected prim_mode");
>  		return 0;
>  	}
>  }
>
>
>  /**
>   * Given a primitive type and a primitive (line/triangle) index, return
> @@ -205,22 +208,27 @@ compute_probe_location(GLenum prim_mode, unsigned prim_index,
>  		i0 = prim_index + 1;
>  		i1 = prim_index + 2;
>  		break;
>  	case GL_TRIANGLES_ADJACENCY:
>  		i0 = prim_index * 6 + 0;
>  		i1 = prim_index * 6 + 2;
>  		if (polygon_mode != GL_LINE)
>  			i2 = prim_index * 6 + 4;
>  		break;
>  	case GL_TRIANGLE_STRIP_ADJACENCY:
> -		i0 = prim_index * 2;
> -		i1 = prim_index * 2 + 2;
> +		if (prim_index & 1) {
> +			i0 = prim_index * 2;
> +			i1 = prim_index * 2 + 2;
> +		} else {
> +			i0 = prim_index * 2 + 2;
> +			i1 = prim_index * 2;
> +		}
>  		if (polygon_mode != GL_LINE)
>  			i2 = prim_index * 2 + 4;
>  		break;
>  	default:
>  		assert(!"Unexpected prim_mode");
>  		*x = *y = 0;
>  		return;
>  	}
>
>  	/* average of 2 or 3 points */
>


More information about the Piglit mailing list