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.veli...@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.froehl...@gmx.net> > Signed-off-by: Emil Velikov <emil.veli...@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.froehl...@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'), > _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/piglit