[Piglit] [PATCH] draw-elements: test glMultiDrawElements(GL_UNSIGNED_BYTE)

Nicolai Hähnle nhaehnle at gmail.com
Sun Feb 19 09:06:38 UTC 2017


Thanks for doing this.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>

On 17.02.2017 13:08, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> this was broken in radeonsi
> ---
>  tests/general/draw-elements.c | 34 +++++++++++++++++++++++++++++++---
>  1 file changed, 31 insertions(+), 3 deletions(-)
>
> diff --git a/tests/general/draw-elements.c b/tests/general/draw-elements.c
> index 29436cf..d20e85a 100644
> --- a/tests/general/draw-elements.c
> +++ b/tests/general/draw-elements.c
> @@ -55,22 +55,24 @@ void piglit_init(int argc, char **argv)
>  	}
>
>  	piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE);
>
>  	piglit_require_gl_version(15);
>
>  	glShadeModel(GL_FLAT);
>  	glClearColor(0.2, 0.2, 0.2, 1.0);
>  }
>
> -static void test_ubyte_indices(float x1, float y1, float x2, float y2, int index)
> +static void test_ubyte_indices(float x1, float y1, float x2, float y2, int test)
>  {
> +	bool use_multi = test / 4;
> +	int index = test % 4;
>  	float v[] = {
>  		x1, y1,
>  		x1, y2,
>  		x2, y1,
>
>  		x1, y1,
>  		x1, y2,
>  		x2, y1,
>
>  		x1, y1,
> @@ -93,25 +95,46 @@ static void test_ubyte_indices(float x1, float y1, float x2, float y2, int index
>  		11, 11, 11, 11
>  	};
>  	GLuint buf;
>
>  	glVertexPointer(2, GL_FLOAT, 0, v);
>
>  	if (!user) {
>  		glGenBuffers(1, &buf);
>  		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buf);
>  		glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indx), indx, GL_STATIC_DRAW);
> -		glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, (void*)(intptr_t)(index*9));
> +		if (use_multi) {
> +			GLsizei count[] = {3, 3};
> +			/* We need 2 draws in order to get non-zero in
> +			 * pipe_draw_info::start, so make the second draw
> +			 * a zero-area triangle. */
> +			const void *offset[] = {(void*)(intptr_t)(index*9),
> +						(void*)(intptr_t)1};
> +			glMultiDrawElements(GL_TRIANGLES, count,
> +					    GL_UNSIGNED_BYTE, offset, 2);
> +		} else {
> +			glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE,
> +				       (void*)(intptr_t)(index*9));
> +		}
>  		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
>  		glDeleteBuffers(1, &buf);
>  	} else {
> -		glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, indx + index*9);
> +		if (use_multi) {
> +			GLsizei count[] = {3, 3};
> +			/* The second draw is a zero-area triangle. */
> +			const void *indices[] = {indx + index*9, indx + 1};
> +			glMultiDrawElements(GL_TRIANGLES, count,
> +					    GL_UNSIGNED_BYTE, indices, 2);
> +		} else {
> +			glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE,
> +				       indx + index*9);
> +		}
>  	}
>  }
>
>  static void test_ushort_indices(float x1, float y1, float x2, float y2, int index)
>  {
>  	float v[] = {
>  		x1, y1,
>  		x1, y2,
>  		x2, y1,
>
> @@ -208,20 +231,25 @@ struct test {
>  	int flag;
>  	const char *name;
>  };
>
>  struct test tests[] = {
>  	{test_ubyte_indices, 0, {1, 1, 1}, BOTH, "Ubyte indices - offset: 0"},
>  	{test_ubyte_indices, 1, {1, 1, 1}, BOTH, "Ubyte indices - offset: 1"},
>  	{test_ubyte_indices, 2, {1, 1, 1}, BOTH, "Ubyte indices - offset: 2"},
>  	{test_ubyte_indices, 3, {1, 1, 1}, BOTH, "Ubyte indices - offset: 3"},
>
> +	{test_ubyte_indices, 4, {1, 1, 1}, BOTH, "Ubyte indices - offset: 0 (glMultiDraw)"},
> +	{test_ubyte_indices, 5, {1, 1, 1}, BOTH, "Ubyte indices - offset: 1 (glMultiDraw)"},
> +	{test_ubyte_indices, 6, {1, 1, 1}, BOTH, "Ubyte indices - offset: 2 (glMultiDraw)"},
> +	{test_ubyte_indices, 7, {1, 1, 1}, BOTH, "Ubyte indices - offset: 3 (glMultiDraw)"},
> +
>  	{test_ushort_indices, 0, {1, 1, 1}, BOTH, "Ushort indices - offset: 0"},
>  	{test_ushort_indices, 1, {1, 1, 1}, BOTH, "Ushort indices - offset: 2"},
>
>  	{test_large_index_count, 1, {1, 1, 1}, USER, "Large index count"},
>  	{test_large_indexbuf_offset, 0, {1, 1, 1}, VBO, "Large index offset"},
>
>  	{0}
>  };
>
>  enum piglit_result
>



More information about the Piglit mailing list