draw-elements: test glMultiDrawElements(GL_UNSIGNED_BYTE)

Submitted by Marek Olšák on Feb. 17, 2017, 12:08 p.m.

Details

Message ID 1487333298-18490-1-git-send-email-maraeo@gmail.com
State New
Headers show
Series "draw-elements: test glMultiDrawElements(GL_UNSIGNED_BYTE)" ( rev: 1 ) in Piglit

Not browsing as part of any series.

Commit Message

Marek Olšák Feb. 17, 2017, 12:08 p.m.
From: Marek Olšák <marek.olsak@amd.com>

this was broken in radeonsi
---
 tests/general/draw-elements.c | 34 +++++++++++++++++++++++++++++++---
 1 file changed, 31 insertions(+), 3 deletions(-)

Patch hide | download patch | download mbox

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

Comments

Thanks for doing this.

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

On 17.02.2017 13:08, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak@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
>