<div dir="ltr"><div>Reviewed-by: Marek Olšák <<a href="mailto:marek.olsak@amd.com">marek.olsak@amd.com</a>></div><div><br></div><div>Marek<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Apr 10, 2019 at 5:10 AM <<a href="mailto:Mathias.Froehlich@gmx.net">Mathias.Froehlich@gmx.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">From: Mathias Fröhlich <<a href="mailto:mathias.froehlich@web.de" target="_blank">mathias.froehlich@web.de</a>><br>
<br>
Hi all,<br>
<br>
Below is a new test that should test the about to be arriving egl device<br>
extension. The test goes a bit further than just creating a context and<br>
destroying it as it clears and paints into the buffer and checks the result.<br>
<br>
This actually uncovers problems with the current egl implementation that<br>
also show up with the new device extension.<br>
<br>
Please review<br>
best<br>
<br>
Mathias<br>
<br>
<br>
<br>
The new test walks all available devices and makes sure that<br>
context creation works as well as painting a rectangle.<br>
<br>
Signed-off-by: Mathias Froehlich <<a href="mailto:Mathias.Froehlich@web.de" target="_blank">Mathias.Froehlich@web.de</a>><br>
---<br>
 tests/egl/spec/CMakeLists.txt                 |   1 +<br>
 .../egl_ext_device_base/CMakeLists.gl.txt     |   4 +<br>
 .../spec/egl_ext_device_base/CMakeLists.txt   |   1 +<br>
 .../egl_ext_device_base/egl_ext_device_base.c | 460 ++++++++++++++++++<br>
 tests/opengl.py                               |   6 +<br>
 5 files changed, 472 insertions(+)<br>
 create mode 100644 tests/egl/spec/egl_ext_device_base/CMakeLists.gl.txt<br>
 create mode 100644 tests/egl/spec/egl_ext_device_base/CMakeLists.txt<br>
 create mode 100644 tests/egl/spec/egl_ext_device_base/egl_ext_device_base.c<br>
<br>
diff --git a/tests/egl/spec/CMakeLists.txt b/tests/egl/spec/CMakeLists.txt<br>
index 378c8d725..45a681b28 100644<br>
--- a/tests/egl/spec/CMakeLists.txt<br>
+++ b/tests/egl/spec/CMakeLists.txt<br>
@@ -1,5 +1,6 @@<br>
 add_subdirectory (egl-1.4)<br>
 add_subdirectory (egl_ext_client_extensions)<br>
+add_subdirectory (egl_ext_device_base)<br>
 add_subdirectory (egl_ext_device_query)<br>
 add_subdirectory (egl_ext_device_enumeration)<br>
 add_subdirectory (egl_ext_device_drm)<br>
