<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>