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); +} + +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'), -- 2.18.0 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/piglit