[Piglit] [PATCH] egl: Add tests for EGL_EXT_device_base v2.

Marek Olšák maraeo at gmail.com
Wed Apr 10 23:35:20 UTC 2019


Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Wed, Apr 10, 2019 at 5:10 AM <Mathias.Froehlich at gmx.net> wrote:

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


More information about the Piglit mailing list