<div dir="ltr">On 25 October 2013 11:13, Ian Romanick <span dir="ltr"><<a href="mailto:idr@freedesktop.org" target="_blank">idr@freedesktop.org</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Ian Romanick <<a href="mailto:ian.d.romanick@intel.com" target="_blank">ian.d.romanick@intel.com</a>><br>
<br>
Verifies that all values from glXQueryRendererIntegerMESA,<br>
glXQueryCurrentRendererIntegerMESA, glXQueryRendererStringMESA, and<br>
glXQueryCurrentRendererStringMESA can be queried.  It also verifies that<br>
each of the Current and non-Current versions returns the same value for<br>
each query.<br>
<br>
Signed-off-by: Ian Romanick <<a href="mailto:ian.d.romanick@intel.com" target="_blank">ian.d.romanick@intel.com</a>><br>
---<br>
This test currently fails on Mesa master with the<br>
GLX_MESA_query_renderer patches on the mesa-dev list.  It appears that<br>
Adam's d101204 commit breaks some calls to glXMakeContextCurrent.  I'm<br>
tracking down the root cause of that problem now.  With that patch<br>
reverted, everything here passes.<br>
<br>
 tests/all.tests                                    |   4 +<br>
 tests/spec/CMakeLists.txt                          |   1 +<br>
 .../spec/glx_mesa_query_renderer/CMakeLists.gl.txt |  28 +++<br>
 tests/spec/glx_mesa_query_renderer/CMakeLists.txt  |   1 +<br>
 tests/spec/glx_mesa_query_renderer/coverage.c      | 275 +++++++++++++++++++++<br>
 5 files changed, 309 insertions(+)<br>
 create mode 100644 tests/spec/glx_mesa_query_renderer/CMakeLists.gl.txt<br>
 create mode 100644 tests/spec/glx_mesa_query_renderer/CMakeLists.txt<br>
 create mode 100644 tests/spec/glx_mesa_query_renderer/coverage.c<br>
