[Piglit] [PATCH v2] egl Add new test of EGL_EXT_platform_device
Mathias Fröhlich
Mathias.Froehlich at gmx.net
Fri Aug 17 18:57:41 UTC 2018
Hi,
Sorry for the late replay.
I can also take a look at the mesa side but not before next week.
Nevertheless, I still have one more comment inline below:
On Tuesday, 14 August 2018 15:44:09 CEST Emil Velikov wrote:
> From: Emil Velikov <emil.velikov at collabora.com>
>
> Since the functionality is more or less identical to
> EGL_MESA_platform_surfaceless, the test with a copy of it.
>
> Changes, as listed in the test itself, include:
> - s/MESA_platform_surfaceless/EXT_platform_device/g
> - entrypoint handling - eglQueryDeviceStringEXT, eglQueryDevicesEXT and eglGetPlatformDisplayEXT
> - custom GetDisplay, based on eglQueryDevicesEXT
> - couple of s/PIGLIT_SKIP/PIGLIT_FAIL/
>
> v2: Use eglQueryDeviceStringEXT to get a DRM backed device (Mathias)
> Cc: Mathias Fröhlich <Mathias.Froehlich at gmx.net>
> Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
> ---
> Thanks for the help Mathias. The updated patch should work as you
> suggested.
> ---
> tests/egl/spec/CMakeLists.txt | 1 +
> .../CMakeLists.no_api.txt | 7 +
> .../egl_ext_platform_device/CMakeLists.txt | 1 +
> .../egl_ext_platform_device.c | 279 ++++++++++++++++++
> tests/opengl.py | 6 +
> 5 files changed, 294 insertions(+)
> create mode 100644 tests/egl/spec/egl_ext_platform_device/CMakeLists.no_api.txt
> create mode 100644 tests/egl/spec/egl_ext_platform_device/CMakeLists.txt
> create mode 100644 tests/egl/spec/egl_ext_platform_device/egl_ext_platform_device.c
>
> diff --git a/tests/egl/spec/CMakeLists.txt b/tests/egl/spec/CMakeLists.txt
> index 9324efcaf..f38a4f62b 100644
> --- a/tests/egl/spec/CMakeLists.txt
> +++ b/tests/egl/spec/CMakeLists.txt
> @@ -3,6 +3,7 @@ add_subdirectory (egl_ext_client_extensions)
> add_subdirectory (egl_ext_device_query)
> add_subdirectory (egl_ext_device_enumeration)
> add_subdirectory (egl_ext_device_drm)
> +add_subdirectory (egl_ext_platform_device)
> add_subdirectory (egl_ext_image_dma_buf_import_modifiers)
> add_subdirectory (egl_khr_create_context)
> add_subdirectory (egl_khr_get_all_proc_addresses)
> diff --git a/tests/egl/spec/egl_ext_platform_device/CMakeLists.no_api.txt b/tests/egl/spec/egl_ext_platform_device/CMakeLists.no_api.txt
> new file mode 100644
> index 000000000..6c1bbd2a1
> --- /dev/null
> +++ b/tests/egl/spec/egl_ext_platform_device/CMakeLists.no_api.txt
> @@ -0,0 +1,7 @@
> +link_libraries(
> + piglitutil
> +)
> +
> +piglit_add_executable(egl_ext_platform_device egl_ext_platform_device.c)
> +
> +# vim: ft=cmake:
> diff --git a/tests/egl/spec/egl_ext_platform_device/CMakeLists.txt b/tests/egl/spec/egl_ext_platform_device/CMakeLists.txt
> new file mode 100644
> index 000000000..144a306f4
> --- /dev/null
> +++ b/tests/egl/spec/egl_ext_platform_device/CMakeLists.txt
> @@ -0,0 +1 @@
> +piglit_include_target_api()
> diff --git a/tests/egl/spec/egl_ext_platform_device/egl_ext_platform_device.c b/tests/egl/spec/egl_ext_platform_device/egl_ext_platform_device.c
> new file mode 100644
> index 000000000..8d2db2381
> --- /dev/null
> +++ b/tests/egl/spec/egl_ext_platform_device/egl_ext_platform_device.c
> @@ -0,0 +1,279 @@
> +/*
> + * 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.
> + */
> +
> +
> +/* Note that this test is a mere copy with the following changes:
> + * - s/MESA_platform_surfaceless/EXT_platform_device/g
> + * - entrypoint handling - eglQueryDeviceStringEXT, eglQueryDevicesEXT and eglGetPlatformDisplayEXT
> + * - custom GetDisplay, based on eglQueryDevicesEXT
> + * - couple of s/PIGLIT_SKIP/PIGLIT_FAIL/
> + */
> +
> +#include "piglit-util.h"
> +#include "piglit-util-egl.h"
> +
> +/* Extension function pointers.
> + *
> + * Use prefix 'pegl' (piglit egl) instead of 'egl' to avoid collisions with
> + * prototypes in eglext.h. */
> +EGLSurface (*peglCreatePlatformPixmapSurfaceEXT)(EGLDisplay display, EGLConfig config,
> + void *native_pixmap, const EGLint *attrib_list);
> +EGLSurface (*peglCreatePlatformWindowSurfaceEXT)(EGLDisplay display, EGLConfig config,
> + void *native_window, const EGLint *attrib_list);
> +
> +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)
> +{
> + peglCreatePlatformPixmapSurfaceEXT = (void*)
> + eglGetProcAddress("eglCreatePlatformPixmapSurfaceEXT");
> + peglCreatePlatformWindowSurfaceEXT = (void*)
> + eglGetProcAddress("eglCreatePlatformWindowSurfaceEXT");
> +
> + peglQueryDeviceStringEXT = (void *)eglGetProcAddress("eglQueryDeviceStringEXT");
> + peglQueryDevicesEXT = (void *)eglGetProcAddress("eglQueryDevicesEXT");
> + peglGetPlatformDisplayEXT = (void *)eglGetProcAddress("eglGetPlatformDisplayEXT");
> +}
> +
> +static EGLDisplay *
> +get_device_display(void)
> +{
> +#define NDEVS 1024
> + EGLDeviceEXT devices[NDEVS];
> + EGLint i, num_devices;
> + const char *devstring;
> +
> + if (!peglQueryDevicesEXT(NDEVS, devices, &num_devices)) {
> + printf("Failed to get egl device\n");
> + piglit_report_result(PIGLIT_FAIL);
> + }
> + /* Use a DRM device, as the software one has some issues. */
> + for (i = 0; i < num_devices; i++) {
> + devstring = peglQueryDeviceStringEXT(devices[i], EGL_EXTENSIONS);
> + if (piglit_is_extension_in_string(devstring,
> + "EGL_EXT_device_drm")) {
> + return peglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT,
> + devices[i], NULL);
> + }
> + }
> + printf("Failed to get a drm backed, egl device\n");
> + piglit_report_result(PIGLIT_FAIL);
I would prefer to get a PIGLIT_SKIP if there is no device offering
EGL_EXT_device_drm is present.
I think its legal for a driver not to offer any device with this extension.
With that changed:
Reviewed-by: Mathias Fröhlich <mathias.froehlich at web.de>
best
Mathias
> +}
> +
> +static void
> +test_setup(EGLDisplay *dpy)
> +{
> + EGLint egl_major, egl_minor;
> +
> + piglit_require_egl_extension(EGL_NO_DISPLAY, "EGL_EXT_platform_device");
> +
> + *dpy = get_device_display();
> + if (*dpy == EGL_NO_DISPLAY) {
> + printf("failed to get EGLDisplay\n");
> + piglit_report_result(PIGLIT_FAIL);
> + }
> +
> + if (!eglInitialize(*dpy, &egl_major, &egl_minor)) {
> + printf("eglInitialize failed\n");
> + piglit_report_result(PIGLIT_FAIL);
> + }
> +}
> +
> +static enum piglit_result
> +test_initialize_display(void *test_data)
> +{
> + EGLDisplay dpy;
> +
> + test_setup(&dpy);
> +
> + eglTerminate(dpy);
> + return PIGLIT_PASS;
> +}
> +
> +/* Test that eglCreatePlatformWindowSurface fails with EGL_BAD_NATIVE_WINDOW.
> + *
> + * From the EGL_MESA_platform_surfaceless spec (v1):
> + *
> + * eglCreatePlatformWindowSurface fails when called with a <display>
> + * that belongs to the surfaceless platform. It returns
> + * EGL_NO_SURFACE and generates EGL_BAD_NATIVE_WINDOW. The
> + * justification for this unconditional failure is that the
> + * surfaceless platform has no native windows, and therefore the
> + * <native_window> parameter is always invalid.
> + */
> +static enum piglit_result
> +test_create_window(void *test_data)
> +{
> + EGLDisplay dpy;
> + EGLSurface surf;
> +
> + test_setup(&dpy);
> +
> + surf = peglCreatePlatformWindowSurfaceEXT(dpy, EGL_NO_CONFIG_KHR,
> + /*native_window*/ NULL,
> + /*attrib_list*/ NULL);
> + if (surf) {
> + printf("eglCreatePlatformWindowSurface incorrectly succeeded\n");
> + return PIGLIT_FAIL;
> + }
> +
> + if (!piglit_check_egl_error(EGL_BAD_NATIVE_WINDOW))
> + return PIGLIT_FAIL;
> +
> + eglTerminate(dpy);
> + return PIGLIT_PASS;
> +}
> +
> +/* Test that eglCreatePlatformPixmapSurface fails with EGL_BAD_NATIVE_PIXMAP.
> + *
> + * From the EGL_MESA_platform_surfaceless spec (v1):
> + *
> + * [Like eglCreatePlatformWindowSurface,] eglCreatePlatformPixmapSurface
> + * also fails when called with a <display> that belongs to the surfaceless
> + * platform. It returns EGL_NO_SURFACE and generates
> + * EGL_BAD_NATIVE_PIXMAP.
> + */
> +static enum piglit_result
> +test_create_pixmap(void *test_data)
> +{
> + EGLDisplay dpy;
> + EGLSurface surf;
> +
> + test_setup(&dpy);
> +
> + surf = peglCreatePlatformPixmapSurfaceEXT(dpy, EGL_NO_CONFIG_KHR,
> + /*native_pixmap*/ NULL,
> + /*attrib_list*/ NULL);
> + if (surf) {
> + printf("eglCreatePlatformPixmapSurface incorrectly succeeded\n");
> + return PIGLIT_FAIL;
> + }
> +
> + if (!piglit_check_egl_error(EGL_BAD_NATIVE_PIXMAP))
> + return PIGLIT_FAIL;
> +
> + eglTerminate(dpy);
> + return PIGLIT_PASS;
> +}
> +
> +/* Test that eglCreatePbufferSurface succeeds if given an EGLConfig with
> + * EGL_PBUFFER_BIT.
> + *
> + * From the EGL_MESA_platform_surfaceless spec (v1):
> + *
> + * The surfaceless platform imposes no platform-specific restrictions on the
> + * creation of pbuffers, as eglCreatePbufferSurface has no native surface
> + * parameter. [...] Specifically, if the EGLDisplay advertises an EGLConfig
> + * whose EGL_SURFACE_TYPE attribute contains EGL_PBUFFER_BIT, then the
> + * EGLDisplay permits the creation of pbuffers.
> + */
> +static enum piglit_result
> +test_create_pbuffer(void *test_data)
> +{
> + EGLDisplay dpy = EGL_NO_DISPLAY;
> + EGLConfig config = EGL_NO_CONFIG_KHR;
> + EGLint num_configs = 9999;
> + EGLSurface surf;
> +
> + const EGLint config_attrs[] = {
> + EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
> +
> + EGL_RED_SIZE, EGL_DONT_CARE,
> + EGL_GREEN_SIZE, EGL_DONT_CARE,
> + EGL_BLUE_SIZE, EGL_DONT_CARE,
> + EGL_ALPHA_SIZE, EGL_DONT_CARE,
> + EGL_DEPTH_SIZE, EGL_DONT_CARE,
> + EGL_STENCIL_SIZE, EGL_DONT_CARE,
> +
> + /* This is a bitmask that selects the rendering API (such as
> + * EGL_OPENGL_BIT and EGL_OPENGL_ES2_BIT). Accept any API,
> + * because we don't care.
> + */
> + EGL_RENDERABLE_TYPE, ~0,
> +
> + EGL_NONE,
> + };
> +
> + test_setup(&dpy);
> +
> + if (!eglChooseConfig(dpy, config_attrs, &config, 1, &num_configs)) {
> + printf("eglChooseConfig failed\n");
> + return PIGLIT_FAIL;
> + }
> +
> + if (num_configs == 0) {
> + printf("found no EGLConfig with EGL_PBUFFER_BIT\n");
> + return PIGLIT_FAIL;
> + }
> +
> + surf = eglCreatePbufferSurface(dpy, config, /*attribs*/ NULL);
> + if (!surf) {
> + printf("eglCreatePbufferSurface failed\n");
> + return PIGLIT_FAIL;
> + }
> +
> + eglDestroySurface(dpy, surf);
> + eglTerminate(dpy);
> + return PIGLIT_PASS;
> +}
> +
> +static const struct piglit_subtest subtests[] = {
> + { "initialize_display", "initialize_display", test_initialize_display },
> + { "create_window", "create_window", test_create_window },
> + { "create_pixmap", "create_pixmap", test_create_pixmap },
> + { "create_pbuffer", "create_pbuffer", test_create_pbuffer },
> + { 0 },
> +};
> +
> +int
> +main(int argc, char **argv)
> +{
> + enum piglit_result result = PIGLIT_SKIP;
> + const char **selected_names = NULL;
> + size_t num_selected = 0;
> +
> + /* 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 34213ac53..b95ac7eee 100644
> --- a/tests/opengl.py
> +++ b/tests/opengl.py
> @@ -4585,6 +4585,12 @@ with profile.test_list.group_manager(
> exclude_platforms=['glx']) as g:
> g(['egl_ext_device_drm'], 'conformance')
>
> +with profile.test_list.group_manager(
> + PiglitGLTest,
> + grouptools.join('spec', 'egl_ext_platform_device'),
> + exclude_platforms=['glx']) as g:
> + g(['egl_ext_platform_device'], 'conformance')
> +
> with profile.test_list.group_manager(
> PiglitGLTest,
> grouptools.join('spec', 'egl_mesa_device_software'),
>
More information about the Piglit
mailing list