[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