<br>
diff --git a/tests/all.tests b/tests/all.tests<br>
index e5e63e4..1d2a916 100644<br>
--- a/tests/all.tests<br>
+++ b/tests/all.tests<br>
@@ -468,6 +468,10 @@ oml_sync_control['swapbuffersmsc-return swap_interval 0'] = concurrent_test('glx<br>
 oml_sync_control['swapbuffersmsc-return swap_interval 1'] = concurrent_test('glx-oml-sync-control-swapbuffersmsc-return 1')<br>
 oml_sync_control['waitformsc'] = concurrent_test('glx-oml-sync-control-waitformsc')<br>
<br>
+mesa_query_renderer = Group()<br>
+glx['GLX_MESA_query_renderer'] = mesa_query_renderer<br>
+mesa_query_renderer['coverage'] = concurrent_test('glx-query-renderer-coverage')<br>
+<br>
 def texwrap_test(args):<br>
     test = PlainExecTest(['texwrap', '-fbo', '-auto'] + args)<br>
     test.runConcurrent = True<br>
diff --git a/tests/spec/CMakeLists.txt b/tests/spec/CMakeLists.txt<br>
index 18b846d..a2903d8 100644<br>
--- a/tests/spec/CMakeLists.txt<br>
+++ b/tests/spec/CMakeLists.txt<br>
@@ -77,6 +77,7 @@ add_subdirectory (gles-2.0)<br>
 add_subdirectory (gles-3.0)<br>
 add_subdirectory (glx_arb_create_context)<br>
 add_subdirectory (glx_ext_import_context)<br>
+add_subdirectory (glx_mesa_query_renderer)<br>
 add_subdirectory (glx_oml_sync_control)<br>
 add_subdirectory (arb_vertex_type_2_10_10_10_rev)<br>
 add_subdirectory (ext_texture_array)<br>
diff --git a/tests/spec/glx_mesa_query_renderer/CMakeLists.gl.txt b/tests/spec/glx_mesa_query_renderer/CMakeLists.gl.txt<br>
new file mode 100644<br>
index 0000000..f51ceff<br>
--- /dev/null<br>
+++ b/tests/spec/glx_mesa_query_renderer/CMakeLists.gl.txt<br>
@@ -0,0 +1,28 @@<br>
+<br>
+include_directories(<br>
+       ${GLEXT_INCLUDE_DIR}<br>
+       ${OPENGL_INCLUDE_PATH}<br>
+)<br>
+<br>
+if(PIGLIT_BUILD_GLX_TESTS)<br>
+    link_libraries (<br>
+        piglitglxutil<br>
+    )<br>
+endif(PIGLIT_BUILD_GLX_TESTS)<br>
+<br>
+link_libraries (<br>
+       ${OPENGL_gl_LIBRARY}<br>
+       ${OPENGL_glu_LIBRARY}<br>
+)<br>
+<br>
+IF(PIGLIT_BUILD_GLX_TESTS)<br>
+       include_directories(<br>
+               ${GLPROTO_INCLUDE_DIRS}<br>
+       )<br>
+       link_libraries (<br>
+               ${X11_X11_LIB}<br>
+       )<br>
+       piglit_add_executable (glx-query-renderer-coverage coverage.c query-renderer-common.c)<br>
+ENDIF(PIGLIT_BUILD_GLX_TESTS)<br>
+<br>
+# vim: ft=cmake:<br>
diff --git a/tests/spec/glx_mesa_query_renderer/CMakeLists.txt b/tests/spec/glx_mesa_query_renderer/CMakeLists.txt<br>
new file mode 100644<br>
index 0000000..144a306<br>
--- /dev/null<br>
+++ b/tests/spec/glx_mesa_query_renderer/CMakeLists.txt<br>
@@ -0,0 +1 @@<br>
+piglit_include_target_api()<br>
diff --git a/tests/spec/glx_mesa_query_renderer/coverage.c b/tests/spec/glx_mesa_query_renderer/coverage.c<br>
new file mode 100644<br>
index 0000000..2f5367c<br>
--- /dev/null<br>
+++ b/tests/spec/glx_mesa_query_renderer/coverage.c<br>
@@ -0,0 +1,275 @@<br>
+/* Copyright © 2013 Intel Corporation<br>
+ *<br>
+ * Permission is hereby granted, free of charge, to any person obtaining a<br>
+ * copy of this software and associated documentation files (the "Software"),<br>
+ * to deal in the Software without restriction, including without limitation<br>
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,<br>
+ * and/or sell copies of the Software, and to permit persons to whom the<br>
+ * Software is furnished to do so, subject to the following conditions:<br>
+ *<br>
+ * The above copyright notice and this permission notice (including the next<br>
+ * paragraph) shall be included in all copies or substantial portions of the<br>
+ * Software.<br>
+ *<br>
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL<br>
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br>
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING<br>
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS<br>
+ * IN THE SOFTWARE.<br>
+ */<br>
+#include "piglit-util-gl-common.h"<br>
+#include "piglit-glx-util.h"<br>
+#include "query-renderer-common.h"<br>
+<br>
+struct test_vector {<br>
+       const char *name_string;<br>
+       int attribute;<br>
+       int value_count;<br>
+};<br>
+<br>
+#define ENUM(name, count) { # name, name, count }<br>
+<br>
+static const struct test_vector all_valid_integer_enums[] = {<br>
+        ENUM(GLX_RENDERER_VENDOR_ID_MESA, 1),<br>
+        ENUM(GLX_RENDERER_DEVICE_ID_MESA, 1),<br>
+        ENUM(GLX_RENDERER_VERSION_MESA, 3),<br>
+        ENUM(GLX_RENDERER_ACCELERATED_MESA, 1),<br>
+        ENUM(GLX_RENDERER_VIDEO_MEMORY_MESA, 1),<br>
+        ENUM(GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA, 1),<br>
+        ENUM(GLX_RENDERER_PREFERRED_PROFILE_MESA, 1),<br>
+        ENUM(GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA, 2),<br>
+        ENUM(GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA, 2),<br>
+        ENUM(GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA, 2),<br>
+        ENUM(GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA, 2),<br>
+};<br>
+<br>
+static const struct test_vector all_valid_string_enums[] = {<br>
+        ENUM(GLX_RENDERER_VENDOR_ID_MESA, 0),<br>
+        ENUM(GLX_RENDERER_DEVICE_ID_MESA, 0),<br>
+};<br>
+<br>
+static bool<br>
+verify_integer_values(const char *name, Bool success,<br>
+                     const struct test_vector *test,<br>
+                     const unsigned *buffer, unsigned buffer_size,<br>
+                     bool silent)<br>
+{<br>
+       char text[512];<br>
+       unsigned text_size;<br>
+       bool pass = true;<br>
+       unsigned j;<br>
+<br>
+       if (!success) {<br>
+               fprintf(stderr, "%s(%s) failed.\n", name, test->name_string);<br>
+<br>
+               /* If the call failed, don't bother checking that the correct<br>
+                * number of values were written.<br>
+                */<br>
+               return false;<br>
+       }<br>
+<br>
+       if (!silent) {<br>
+               text_size = snprintf(text, sizeof(text), "%s(%s) values:\n    ",<br>
+                                    name,<br>
+                                    test->name_string);<br>
+               for (j = 0; j < test->value_count; j++) {<br>
+                       text_size += snprintf(&text[text_size],<br>
+                                             sizeof(text) - text_size,<br>
+                                             "%d ",<br>
+                                             buffer[j]);<br>
+               }<br>
+<br>
+               printf("%s\n", text);<br>
+       }<br>
+<br>
+       for (j = 0; j < test->value_count; j++) {<br>
+               if (buffer[j] == 0xDEADBEEF) {<br>
+                       fprintf(stderr,<br>
+                               "%s(%s) only wrote %d values, expected %d.\n",<br>
+                               name,<br>
+                               test->name_string,<br>
+                               j + 1,<br></blockquote><div><br></div><div>This should just be "j".<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


+                               test->value_count);<br>
+                       pass = false;<br>
+                       break;<br>
+               }<br>
+       }<br>
+<br>
+       for (j = test->value_count; j < buffer_size; j++) {<br>
+               if (buffer[j] != 0xDEADBEEF) {<br>
+                       fprintf(stderr,<br>
+                               "%s(%s) only wrote %d values, expected %d.\n",<br>
+                               name,<br>
+                               test->name_string,<br>
+                               j + 1,<br>
+                               test->value_count);<br></blockquote><div><br></div><div>This is a misleading message, since you're not actually measuring the number of values that got written--you're just checking whether the values that *shouldn't* have been written are preserved.  How about printf("%s(%s) wrote more than %d values.", ..., test->value_count)?<br>

</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+                       pass = false;<br>
+                       break;<br>
+               }<br>
+       }<br></blockquote><div><br></div><div>Alternatively, you might want to consider restructuring this code so that it measures the number of values that got written, and then displays an error if that value doesn't equal test->value_count.<br>

</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
+       return pass;<br>
+}<br></blockquote><div><br></div><div>With that addressed, this patch is:<br><br>Reviewed-by: Paul Berry <<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>><br></div></div></div></div>