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

Reply via email to