diff --git a/tests/egl/spec/egl_ext_device_base/CMakeLists.gl.txt b/tests/egl/spec/egl_ext_device_base/CMakeLists.gl.txt<br>
new file mode 100644<br>
index 000000000..2b65d07da<br>
--- /dev/null<br>
+++ b/tests/egl/spec/egl_ext_device_base/CMakeLists.gl.txt<br>
@@ -0,0 +1,4 @@<br>
+<br>
+piglit_add_executable(egl_ext_device_base egl_ext_device_base.c)<br>
+<br>
+# vim: ft=cmake:<br>
diff --git a/tests/egl/spec/egl_ext_device_base/CMakeLists.txt b/tests/egl/spec/egl_ext_device_base/CMakeLists.txt<br>
new file mode 100644<br>
index 000000000..144a306f4<br>
--- /dev/null<br>
+++ b/tests/egl/spec/egl_ext_device_base/CMakeLists.txt<br>
@@ -0,0 +1 @@<br>
+piglit_include_target_api()<br>
diff --git a/tests/egl/spec/egl_ext_device_base/egl_ext_device_base.c b/tests/egl/spec/egl_ext_device_base/egl_ext_device_base.c<br>
new file mode 100644<br>
index 000000000..445f4f61c<br>
--- /dev/null<br>
+++ b/tests/egl/spec/egl_ext_device_base/egl_ext_device_base.c<br>
@@ -0,0 +1,460 @@<br>
+/*<br>
+ * Copyright 2019 Mathias Fröhlich <<a href="mailto:Mathias.Froehlich@web.de" target="_blank">Mathias.Froehlich@web.de</a>>.<br>
+ *<br>
+ * Copyright 2018 Collabora, Ltd.<br>
+ *<br>
+ * Based on ext_mesa_platform_surfaceless.c which has<br>
+ * Copyright 2016 Google<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>
+<br>
+/*<br>
+ * Test that enumerates all egl devices and tries to create an offscreen buffer<br>
+ * for each device, does a bunch of gl calls on it and tears down the objects<br>
+ * on the device again.<br>
+ */<br>
+<br>
+#include <stdlib.h><br>
+<br>
+#include "piglit-util.h"<br>
+#include "piglit-util-egl.h"<br>
+#include "piglit-util-gl.h"<br>
+<br>
+<br>
+#define WIDTH 16<br>
+<br>
+<br>
+/* Extension function pointers.<br>
+ *<br>
+ * Use prefix 'pegl' (piglit egl) instead of 'egl' to avoid collisions with<br>
+ * prototypes in eglext.h.<br>
+ */<br>
+<br>
+const char *(*peglQueryDeviceStringEXT)(EGLDeviceEXT device, EGLint name);<br>
+EGLBoolean (*peglQueryDevicesEXT)(EGLint max_devices, EGLDeviceEXT *devices,<br>
+           EGLint *num_devices);<br>
+EGLDisplay (*peglGetPlatformDisplayEXT)(EGLenum platform, void *native_display,<br>
+           const EGLint *attrib_list);<br>
+<br>
+static void<br>
+init_egl_extension_funcs(void)<br>
+{<br>
+       peglQueryDeviceStringEXT = (void *)eglGetProcAddress("eglQueryDeviceStringEXT");<br>
+       peglQueryDevicesEXT = (void *)eglGetProcAddress("eglQueryDevicesEXT");<br>
+       peglGetPlatformDisplayEXT = (void *)eglGetProcAddress("eglGetPlatformDisplayEXT");<br>
+}<br>
+<br>
+<br>
+static enum piglit_result<br>
+commands()<br>
+{<br>
+       const GLfloat blue[3] = { 0, 0, 1 };<br>
+       const GLfloat red[3] = { 1, 0, 0 };<br>
+<br>
+       printf("GL Vendor: %s\n", glGetString(GL_VENDOR));<br>
+       printf("GL Renderer: %s\n", glGetString(GL_RENDERER));<br>
+       printf("GL Version: %s\n", glGetString(GL_VERSION));<br>
+<br>
+       glClearColor(blue[0], blue[1], blue[2], 1);<br>
+       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);<br>
+<br>
+       if (!piglit_probe_pixel_rgb(WIDTH/2, WIDTH/2, blue)) {<br>
+               printf("Pixel probe failed\n");<br>
+               return PIGLIT_FAIL;<br>
+       }<br>
+<br>
+       glColor3fv(red);<br>
+       piglit_draw_rect(-1, -1, 2, 2);<br>
+<br>
+       if (!piglit_probe_pixel_rgb(WIDTH/2, WIDTH/2, red)) {<br>
+               printf("Pixel probe failed\n");<br>
+               return PIGLIT_FAIL;<br>
+       }<br>
+<br>
+       if (!piglit_check_gl_error(0)) {<br>
+               printf("Got OpenGL errors\n");<br>
+               return PIGLIT_FAIL;<br>
+       }<br>
+<br>
+       return PIGLIT_PASS;<br>
+}<br>
+<br>
+<br>
+static enum piglit_result<br>
+commands_with_fbo()<br>
+{<br>
+       enum piglit_result result;<br>
+       GLuint fb, cb, db;<br>
+       GLenum status;<br>
+<br>
+       if (!piglit_is_extension_supported("GL_ARB_framebuffer_object")) {<br>
+               printf("No GL_ARB_framebuffer_object available\n");<br>
+               return PIGLIT_SKIP;<br>
+       }<br>
+<br>
+       glGenRenderbuffers(1, &cb);<br>
+       glBindRenderbuffer(GL_RENDERBUFFER, cb);<br>
+       glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, WIDTH, WIDTH);<br>
+       glBindRenderbuffer(GL_RENDERBUFFER, 0);<br>
+<br>
+       glGenRenderbuffers(1, &db);<br>
+       glBindRenderbuffer(GL_RENDERBUFFER, db);<br>
+       glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, WIDTH, WIDTH);<br>
+       glBindRenderbuffer(GL_RENDERBUFFER, 0);<br>
+<br>
+       glGenFramebuffers(1, &fb);<br>
+       glBindFramebuffer(GL_FRAMEBUFFER, fb);<br>
+       glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, cb);<br>
+       glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, db);<br>
+<br>
+       status = glCheckFramebufferStatus(GL_FRAMEBUFFER);<br>
+       if (status != GL_FRAMEBUFFER_COMPLETE) {<br>
+               printf("FBO incomplete status 0x%X\n", status);<br>
+               return PIGLIT_FAIL;<br>
+       }<br>
+<br>
+       glViewport(0, 0, WIDTH, WIDTH);<br>
+<br>
+       result = commands();<br>
+<br>
+       glDeleteFramebuffers(1, &fb);<br>
+       glDeleteRenderbuffers(1, &cb);<br>
+       glDeleteRenderbuffers(1, &db);<br>
+<br>
+       return result;<br>
+}<br>
+<br>
+<br>
+static enum piglit_result<br>
+pbuffer_test(EGLDisplay dpy)<br>
+{<br>
+       /* We are after desktop OpenGL - like requested in the config */<br>
+       if (!eglBindAPI(EGL_OPENGL_API)) {<br>
+               printf("Call to eglBindAPI() fails.\n");<br>
+               return PIGLIT_FAIL;<br>
+       }<br>
+<br>
+       /* Select an appropriate configuration */<br>
+       const EGLint configAttribs[] = {<br>
+               EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,<br>
+               EGL_BLUE_SIZE, 8,<br>
+               EGL_GREEN_SIZE, 8,<br>
+               EGL_RED_SIZE, 8,<br>
+               EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,<br>
+               EGL_NONE<br>
+       };<br>
+       EGLint numConfigs;<br>
+       EGLConfig config;<br>
+       if (!eglChooseConfig(dpy, configAttribs, &config, 1, &numConfigs)) {<br>
+               printf("Call to eglChooseConfig() fails.\n");<br>
+               return PIGLIT_FAIL;<br>
+       }<br>
+       if (numConfigs <= 0) {<br>
+               printf("Call to eglChooseConfig() gave zero configs.\n");<br>
+               return PIGLIT_SKIP;<br>
+       }<br>
+<br>
+       const EGLint pbufferAttribs[] = {<br>
+               EGL_WIDTH, WIDTH,<br>
+               EGL_HEIGHT, WIDTH,<br>
+               EGL_NONE<br>
+       };<br>
+       EGLSurface surf = eglCreatePbufferSurface(dpy, config, pbufferAttribs);<br>
+       if (surf == EGL_NO_SURFACE) {<br>
+               printf("Call to eglCreatePbufferSurface() fails.\n");<br>
+               return PIGLIT_FAIL;<br>
+       }<br>
+<br>
+       /* Create a context */<br>
+       EGLContext ctx = eglCreateContext(dpy, config, EGL_NO_CONTEXT, NULL);<br>
+       if (EGL_NO_CONTEXT == ctx) {<br>
+               printf("Call to eglCreateContext() fails.\n");<br>
+               return PIGLIT_FAIL;<br>
+       }<br>
+<br>
+       /* Make the context current */<br>
+       if (!eglMakeCurrent(dpy, surf, surf, ctx)) {<br>
+               printf("Call to eglMakeCurrent() fails.\n");<br>
+               return PIGLIT_FAIL;<br>
+       }<br>
+<br>
+       piglit_dispatch_default_init(PIGLIT_DISPATCH_GL);<br>
+<br>
+       /* Do the actual test */<br>
+       if (PIGLIT_FAIL == commands())<br>
+               return PIGLIT_FAIL;<br>
+<br>
+       if (!eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)) {<br>
+               printf("Call to eglMakeCurrent() fails.\n");<br>
+               return PIGLIT_FAIL;<br>
+       }<br>
+<br>
+       if (!eglDestroySurface(dpy, surf)) {<br>
+               printf("Call to eglDestroySurface() fails.\n");<br>
+               return PIGLIT_FAIL;<br>
+       }<br>
+<br>
+       return PIGLIT_PASS;<br>
+}<br>
+<br>
+<br>
+static enum piglit_result<br>
+surfaceless_test(EGLDisplay dpy)<br>
+{<br>
+       /* We are after desktop OpenGL - like requested in the config */<br>
+       if (!eglBindAPI(EGL_OPENGL_API)) {<br>
+               printf("Call to eglBindAPI() fails.\n");<br>
+               return PIGLIT_FAIL;<br>
+       }<br>
+<br>
+       if (!piglit_is_egl_extension_supported(dpy, "EGL_KHR_surfaceless_context")) {<br>
+               printf("No EGL_KHR_surfaceless_context available\n");<br>
+               return PIGLIT_SKIP;<br>
+       }<br>
+<br>
+       /* Select an appropriate configuration */<br>
+       const EGLint configAttribs[] = {<br>
+               EGL_SURFACE_TYPE, 0,<br>
+               EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,<br>
+               EGL_NONE<br>
+       };<br>
+       EGLint numConfigs;<br>
+       EGLConfig config;<br>
+       if (!eglChooseConfig(dpy, configAttribs, &config, 1, &numConfigs)) {<br>
+               printf("Call to eglChooseConfig() fails.\n");<br>
+               return PIGLIT_FAIL;<br>
+       }<br>
+       if (numConfigs <= 0) {<br>
+               printf("Call to eglChooseConfig() gave zero configs.\n");<br>
+               return PIGLIT_SKIP;<br>
+       }<br>
+<br>
+       /* Create a context */<br>
+       EGLContext ctx = eglCreateContext(dpy, config, EGL_NO_CONTEXT, NULL);<br>
+       if (EGL_NO_CONTEXT == ctx) {<br>
+               printf("Call to eglCreateContext() fails.\n");<br>
+               return PIGLIT_FAIL;<br>
+       }<br>
+<br>
+       /* Make the context current */<br>
+       if (!eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, ctx)) {<br>
+               printf("Call to eglMakeCurrent() fails.\n");<br>
+               return PIGLIT_FAIL;<br>
+       }<br>
+<br>
+       piglit_dispatch_default_init(PIGLIT_DISPATCH_GL);<br>
+<br>
+       /* Do the actual test */<br>
+       if (PIGLIT_FAIL == commands_with_fbo())<br>
+               return PIGLIT_FAIL;<br>
+<br>
+       if (!eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)) {<br>
+               printf("Call to eglMakeCurrent() fails.\n");<br>
+               return PIGLIT_FAIL;<br>
+       }<br>
+<br>
+       return PIGLIT_PASS;<br>
+}<br>
+<br>
+<br>
+static enum piglit_result<br>
+configless_test(EGLDisplay dpy)<br>
+{<br>
+       /* We are after desktop OpenGL - like requested in the config */<br>
+       if (!eglBindAPI(EGL_OPENGL_API)) {<br>
+               printf("Call to eglBindAPI() fails.\n");<br>
+               return PIGLIT_FAIL;<br>
+       }<br>
+<br>
+       if (!piglit_is_egl_extension_supported(dpy, "EGL_KHR_no_config_context")) {<br>
+               printf("No EGL_KHR_no_config_context available\n");<br>
+               return PIGLIT_SKIP;<br>
+       }<br>
+       if (!piglit_is_egl_extension_supported(dpy, "EGL_KHR_surfaceless_context")) {<br>
+               printf("No EGL_KHR_surfaceless_context available\n");<br>
+               return PIGLIT_SKIP;<br>
+       }<br>
+<br>
+       /* Create a context */<br>
+       EGLContext ctx = eglCreateContext(dpy, EGL_NO_CONFIG_KHR, EGL_NO_CONTEXT, NULL);<br>
+       if (EGL_NO_CONTEXT == ctx) {<br>
+               printf("Call to eglCreateContext() fails.\n");<br>
+               return PIGLIT_FAIL;<br>
+       }<br>
+<br>
+       /* Make the context current */<br>
+       if (!eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, ctx)) {<br>
+               printf("Call to eglMakeCurrent() fails.\n");<br>
+               return PIGLIT_FAIL;<br>
+       }<br>
+<br>
+       piglit_dispatch_default_init(PIGLIT_DISPATCH_GL);<br>
+<br>
+       /* Do the actual test */<br>
+       if (PIGLIT_FAIL == commands_with_fbo())<br>
+               return PIGLIT_FAIL;<br>
+<br>
+       if (!eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)) {<br>
+               printf("Call to eglMakeCurrent() fails.\n");<br>
+               return PIGLIT_FAIL;<br>
+       }<br>
+<br>
+       return PIGLIT_PASS;<br>
+}<br>
+<br>
+<br>
+static enum piglit_result<br>
+for_all_device_displays(enum piglit_result (*call)(EGLDisplay))<br>
+{<br>
+#define NDEVS 1024<br>
+       EGLDeviceEXT devices[NDEVS];<br>
+       EGLint i, num_devices;<br>
+       enum piglit_result result = PIGLIT_PASS;<br>
+<br>
+       if (!peglQueryDevicesEXT(NDEVS, devices, &num_devices)) {<br>
+               printf("Failed to get egl device\n");<br>
+               result = PIGLIT_FAIL;<br>
+       }<br>
+       if (num_devices <= 0) {<br>
+               printf("Failed to get at least one egl device\n");<br>
+               result = PIGLIT_FAIL;<br>
+       }<br>
+<br>
+       /* For all available devices */<br>
+       for (i = 0; i < num_devices; i++) {<br>
+               EGLDisplay dpy;<br>
+<br>
+               printf("------------------------------------------------\n");<br>
+               printf("Device #%d\n", i);<br>
+               printf("------------------------------------------------\n");<br>
+<br>
+               /* Get a display from the device */<br>
+               dpy = peglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT,<br>
+                                               devices[i], NULL);<br>
+               if (dpy == EGL_NO_DISPLAY) {<br>
+                       printf("Platform display shall not be EGL_NO_DISPLAY\n");<br>
+                       result = PIGLIT_FAIL;<br>
+                       continue;<br>
+               }<br>
+<br>
+               /* Initialize the display */<br>
+               EGLint major, minor;<br>
+               if (!eglInitialize(dpy, &major, &minor)) {<br>
+                       printf("Call to eglInitialize() failed\n");<br>
+                       result = PIGLIT_FAIL;<br>
+                       continue;<br>
+               }<br>
+<br>
+               /* Check the required EGL version */<br>
+               if (major < 1 || (major == 1 && minor < 4)) {<br>
+                       printf("Call to eglInitialize() returned too low version\n");<br>
+                       result = PIGLIT_FAIL;<br>
+               } else {<br>
+                       /* Do the actual test */<br>
+                       if (PIGLIT_FAIL == call(dpy))<br>
+                               result = PIGLIT_FAIL;<br>
+               }<br>
+<br>
+               /* Tear down the display */<br>
+               eglTerminate(dpy);<br>
+       }<br>
+<br>
+       return result;<br>
+}<br>
+<br>
+<br>
+static enum piglit_result<br>
+pbuffer_tests(void *test_data)<br>
+{<br>
+       printf("================================================\n");<br>
+       printf("=============== PBUFFER ========================\n");<br>
+       printf("================================================\n");<br>
+<br>
+       return for_all_device_displays(pbuffer_test);<br>
+}<br>
+<br>
+<br>
+static enum piglit_result<br>
+surfaceless_tests(void *test_data)<br>
+{<br>
+       printf("================================================\n");<br>
+       printf("=============== SURFACELESS ====================\n");<br>
+       printf("================================================\n");<br>
+<br>
+       return for_all_device_displays(surfaceless_test);<br>
+}<br>
+<br>
+<br>
+static enum piglit_result<br>
+configless_tests(void *test_data)<br>
+{<br>
+       printf("================================================\n");<br>
+       printf("=============== CONFIGLESS =====================\n");<br>
+       printf("================================================\n");<br>
+<br>
+       return for_all_device_displays(configless_test);<br>
+}<br>
+<br>
+<br>
+static const struct piglit_subtest subtests[] = {<br>
+       { "pbuffer_tests", "pbuffer_tests", pbuffer_tests },<br>
+       { "surfaceless_tests", "surfaceless_tests", surfaceless_tests },<br>
+       { "configless_tests", "configless_tests", configless_tests },<br>
+       { 0 },<br>
+};<br>
+<br>
+<br>
+int<br>
+main(int argc, char **argv)<br>
+{<br>
+       enum piglit_result result = PIGLIT_SKIP;<br>
+       const char **selected_names = NULL;<br>
+       size_t num_selected = 0;<br>
+<br>
+#if _POSIX_C_SOURCE >= 200112L<br>
+       unsetenv("DISPLAY");<br>
+#endif<br>
+<br>
+       piglit_require_egl_extension(EGL_NO_DISPLAY, "EGL_EXT_client_extensions");<br>
+       piglit_require_egl_extension(EGL_NO_DISPLAY, "EGL_EXT_device_base");<br>
+       piglit_require_egl_extension(EGL_NO_DISPLAY, "EGL_EXT_device_enumeration");<br>
+       piglit_require_egl_extension(EGL_NO_DISPLAY, "EGL_EXT_device_query");<br>
+       piglit_require_egl_extension(EGL_NO_DISPLAY, "EGL_EXT_platform_base");<br>
+       piglit_require_egl_extension(EGL_NO_DISPLAY, "EGL_EXT_platform_device");<br>
+<br>
+       /* Strip common piglit args. */<br>
+       piglit_strip_arg(&argc, argv, "-fbo");<br>
+       piglit_strip_arg(&argc, argv, "-auto");<br>
+<br>
+       piglit_parse_subtest_args(&argc, argv, subtests, &selected_names,<br>
+                                 &num_selected);<br>
+<br>
+       if (argc > 1) {<br>
+               fprintf(stderr, "usage error\n");<br>
+               piglit_report_result(PIGLIT_FAIL);<br>
+       }<br>
+<br>
+       init_egl_extension_funcs();<br>
+       result = piglit_run_selected_subtests(subtests, selected_names,<br>
+                                             num_selected, result);<br>
+<br>
+       piglit_report_result(result);<br>
+}<br>
diff --git a/tests/opengl.py b/tests/opengl.py<br>
index fb950d85d..93afdec8c 100644<br>
--- a/tests/opengl.py<br>
+++ b/tests/opengl.py<br>
@@ -4647,6 +4647,12 @@ with profile.test_list.group_manager(<br>
         exclude_platforms=['glx']) as g:<br>
     g(['egl_ext_platform_device'], 'conformance')<br>
<br>
+with profile.test_list.group_manager(<br>
+        PiglitGLTest,<br>
+        grouptools.join('spec', 'egl_ext_device_base'),<br>
+        exclude_platforms=['glx']) as g:<br>
+    g(['egl_ext_device_base'], 'conformance')<br>
+<br>
 with profile.test_list.group_manager(<br>
         PiglitGLTest,<br>
         grouptools.join('spec', 'egl_mesa_device_software'),<br>
--<br>
2.20.1<br>
<br>
</blockquote></div>