general/draw: Test that checks propper render order in mixed draw setups.

Submitted by Mathias Fröhlich on July 13, 2018, 10:40 a.m.

Details

Message ID 20180713104001.25104-1-Mathias.Froehlich@gmx.net
State New
Headers show
Series "general/draw: Test that checks propper render order in mixed draw setups." ( rev: 2 ) in Piglit

Not browsing as part of any series.

Commit Message

Mathias Fröhlich July 13, 2018, 10:40 a.m.
From: Mathias Fröhlich <mathias.froehlich@web.de>

Hi,

Sorry for the long delay, but this is v2 with the requested changes.
Please review!

Thanks
Mathias



The test checks for propper immediate mode flushes when array draws
are mixed with immediate mode draws.
The test abstracts out what went wrong in bugzilla #106594.

v2: Put piglit_init() at the bottom.
    Add draw-flush-vertices to tests/opengl.py.

Signed-off-by: Mathias Fröhlich <Mathias.Froehlich@web.de>
Acked-by: Timothy Arceri <tarceri@itsqueeze.com>
---
 tests/general/CMakeLists.gl.txt     |   1 +
 tests/general/draw-flush-vertices.c | 110 ++++++++++++++++++++++++++++
 tests/opengl.py                     |   1 +
 3 files changed, 112 insertions(+)
 create mode 100644 tests/general/draw-flush-vertices.c

Patch hide | download patch | download mbox

diff --git a/tests/general/CMakeLists.gl.txt b/tests/general/CMakeLists.gl.txt
index ceec9f0b6..7f530974e 100644
--- a/tests/general/CMakeLists.gl.txt
+++ b/tests/general/CMakeLists.gl.txt
@@ -40,6 +40,7 @@  piglit_add_executable (draw-batch draw-batch.c)
 piglit_add_executable (draw-copypixels-sync draw-copypixels-sync.c)
 piglit_add_executable (draw-elements draw-elements.c)
 piglit_add_executable (draw-elements-vs-inputs draw-elements-vs-inputs.c)
+piglit_add_executable (draw-flush-vertices draw-flush-vertices.c)
 piglit_add_executable (draw-pixel-with-texture draw-pixel-with-texture.c)
 piglit_add_executable (draw-sync draw-sync.c)
 piglit_add_executable (draw-pixels draw-pixels.c)
diff --git a/tests/general/draw-flush-vertices.c b/tests/general/draw-flush-vertices.c
new file mode 100644
index 000000000..dce0eb186
--- /dev/null
+++ b/tests/general/draw-flush-vertices.c
@@ -0,0 +1,110 @@ 
+/*
+ * Copyright © 2018 Mathias Fröhlich <Mathias.Froehlich@web.de>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Mathias Fröhlich <Mathias.Froehlich@web.de>
+ */
+
+/* The test does mixes immediate mode and array draws, but does not
+ * not do an other draw setup past the immediate mode draw. By that
+ * it checks for the order of draws that may be inverted if the queued
+ * immediate mode draws are not properly flushed before the array draw.
+ */
+
+#include "piglit-util-gl.h"
+
+PIGLIT_GL_TEST_CONFIG_BEGIN
+
+	config.supports_gl_compat_version = 11;
+
+	config.window_width = 32;
+	config.window_height = 32;
+	config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DOUBLE;
+	config.khr_no_error_support = PIGLIT_NO_ERRORS;
+
+PIGLIT_GL_TEST_CONFIG_END
+
+enum piglit_result
+piglit_display(void)
+{
+	const GLfloat Vertices[2*4] = {
+		0, 0,
+		piglit_width, 0,
+		piglit_width, piglit_height,
+		0, piglit_height
+	};
+	const GLfloat Colors[4*3] = {
+		1, 0, 0,
+		1, 0, 0,
+		1, 0, 0,
+		1, 0, 0
+	};
+
+	GLboolean pass = GL_TRUE;
+
+	glViewport(0, 0, piglit_width, piglit_height);
+
+	glEnableClientState(GL_VERTEX_ARRAY);
+	glVertexPointer(2, GL_FLOAT, sizeof(GLfloat)*2, Vertices);
+	glEnableClientState(GL_COLOR_ARRAY);
+	glColorPointer(3, GL_FLOAT, sizeof(GLfloat)*3, Colors);
+
+	glClear(GL_COLOR_BUFFER_BIT);
+
+	/* Draw a blue quad */
+	glBegin(GL_QUADS);
+	glColor3f(0, 0, 1);
+	glVertex2fv(&Vertices[0]);
+	glVertex2fv(&Vertices[2]);
+	glVertex2fv(&Vertices[4]);
+	glVertex2fv(&Vertices[6]);
+	glEnd();
+
+	/* OpenGL has to make sure that prior to the glDrawArrays call
+	 * all immediate mode rendering has landed.
+	 */
+
+	/* Draw a red quad */
+	glDrawArrays(GL_QUADS, 0, 4);
+
+	if (!piglit_check_gl_error(GL_NO_ERROR))
+		piglit_report_result(PIGLIT_FAIL);
+
+	/* Check for a red quad that is drawn last */
+	pass = piglit_probe_pixel_rgb(piglit_width/2, piglit_height/2, Colors)
+		&& pass;
+
+	glFinish();
+	piglit_present_results();
+
+	return pass ? PIGLIT_PASS : PIGLIT_FAIL;
+}
+
+void piglit_init(int argc, char **argv)
+{
+	piglit_require_gl_version(11);
+
+	piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE);
+
+	glDisable(GL_DEPTH_TEST);
+	glClearColor(0.0, 0.0, 0.0, 1.0);
+}
diff --git a/tests/opengl.py b/tests/opengl.py
index 544efe6ed..42e30df4d 100644
--- a/tests/opengl.py
+++ b/tests/opengl.py
@@ -643,6 +643,7 @@  with profile.test_list.group_manager(
     g(['dlist-fdo31590'])
     g(['draw-arrays-colormaterial'])
     g(['draw-copypixels-sync'])
+    g(['draw-flush-vertices'])
     g(['draw-pixel-with-texture'])
     g(['drawpix-z'])
     g(['draw-sync'])