[Piglit] [PATCH 8/9] egl Add new test of EGL_EXT_platform_device

Mathias Fröhlich Mathias.Froehlich at gmx.net
Fri Aug 10 15:04:11 UTC 2018


On Friday, 3 August 2018 14:46:36 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
>  - eglQueryDevicesEXT and eglGetPlatformDisplayEXT entrypoing handling
>  - custom GetDisplay, based on eglQueryDevicesEXT
>  - couple of s/PIGLIT_SKIP/PIGLIT_FAIL/
> 
> Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
> ---
>  tests/egl/spec/CMakeLists.txt                 |   1 +
>  .../CMakeLists.no_api.txt                     |   7 +
>  .../egl_ext_platform_device/CMakeLists.txt    |   1 +
>  .../egl_ext_platform_device.c                 | 271 ++++++++++++++++++
>  tests/opengl.py                               |   6 +
>  5 files changed, 286 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..20d8312ec
> --- /dev/null
> +++ b/tests/egl/spec/egl_ext_platform_device/egl_ext_platform_device.c
> @@ -0,0 +1,271 @@
> +/*
> + * 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
> + *  - eglQueryDevicesEXT and eglGetPlatformDisplayEXT entrypoing handling
> + *  - 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);
> +
> +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");
> +
> +	peglQueryDevicesEXT = (void *)eglGetProcAddress("eglQueryDevicesEXT");
> +	peglGetPlatformDisplayEXT = (void *)eglGetProcAddress("eglGetPlatformDisplayEXT");
> +}
> +
> +static EGLDisplay *
> +get_device_display(void)
> +{
> +	EGLDeviceEXT devices[2];
> +	EGLint num_devices;
> +
> +	/* Use the 'second' device, where possible.
> +	 *
> +	 * On Mesa the first one is always a software one, which has some issues.
> +	 */
> +	if (!peglQueryDevicesEXT(2, devices, &num_devices) || num_devices < 1) {
> +		printf("Failed to get egl device\n");
> +		piglit_report_result(PIGLIT_FAIL);
> +	}
> +
> +	return peglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT,
> +			devices[num_devices - 1], NULL);


Hmm, can we avoid relying on the order of the devices returned in the array?
That is can we remove hard coding the 'second' device?
In an other test you iterate the available devices and only test the ones that
match certain device extensions.

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 1d73950da..f463fb019 100644
> --- a/tests/opengl.py
> +++ b/tests/opengl.py
> @@ -4578,6 +4578,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